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 ...
随机推荐
- Flutter 简介(事件、路由、异步请求)
1. 前言 Flutter是一个由谷歌开发的开源移动应用软件开发工具包,用于为Android和iOS开发应用,同时也将是Google Fuchsia下开发应用的主要工具.其官方编程语言为Dart. 同 ...
- 57、Spark Streaming: window滑动窗口以及热点搜索词滑动统计案例
一.window滑动窗口 1.概述 Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据, 会被聚合起来执行计算操作 ...
- mysql 数据插入insert
mysql> select * from user; +------+----------+-----------+ | id | name | address | +------+------ ...
- 【POJ1573】Robot Motion
题目传送门 本题知识点:模拟 本题的题意也很简单. 给出一个矩阵,矩阵里面有着东南西北(上下左右)的指示,当机器人走到上面时则会按照指示前进.机器人每次都从最上面一行的某一列进入. 需要判断的是机器人 ...
- POI报表打印
一.Excel报表(POI) 1.需求说明 在企业级应用开发中,Excel报表是一种最常见的报表需求.Excel报表开发一般分为两种形式: 1.为了方便操作,基于Excel的报表批量上传数据 2.通过 ...
- px,em和rem
1 px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的 2 em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字 ...
- Hadoop平台上HDFS和MapReduce的功能
1.用自己的话阐明Hadoop平台上HDFS和MapReduce的功能.工作原理和工作过程. HDFS (1)第一次启动 namenode 格式化后,创建 fsimage 和 edits 文件.如果不 ...
- 【Alpha】“北航社团帮”小程序v1.0项目展示
目录 1.团队介绍 2.回答一些工程问题 整个项目的目标和预期功能 整个项目的预期典型用户 整个项目的预期用户数量 alpha满足的用户需求 alpha用户量一览 团队分工及经验教训 团队项目管理 时 ...
- idea docker docker-compose发布springboot站点到tomcat
允许docker被远程访问 见:https://www.cnblogs.com/wintersoft/p/10921396.html 教程:https://spring.io/guides/gs/sp ...
- curl 查看HTTP 响应头信息
curl -I "http://baidu.com" 加大写的i参数