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的Django框架可适配的各种数据库介绍
Jul 15 Python
Python计算字符宽度的方法
Jun 14 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
Python设计模式之模板方法模式实例详解
Jan 17 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
python中rb含义理解
Jun 18 Python
如何用python实现一个HTTP连接池
Jan 14 Python
python开发人人对战的五子棋小游戏
May 02 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
基于mysql的论坛(5)
2006/10/09 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
JavaScript实现开关等效果
2017/09/08 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
详解python的数字类型变量与其方法
2016/11/20 Python
python找出因数与质因数的方法
2019/07/25 Python
python全局变量引用与修改过程解析
2020/01/07 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
工业学校毕业生自荐书
2014/01/03 职场文书
物流业务员岗位职责
2014/02/08 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers