Python Paramiko实现sftp文件上传下载以及远程执行命令
一、简介
Paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令、文件传输等功能。
安装模块
默认Python没有自带,需要手动安装:
pip3 install paramiko
二、上传文件
#!/usr/bin/env python3
# coding: utf-8
import paramiko def sftp_upload_file(host,user,password,server_path, local_path,timeout=10):
"""
上传文件,注意:不支持文件夹
:param host: 主机名
:param user: 用户名
:param password: 密码
:param server_path: 远程路径,比如:/home/sdn/tmp.txt
:param local_path: 本地路径,比如:D:/text.txt
:param timeout: 超时时间(默认),必须是int类型
:return: bool
"""
try:
t = paramiko.Transport((host, 22))
t.banner_timeout = timeout
t.connect(username=user, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(local_path, server_path)
t.close()
return True
except Exception as e:
print(e)
return False
测试一下上传,完整代码如下:
#!/usr/bin/env python3
# coding: utf-8
import paramiko def sftp_upload_file(host, user, password, server_path, local_path, timeout=10):
"""
上传文件,注意:不支持文件夹
:param host: 主机名
:param user: 用户名
:param password: 密码
:param server_path: 远程路径,比如:/home/sdn/tmp.txt
:param local_path: 本地路径,比如:D:/text.txt
:param timeout: 超时时间(默认),必须是int类型
:return: bool
"""
try:
t = paramiko.Transport((host, 22))
t.banner_timeout = timeout
t.connect(username=user, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(local_path, server_path)
t.close()
return True
except Exception as e:
print(e)
return False if __name__ == '__main__':
host = '192.168.10.1'
user = 'xiao'
password = 'xiao@1234' server_path = '/tmp/tmp.txt'
local_path = 'D:/text.txt'
res = sftp_upload_file(host, user, password, server_path, local_path)
if not res:
print("上传文件: %s 失败"%local_path)
else:
print("上传文件: %s 成功" % local_path)
执行输出:
上传文件: D:/text.txt 成功
三、下载文件
def sftp_down_file(host,user,password,server_path, local_path,timeout=10):
"""
下载文件,注意:不支持文件夹
:param host: 主机名
:param user: 用户名
:param password: 密码
:param server_path: 远程路径,比如:/home/sdn/tmp.txt
:param local_path: 本地路径,比如:D:/text.txt
:param timeout: 超时时间(默认),必须是int类型
:return: bool
"""
try:
t = paramiko.Transport((host,22))
t.banner_timeout = timeout
t.connect(username=user,password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get(server_path, local_path)
t.close()
return True
except Exception as e:
print(e)
return False
测试一下,下载文件功能,完整代码如下:
#!/usr/bin/env python3
# coding: utf-8
import paramiko def sftp_down_file(host,user,password,server_path, local_path,timeout=10):
"""
下载文件,注意:不支持文件夹
:param host: 主机名
:param user: 用户名
:param password: 密码
:param server_path: 远程路径,比如:/home/sdn/tmp.txt
:param local_path: 本地路径,比如:D:/text.txt
:param timeout: 超时时间(默认),必须是int类型
:return: bool
"""
try:
t = paramiko.Transport((host,22))
t.banner_timeout = timeout
t.connect(username=user,password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get(server_path, local_path)
t.close()
return True
except Exception as e:
print(e)
return False if __name__ == '__main__':
host = '192.168.10.1'
user = 'xiao'
password = 'xiao@1234' server_path = '/tmp/tmp.txt'
local_path = 'D:/text.txt'
res = sftp_down_file(host, user, password, server_path, local_path)
if not res:
print("下载文件: %s 失败"%server_path)
else:
print("下载文件: %s 成功" % server_path)
执行输出:
下载文件: /tmp/tmp.txt 成功
四、远程执行命令
def ssh_exec_command(host,user,password, cmd,timeout=10):
"""
使用ssh连接远程服务器执行命令
:param host: 主机名
:param user: 用户名
:param password: 密码
:param cmd: 执行的命令
:param seconds: 超时时间(默认),必须是int类型
:return: dict
"""
result = {'status': 1, 'data': None} # 返回结果
try:
ssh = paramiko.SSHClient() # 创建一个新的SSHClient实例
ssh.banner_timeout = timeout
# 设置host key,如果在"known_hosts"中没有保存相关的信息, SSHClient 默认行为是拒绝连接, 会提示yes/no
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, 22, user, password, timeout=timeout) # 连接远程服务器,超时时间1秒
stdin, stdout, stderr = ssh.exec_command(cmd,get_pty=True,timeout=timeout) # 执行命令
out = stdout.readlines() # 执行结果,readlines会返回列表
# 执行状态,0表示成功,1表示失败
channel = stdout.channel
status = channel.recv_exit_status()
ssh.close() # 关闭ssh连接 # 修改返回结果
result['status'] = status
result['data'] = out
return result
except Exception as e:
print(e)
print("错误, 登录服务器或者执行命令超时!!! ip: {} 命令: {}".format(ip,cmd))return False
测试一下,远程执行命令功能,完整代码如下:
#!/usr/bin/env python3
# coding: utf-8
import paramiko def ssh_exec_command(host,user,password, cmd,timeout=10):
"""
使用ssh连接远程服务器执行命令
:param host: 主机名
:param user: 用户名
:param password: 密码
:param cmd: 执行的命令
:param seconds: 超时时间(默认),必须是int类型
:return: dict
"""
result = {'status': 1, 'data': None} # 返回结果
try:
ssh = paramiko.SSHClient() # 创建一个新的SSHClient实例
ssh.banner_timeout = timeout
# 设置host key,如果在"known_hosts"中没有保存相关的信息, SSHClient 默认行为是拒绝连接, 会提示yes/no
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, 22, user, password, timeout=timeout) # 连接远程服务器,超时时间1秒
stdin, stdout, stderr = ssh.exec_command(cmd,get_pty=True,timeout=timeout) # 执行命令
out = stdout.readlines() # 执行结果,readlines会返回列表
# 执行状态,0表示成功,1表示失败
channel = stdout.channel
status = channel.recv_exit_status()
ssh.close() # 关闭ssh连接 # 修改返回结果
result['status'] = status
result['data'] = out
return result
except Exception as e:
print(e)
print("错误, 登录服务器或者执行命令超时!!! ip: {} 命令: {}".format(ip,cmd))
return False if __name__ == '__main__':
host = '192.168.10.1'
user = 'xiao'
password = 'xiao@1234' cmd = "cat /etc/issue | awk '{print $1,$2,$3}'"
res = ssh_exec_command(host, user, password, cmd)
# print(res)
if not res or not res['data'] or res['status'] != 0:
print("错误, ip: {} 执行命令: {} 失败".format(host, cmd), "red")
exit() value = res['data'][0].strip() # 获取实际值
print("操作系统为: %s"%value)
执行输出:
操作系统为: Ubuntu 16.04.2 LTS
五、错误集锦
1. EllipticCurvePublicKey.public_bytes
Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.
原因
paramiko 2.4.2 依赖 cryptography,而最新的cryptography==2.5里有一些弃用的API。
解决
删掉cryptography,安装2.4.2,就不会报错了。
pip uninstall cryptography
pip install cryptography==2.4.2
本文参考链接:
https://blog.51cto.com/wangfeng7399/2376115
2. Error reading SSH protocol banner
Traceback (most recent call last):
File "/python3/lib/python3.5/site-packages/paramiko/transport.py", line 1966, in run
self._check_banner()
File "/python3/lib/python3.5/site-packages/paramiko/transport.py", line 2143, in _check_banner
"Error reading SSH protocol banner" + str(e)
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner Error reading SSH protocol banner
要解决这个问题, 需要将paramiko的响应等待时间调长。
修改paramiko/transport.py文件中的
self.banner_timeout
值, 将其设为300或者其他较长的值即可解决这个问题。
参考:
- stackoverflow
- 腾讯云
https://blog.csdn.net/qq_30513141/article/details/78201078
本文参考链接:
https://blog.csdn.net/Temanm/article/details/50607741
Python Paramiko实现sftp文件上传下载以及远程执行命令的更多相关文章
- 我的代码库-Java8实现FTP与SFTP文件上传下载
有网上的代码,也有自己的理解,代码备份 一般连接windows服务器使用FTP,连接linux服务器使用SFTP.linux都是通过SFTP上传文件,不需要额外安装,非要使用FTP的话,还得安装FTP ...
- Java实现FTP与SFTP文件上传下载
添加依赖Jsch-0.1.54.jar <!-- https://mvnrepository.com/artifact/com.jcraft/jsch --> <dependency ...
- python 实现远端ftp文件上传下载
python 实现ftp上传下载 * 脚本需要传入两个参数,参数1为需要从远端ftp站点下载文件名称,参数2为已知需要下载的文件md5值,文件下载完成后会自动进行md5值校验 * 运行示例 [root ...
- Jsch - java SFTP 文件上传下载
使用Jsch上传.下载文件,核心步骤是:获取channel,然后使用get/put方法下载.上传文件 核心代码句: session = jSch.getSession(ftpUserName, ftp ...
- Linux文件上传下载sz 和 rz 命令
windows系统和linux系统之间文件上传和下载用到 rz 和 sz 命令.rz: 上传文件sz:下载文件 先检查是否安装rz,sz模块 安装rz,sz 模块yum search sz安装yum ...
- Mac文件上传下载到服务器指定命令
下载文件夹 scp -r 远程登录服务器用户名@远程服务器ip地址:/下载文件夹的目录 『空格』 本地目录 下载文件 scp 远程登录服务器用户名@远程服务器ip地址:/下载文件的 ...
- SFTP 文件上传下载工具类
SFTPUtils.java import com.jcraft.jsch.*; import com.jcraft.jsch.ChannelSftp.LsEntry; import lombok.e ...
- java实现sftp文件上传下载
/** * * @param filePath 文件全路径 * @param ftpPath 上传到目的端目录 * @param username * @param password * @param ...
- SFTP 文件上传下载引用代码
http://sha1064616837.iteye.com/blog/2036996 http://www.cnblogs.com/itmanxgl/p/fe5d33512609fe540eb08a ...
随机推荐
- nodejs+nvm历史版本
官网:http://nodejs.org/dist/ 淘宝镜像:https://npm.taobao.org/mirrors/node/ nvm历史版本:https://github.com/core ...
- 升级pip3的正确姿势--python3 pip3 update
升级pip3的正确姿势为: pip3 install --upgrade pip 而不是 pip3 install --upgrade pip3
- 第12组 Beta测试(5/5)
Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...
- 超级简单的tab点击
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2019 SDN第四次上机作业
作业博客链接:http://edu.cnblogs.com/campus/fzu/fzusdn2019/homework/10017 1. 解压安装OpenDayLight控制器(本次实验统一使用Be ...
- Java封装jar包对外提供可执行文件
编写Main方法,封装jar包 1.编写Main方法 import java.util.Date; /** * 描述 : * * @Author : zhanghao * @Time : 2019/1 ...
- 一款阿里开源的 Java 诊断工具
Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...
- Objective-C中使用不定参数个数的方法调用
Objective-C中,定义并使用带有不定参数个数的对象方法与C函数类似,规则上也要求不定参数列表中必须至少要有一个形参,然后参数列表的最后跟省略号表示不定参数.省略号不能放在参数当中部分,只能放在 ...
- NB-IoT物联网开发资料
OneNET(移动平台) https://open.iot.10086.cn/ NB-IoT套件提供了一种方便用户使用NB模组将设备连接到OneNET平台实现丰富NB-IoT应用的能力.平台为用户提供 ...
- 本地jar包上传docker容器
先安装docker的注册服务器: [root@VM_0_7_centos ~]# docker run -d -p : --restart=always --name registry2 regist ...