借助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重试装饰器示例
Feb 11 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
深入解析Python中的urllib2模块
Nov 13 Python
深入解析Python中的线程同步方法
Jun 14 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
详解Python发送email的三种方式
Oct 18 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
python通过移动端访问查看电脑界面
Jan 06 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
python求解汉诺塔游戏
Jul 09 Python
利用python清除移动硬盘中的临时文件
Oct 28 Python
python 实现图片裁剪小工具
Feb 02 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
php5 图片验证码实现代码
2009/12/11 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
php实现对象克隆的方法
2015/06/20 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python查找第k小元素代码分享
2013/12/18 Python
Python编程之属性和方法实例详解
2015/05/19 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
食品业务员岗位职责
2014/03/18 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
节约用水广告语60条
2019/11/14 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle