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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
基于Python的身份证号码自动生成程序
Aug 15 Python
深入解析Python中的WSGI接口
May 11 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 Python
python装饰器深入学习
Apr 06 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
python学生信息管理系统实现代码
Dec 17 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
Mar 24 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
Apr 20 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 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访问查询mysql数据的三种方法
2006/10/09 PHP
实用函数2
2007/11/08 PHP
phpQuery占用内存过多的处理方法
2013/11/13 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
JQuery 常用操作代码
2010/03/14 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
Jquery根据浏览器窗口改变调整大小的方法
2017/02/07 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
JS异步错误捕获的一些事小结
2019/04/26 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
简洁的十分钟Python入门教程
2015/04/03 Python
浅析使用Python操作文件
2017/07/31 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
初中生学习生活的自我评价
2013/11/20 职场文书
python神经网络编程之手写数字识别
2021/05/08 Python