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 描述符(Descriptor)入门
Nov 20 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 Python
详解python里的命名规范
Jul 16 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
python面向对象 反射原理解析
Aug 12 Python
Python数据正态性检验实现过程
Apr 18 Python
详解python内置模块urllib
Sep 09 Python
python pyhs2 的安装操作
Apr 07 Python
python实战之用emoji表情生成文字
May 08 Python
Python 数据可视化之Matplotlib详解
Nov 02 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
浅析PHP水印技术
2007/02/14 PHP
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
关于vue面试题汇总
2018/03/20 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
python实现诗歌游戏(类继承)
2019/02/26 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
Python爬取梨视频的示例
2021/01/29 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
几个MySql的面试题
2013/04/22 面试题
公司综合部的成员自我评价分享
2013/11/05 职场文书
大学生英语演讲稿
2014/04/24 职场文书
自强之星事迹材料
2014/05/12 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
画展邀请函
2015/01/31 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python
Go归并排序算法的实现方法
2022/04/06 Golang
vue组件vue-esign实现电子签名
2022/04/21 Vue.js