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检查序列seq是否含有aset中项的方法
Jun 30 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
python奇偶行分开存储实现代码
Mar 19 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
python 设置输出图像的像素大小方法
Jul 04 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
Oct 24 Python
tensorflow 变长序列存储实例
Jan 20 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
python实现调用摄像头并拍照发邮箱
Apr 27 Python
pytorch 一行代码查看网络参数总量的实现
May 12 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 Memcached应用实现代码
2010/02/08 PHP
php二分查找二种实现示例
2014/03/12 PHP
PHP经典面试题集锦
2015/03/19 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
php实现评论回复删除功能
2017/05/23 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
常用的javascript设计模式
2017/01/11 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
pytorch中的inference使用实例
2020/02/20 Python
如何验证python安装成功
2020/07/06 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
自我鉴定写作要点
2014/01/17 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
辞职信格式范文
2015/05/13 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers