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使用Supervisor来管理进程的方法
May 28 Python
Python Property属性的2种用法
Jun 21 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
Python随机数random模块使用指南
Sep 09 Python
python 生成器协程运算实例
Sep 04 Python
详解python中asyncio模块
Mar 03 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
详解python单元测试框架unittest
Jul 02 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
Jan 10 Python
Python csv文件记录流程代码解析
Jul 16 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
ucenter中词语过滤原理分析
2016/07/13 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
JS实现页面打印功能
2017/03/16 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
python中的多线程实例教程
2014/08/27 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
Python extract及contains方法代码实例
2020/09/11 Python
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
心得体会怎么写
2013/12/30 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
2014年法务工作总结
2014/12/11 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python