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群发邮件实例代码
Jan 03 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
简单解决Python文件中文编码问题
Nov 22 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
Jan 02 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
为什么是 Python -m
Jun 19 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
Python-openCV开运算实例
Jul 05 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
Python中过滤字符串列表的方法
Dec 22 Python
Python3中的tuple函数知识点讲解
Jan 03 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
降低PHP Redis内存占用
2017/03/23 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
解释&&和||在javascript中的另类用法
2014/07/28 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
小谈angular ng deploy的实现
2020/04/07 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
Python爬豆瓣电影实例
2018/02/23 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
接口中的方法可以是abstract的吗
2015/07/23 面试题
static函数与普通函数有什么区别
2015/12/25 面试题
中专生毕业自我鉴定
2013/11/01 职场文书
会计专业毕业生推荐信
2013/11/05 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
活动经费申请报告
2015/05/15 职场文书
关于童年的读书笔记
2015/06/26 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis