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 socket网络编程步骤详解(socket套接字使用)
Dec 06 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
python解决字符串倒序输出的问题
Jun 25 Python
pycharm安装和首次使用教程
Aug 27 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
Nov 06 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
对python实现二维函数高次拟合的示例详解
Dec 29 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
Dec 17 Python
pandas处理csv文件的方法步骤
Oct 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
用Socket发送电子邮件
2006/10/09 PHP
PHP中一个控制字符串输出的函数
2006/10/09 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php smarty模版引擎中的缓存应用
2009/12/11 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python通过select实现异步IO的方法
2015/06/04 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
几个Shell Script面试题
2012/08/31 面试题
python re模块和正则表达式
2021/03/24 Python
大学校庆邀请函
2014/01/11 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
生日寄语大全
2014/04/08 职场文书
安全生产大检查方案
2014/05/07 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
重阳节座谈会主持词
2015/07/03 职场文书
护士医德医风心得体会
2016/01/25 职场文书
关于Python使用turtle库画任意图的问题
2022/04/01 Python