借助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 基础学习第二弹 类属性和实例属性
Aug 27 Python
Python实现去除代码前行号的方法
Mar 10 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
python安装教程 Pycharm安装详细教程
May 02 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
详解Python之unittest单元测试代码
Jan 24 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
Python换行与不换行的输出实例
Feb 19 Python
python 爬取华为应用市场评论
May 29 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开发过程中关于继承的使用方法分享
2011/06/17 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
PHP二维数组去重算法
2016/12/17 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
js动态生成表格(节点操作)
2021/01/12 Javascript
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
Python箱型图处理离群点的例子
2019/12/09 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
肯尼迪就职演说稿
2013/12/31 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
PHP获取学生成绩的方法
2021/11/17 PHP
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL