Python如何使用paramiko模块连接linux


Posted in Python onMarch 18, 2020

python程序需要连接linux时,需要使用密码或者秘钥验证以登录os进行命令操作或者文件传输,python中实现此功能的模块为paramiko;下面是该模块的基础用法

下面是通过密码进行linux登录执行命令和文件传输示例

import paramiko
#python程序需要批量管理linux时需要借助paramilo模块登录linux执行命令或者传输文件,下面是最简单的登录主机执行命令
ssh_client = paramiko.SSHClient() #创建连接对象
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机,首次登陆其它机器时会用到
ssh_client.connect(hostname="192.168.226.128", port=22, username="root", password="123456") #使用用户名密码连接主机
stdin, stdout, stderr = ssh_client.exec_command("df -h") #执行命令获取结果
#获取命令结果
res,err = stdout.read(),stderr.read()
result = res if res else err  ##这里我们使用三元运算
print(result.decode(encoding="utf-8"))
ssh_client.close() #关闭ssh


#下面是传输文件
transport = paramiko.Transport(("192.168.226.128", 22))
transport.connect(username="root", password="123456")
my_sftp = paramiko.SFTPClient.from_transport(transport)
my_sftp.put("__init__.py", "/root/123.tst") #__init__.py是本地文件名,其它目录需要写绝对路径形式, /root/123.tst上传到128的root目录且命名为123.tst
my_sftp.get("/root/hello.py", "hello_get.py") #将远端的hello.py 下载到本地当前目录且重命名为hello_get.py
transport.close()

代码中出现明文密码是不安全也不符合编程规范的,为了更加安全我们可使用秘钥来进行登录。

首先两台linux机器进行如下操作后就可以实现192.168.226.128免密登录192.168.226.129

1、正常条件下128主机ssh连接129机器整个过程如下,需要数据密码

Python如何使用paramiko模块连接linux

2、输入ssh-keygen后,所有命令直接回车,在登录用户家目录下.ssh目录下会生成id_rsa和id_rsa.pub两个文件,其中id_rsa是私钥id_rsa.pub是公钥

Python如何使用paramiko模块连接linux

3、ssh-copy-id命令可以将本地公钥拷贝到129主机的root用户家目录下的authorized_keys文件里

Python如何使用paramiko模块连接linux

Python如何使用paramiko模块连接linux

3、此时128就可以免密登录129了,但是129不能免密登录128;如果需要则129需要进行与128相同的操作。可以免密是128的id_rsa与129对应用户的authorized_keys文件内的公钥能够校验成功

Python如何使用paramiko模块连接linux

4、对应的如果当前只进行上述操作,此时win机器可以通过128的id_rsa实现免密登录129机器,具体实现如下

import paramiko
#python程序需要批量管理linux时需要借助paramilo模块登录linux执行命令或者传输文件,下面是最简单的登录主机执行命令
private_key = paramiko.RSAKey.from_private_key_file("id_rsa")
ssh = paramiko.SSHClient() #创建连接对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机
ssh.connect(hostname="192.168.226.129", port=22, username="root", pkey=private_key) #使用用户名密码连接主机
stdin, stdout, stderr = ssh.exec_command("df -h") #执行命令获取结果
#获取命令结果
res,err = stdout.read(),stderr.read()
result = res if res else err  ##这里我们使用三元运算
print(result.decode(encoding="utf-8"))
ssh.close() #关闭ssh


#下面是传输文件
transport = paramiko.Transport(("192.168.226.129", 22))
transport.connect(username="root", pkey=private_key)
my_sftp = paramiko.SFTPClient.from_transport(transport)
my_sftp.put("__init__.py", "/root/123.tst")
my_sftp.get("/root/hello.py", "hello_get129.py")
transport.close()

注意:

1、此时虽然有128的私钥,但是无法免密登录128,登录时会报认证失败,paramiko.ssh_exception.AuthenticationException: Authentication failed;此时还只能通过密码登录128或者通过将129生成的公钥拷贝给128使用129私钥登录128。

2、不能使用128的公钥来登录129,此时win机器模拟的是128免密登录129当然需要使用128的私钥了,否则无法和129本地文件内128的公钥无法配对;使用公钥登录129 会报不合法的私钥文件paramiko.ssh_exception.SSHException: not a valid RSA private key file

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python检测手机QQ在线状态的脚本代码
Feb 10 Python
以一段代码为实例快速入门Python2.7
Mar 31 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
Python Gitlab Api 使用方法
Aug 28 Python
pytest中文文档之编写断言
Sep 12 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Pytorch中实现只导入部分模型参数的方式
Jan 02 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
python将图片转为矢量图的方法步骤
Mar 30 Python
教你如何使用Python实现二叉树结构及三种遍历
Jun 18 Python
Python selenium页面加载慢超时的解决方案
Mar 18 #Python
Python Selenium 设置元素等待的三种方式
Mar 18 #Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 #Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 #Python
Python中remove漏删和索引越界问题的解决
Mar 18 #Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 #Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 #Python
You might like
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
小程序云开发实战小结
2018/10/25 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Python易忽视知识点小结
2015/05/25 Python
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
Django自定义分页效果
2017/06/27 Python
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
python enumerate内置函数用法总结
2020/01/07 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
Python实现微信表情包炸群功能
2021/01/28 Python
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
C#实现启动一个进程
2016/10/01 面试题
涉密人员保密承诺书
2014/05/28 职场文书
买房子个人收入证明
2014/10/12 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
财务工作失误检讨书
2015/02/19 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
Python实战之实现康威生命游戏
2021/04/26 Python
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python