借助Paramiko通过Python实现linux远程登陆及sftp的操作


Posted in Python onMarch 16, 2020

paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。

本文重点给大家介绍借助Paramiko通过Python实现linux远程登陆及sftp操作。

1. 使用shell命令

$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"

然后你会发现,你的输出有很多你并不需要,但是又不去不掉的一些信息。
对于shell 命令,可以直接使用管道,或者将标准输出重定向到文件的方法取得执行结果。

2. 使用 subprocess

通过Python可以想到使用 os.popen,os.system,commands,subprocess 等一些命令执行库来间接获取系统信息 。这些库获取的 output 不仅有标准输出,还包含标准错误信息。所以每次都要对 output 进行数据清理,然后整理格式化,才能得到我们想要的数据。

import subprocess 
ssh_cmd = "sshpass -p ${passwd} ssh -p 22 -l root -o StrictHostKeyChecking=no xx.xx.xx.xx 'ls -l'" 
status, output = subprocess.getstatusoutput(ssh_cmd) 
# 数据清理

总之,间接使用ssh命令的几个问题:

需要额外安装 sshpass(如果不免密的话)
干扰信息太多,数据清理、格式化相当麻烦
代码实现不够优雅,可读性太差
ssh 连接不能复用,一次连接仅能执行一次命令
代码无法全平台,仅能在 Linux 和 OSX 上使用

3. 使用Paramiko

安装

python3 -m pip install paramiko

方法1:基于用户名和密码的 sshclient 方式登录

该方法无法复用ssh连接。

import paramiko 
ssh = paramiko.SSHClient() 
# 允许连接不在know_hosts文件中的主机 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
# 建立连接 
ssh.connect("xx.xx.xx.xx", username="root", port=22, password="you_password") 
# 使用这个连接执行命令 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
# 获取输出 
print(ssh_stdout.read()) 
# 关闭连接 
ssh.close()

方法2:基于用户名和密码的 transport 方式登录

该方法可以复用连接。

import paramiko 
# 建立连接 
trans = paramiko.Transport(("xx.xx.xx.xx", 22)) 
trans.connect(username="root", password="you_passwd") 
ssh = paramiko.SSHClient() 
ssh._transport = trans 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
print(ssh_stdout.read()) 
# 关闭连接 
trans.close()

方法3:基于公钥的 SSHClient 方式登录

该方法无法复用ssh连接。

import paramiko 
# 指定本地的RSA私钥文件 
# 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。
pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
# 建立连接 
ssh = paramiko.SSHClient() 
ssh.connect(hostname='xx.xx.xx.xx', 
      port=22, 
      username='you_username', 
      pkey=pkey) 
# 执行命令 
stdin, stdout, stderr = ssh.exec_command('ls -l') 
# 结果放到stdout中,如果有错误将放到stderr中 
print(stdout.read()) 
# 关闭连接 
ssh.close()

方法4:基于公钥的 Transport 方式登录

该方法可以复用连接。

import paramiko 
# 指定本地的RSA私钥文件 
# 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。 
pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
# 建立连接 
trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
trans.connect(username='you_username', pkey=pkey) 
ssh = paramiko.SSHClient() 
ssh._transport = trans 
# 执行命令,和传统方法一样 
stdin, stdout, stderr = ssh.exec_command('df -hl') 
print(stdout.read().decode()) 
# 关闭连接 
trans.close()

sftp 文件传输

import paramiko 
trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
# 建立连接 
trans.connect(username='you_username', password='you_passwd') 
# 实例化一个 sftp对象,指定连接的通道 
sftp = paramiko.SFTPClient.from_transport(trans) 
# 发送文件 
sftp.put(localpath='/tmp/11.txt', remotepath='/tmp/22.txt') 
# 下载文件 
sftp.get(remotepath='/tmp/22.txt', localpath='/tmp/33.txt') 
trans.close()

参考

https://www.linuxprobe.com/log-in-to-remote-service-python.html

总结

到此这篇关于借助Paramiko通过Python实现linux远程登陆及sftp的操作的文章就介绍到这了,更多相关python paramiko实现远程登陆 sftp内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python解析文件示例
Jan 23 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
python3+PyQt5实现拖放功能
Apr 24 Python
python中的json总结
Oct 11 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
python原类、类的创建过程与方法详解
Jul 19 Python
python-numpy-指数分布实例详解
Dec 07 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
pytest进阶教程之fixture函数详解
Mar 29 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 Python
Django ValuesQuerySet转json方式
Mar 16 #Python
Django 再谈一谈json序列化
Mar 16 #Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 #Python
Python读写操作csv和excle文件代码实例
Mar 16 #Python
django模型动态修改参数,增加 filter 字段的方式
Mar 16 #Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 #Python
python高阶函数map()和reduce()实例解析
Mar 16 #Python
You might like
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
mayfish 数据入库验证代码
2010/04/30 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
王纯业的Python学习笔记 下载
2007/02/10 Python
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
利用python代码写的12306订票代码
2015/12/20 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
Python3匿名函数用法示例
2018/07/25 Python
python与字符编码问题
2019/05/24 Python
python自动化之Ansible的安装教程
2019/06/13 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
厨房工作人员岗位职责
2013/11/15 职场文书
办公室副主任岗位职责
2013/11/25 职场文书
综合测评个人总结
2015/03/03 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis