一、简介

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文件上传下载以及远程执行命令的更多相关文章

  1. 我的代码库-Java8实现FTP与SFTP文件上传下载

    有网上的代码,也有自己的理解,代码备份 一般连接windows服务器使用FTP,连接linux服务器使用SFTP.linux都是通过SFTP上传文件,不需要额外安装,非要使用FTP的话,还得安装FTP ...

  2. Java实现FTP与SFTP文件上传下载

    添加依赖Jsch-0.1.54.jar <!-- https://mvnrepository.com/artifact/com.jcraft/jsch --> <dependency ...

  3. python 实现远端ftp文件上传下载

    python 实现ftp上传下载 * 脚本需要传入两个参数,参数1为需要从远端ftp站点下载文件名称,参数2为已知需要下载的文件md5值,文件下载完成后会自动进行md5值校验 * 运行示例 [root ...

  4. Jsch - java SFTP 文件上传下载

    使用Jsch上传.下载文件,核心步骤是:获取channel,然后使用get/put方法下载.上传文件 核心代码句: session = jSch.getSession(ftpUserName, ftp ...

  5. Linux文件上传下载sz 和 rz 命令

    windows系统和linux系统之间文件上传和下载用到 rz 和 sz 命令.rz: 上传文件sz:下载文件 先检查是否安装rz,sz模块 安装rz,sz 模块yum search sz安装yum ...

  6. Mac文件上传下载到服务器指定命令

    下载文件夹 scp -r  远程登录服务器用户名@远程服务器ip地址:/下载文件夹的目录     『空格』    本地目录 下载文件 scp   远程登录服务器用户名@远程服务器ip地址:/下载文件的 ...

  7. SFTP 文件上传下载工具类

    SFTPUtils.java import com.jcraft.jsch.*; import com.jcraft.jsch.ChannelSftp.LsEntry; import lombok.e ...

  8. java实现sftp文件上传下载

    /** * * @param filePath 文件全路径 * @param ftpPath 上传到目的端目录 * @param username * @param password * @param ...

  9. SFTP 文件上传下载引用代码

    http://sha1064616837.iteye.com/blog/2036996 http://www.cnblogs.com/itmanxgl/p/fe5d33512609fe540eb08a ...

随机推荐

  1. [RN] React Native 使用 React-native-scrollable-tab-view 实现 类头条 新闻页头部 效果

    React Native 使用 React-native-scrollable-tab-view 实现 类头条 新闻页效果 效果如下: 一.安装依赖 npm install react-native- ...

  2. 72: libreoj #10147 区间dp

    $des$ 将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分. 请编写一个程序,读入堆数 nnn 及每堆的石子数 ...

  3. CSS3之碰撞反弹动画无限运动

    示例代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  4. 洛谷P3177 树上染色

    题目 一道非常好的树形DP. 状态:\(dp[u][n]\)为u的子树选n个黑点所能得到的收益最大值. 则最终的结果就是\(dp[root][k],\)\(root\)可以为任何值,为了方便,使\(r ...

  5. 腾讯云手动搭建nginx+php-fpm并自启动

    自己一点小爱好,搭建了一个小网站植物大战僵尸百科, 使用的是腾讯云,市场里的镜像不好用,所以自己手动搭建一波. centos 7 编译安装 php-7.2.11的步骤 在官网下载php-7.2.11的 ...

  6. 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk 一.知识点 1.伪协议文件读取 2.报错注入 刷题记录:[CISCN2019 华北赛区 Day1 Web5]Cy ...

  7. TCP的连接如何知道对方已经异常断开

    断电的话,对方不会发送任何数据包过来,包括RST.主机无法得知.如果是TCP已经连接,有个定时器,会发送空包,sequence number不变.如果一直收不到ack,会断定对方已经无法通信,而释放系 ...

  8. 定制比特币btc地址address

    https://99bitcoins.com/how-to-get-a-custom-bitcoin-address/ https://en.bitcoin.it/wiki/Vanitygen htt ...

  9. zookeeper安装运行(docker)

    拉取镜像docker pull zookeeper:latest 获取镜像基本信息docker inspect zookeeper mkdir /opt/zookeeper -p vim /opt/z ...

  10. arcgis python 获得硬件id

    import time import wmi, zlib def get_cpu_info(): tmpdict = {} tmpdict["CpuCores"] = 0 c = ...