借助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多进程机制实例详解
Jul 02 Python
Python中方法链的使用方法
Feb 23 Python
Python 高级专用类方法的实例详解
Sep 11 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
Python实现的桶排序算法示例
Nov 29 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
Python中低维数组填充高维数组的实现
Dec 02 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
python collections模块的使用
Oct 16 Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 Python
如何利用python实现Simhash算法
Jun 28 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
PHP iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
优化PHP程序的方法小结
2012/02/23 PHP
简单的php文件上传(实例)
2013/10/27 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
PHP实现计算器小功能
2020/08/28 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
行政专员工作职责
2013/12/22 职场文书
成绩单家长评语大全
2014/04/16 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技