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程序的循环的运行效率的原因
Apr 01 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
Python实现计算文件夹下.h和.cpp文件的总行数
Apr 23 Python
简单介绍Python中的readline()方法的使用
May 24 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
python实现Adapter模式实例代码
Feb 09 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
python实现数据分析与建模
Jul 11 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python动态强类型解释型语言原理解析
Mar 25 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 split()函数的用法详解
2013/06/05 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
form自动提交实例讲解
2017/07/10 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
微信小程序表单弹窗实例
2018/07/19 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
在Python中处理XML的教程
2015/04/29 Python
Django自定义认证方式用法示例
2017/06/23 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
家具厂厂长岗位职责
2014/01/01 职场文书
幼儿园托班开学寄语
2014/01/18 职场文书
军训口号
2014/06/13 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
记者节感言
2015/08/03 职场文书
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python