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 相关文章推荐
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
Python实现的简单dns查询功能示例
May 24 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
Python基础之函数的定义与使用示例
Mar 23 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
python如何实现递归转非递归
Feb 25 Python
FP-growth算法发现频繁项集——构建FP树
Jun 24 Python
Python中的嵌套循环详情
Mar 23 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
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
python抽象基类用法实例分析
2015/06/04 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
Python实现学校管理系统
2018/01/11 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
python交互界面的退出方法
2019/02/16 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
Python 切分数组实例解析
2019/11/07 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
在校学生职业规划范文
2014/01/08 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers