借助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学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
python3音乐播放器简单实现代码
Apr 20 Python
Python实现的读写json文件功能示例
Jun 05 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
用Python解数独的方法示例
Oct 24 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
python实现文字版扫雷
Apr 24 Python
python 基于wx实现音乐播放
Nov 24 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
用Python写一个简易版弹球游戏
Apr 13 Python
Python 文本滚动播放器的实现代码
Apr 25 Python
Python使用Web框架Flask开发项目
Jun 01 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
国内咖啡文化
2021/03/03 咖啡文化
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
img标签中onerror用法
2009/08/13 Javascript
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
canvas的神奇用法
2017/02/03 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python KMeans聚类问题分析
2018/02/23 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
Python通过文本和图片生成词云图
2020/05/21 Python
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
地心历险记观后感
2015/06/15 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
为什么RedisCluster设计成16384个槽
2021/09/25 Redis