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操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 Python
Python 模块EasyGui详细介绍
Feb 19 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
python如何爬取动态网站
Sep 09 Python
Python request post上传文件常见要点
Nov 20 Python
教你怎么用Python监控愉客行车程
Apr 29 Python
python编程实现清理微信重复缓存文件
Nov 01 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+ajax 无刷新删除数据
2010/02/20 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
JS上传前预览图片实例
2013/03/25 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
公司端午节活动方案
2014/02/04 职场文书
文字自荐书范文
2014/02/10 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
项目申请汇报材料
2014/08/16 职场文书
小学优秀学生评语
2014/12/29 职场文书
社区活动总结范文
2015/05/07 职场文书
民事调解书范文
2015/05/20 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
小学三年级作文之写景
2019/11/05 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang