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 相关文章推荐
python3.3使用tkinter开发猜数字游戏示例
Mar 14 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
Python设计模式之工厂模式简单示例
Jan 09 Python
Python实现自动上京东抢手机
Feb 06 Python
Django中url的反向查询的方法
Mar 14 Python
python使用knn实现特征向量分类
Dec 26 Python
Python3简单实现串口通信的方法
Jun 12 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 Python
python用类实现文章敏感词的过滤方法示例
Oct 27 Python
python set集合使用方法解析
Nov 05 Python
怎么快速自学python
Jun 22 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
PHP学习之数组的定义和填充
2011/04/17 PHP
PHP Directory 函数的详解
2013/03/07 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
PHP强制转化的形式整理
2020/05/22 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
Jquery弹出窗口插件 LeanModal的使用方法
2012/03/10 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
JS Math对象与Math方法实例小结
2019/07/05 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
python实现聊天小程序
2018/03/13 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Python 绘制可视化折线图
2020/07/22 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
公司活动邀请函
2014/01/24 职场文书
新闻专业学生的自我评价
2014/02/13 职场文书
房产转让协议书
2014/04/11 职场文书
加入学生会演讲稿
2014/04/24 职场文书
军事博物馆观后感
2015/06/05 职场文书
2016入党心得体会范文
2016/01/06 职场文书
Django框架中视图的用法
2022/06/10 Python