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笔记(叁)继续学习
Oct 24 Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
python获取指定路径下所有指定后缀文件的方法
May 26 Python
Django框架多表查询实例分析
Jul 04 Python
python多线程抽象编程模型详解
Mar 20 Python
python 字符串常用函数详解
Sep 11 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 Python
python 贪心算法的实现
Sep 18 Python
python两种注释用法的示例
Oct 09 Python
Python time库的时间时钟处理
May 02 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 Python
Python中requests库的用法详解
Jun 05 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&mysql 日期操作小记
2012/02/27 PHP
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
python批量下载抖音视频
2019/06/17 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
python实现人工蜂群算法
2020/09/18 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
家具厂厂长岗位职责
2014/01/01 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
数学教学随笔感言
2014/02/17 职场文书
六一亲子活动总结
2014/07/01 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
2014年材料员工作总结
2014/11/19 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记