一、简介

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. fake_useragent 本地运行各种报错解决办法

  2. Python之NumPy(axis=0/1/2...)的透彻理解

    https://blog.csdn.net/sky_kkk/article/details/79725646 numpy中axis取值的说明首先对numpy中axis取值进行说明:一维数组时axis= ...

  3. hbase 由于zookeeper问题导致连接失败问题

    问题现象: 使用hbase shell 连接报如下问题: 2019-10-09 10:37:18,855 ERROR [main] zookeeper.RecoverableZooKeeper: Zo ...

  4. element-ui里面的table插入多张图片

    <el-form-item label="身份证正反面" label-width="120px"> <section v-if="t ...

  5. ICEM-三棱锥的一种画法

    原视频下载地址:https://pan.baidu.com/s/1c4BAqy 密码: nqb4

  6. rust 函数的使用

    fn main() { println!("Hello, world!"); another_function(2,3); let y ={ let x =3; //表达式的结尾没 ...

  7. CTF SSRF(服务器端伪造请求)

    目录 CTF SSRF(服务器端伪造请求) 一.概念 二.危害 三.漏洞挖掘与判断 四.相关函数 五.IP绕过 六.Gopher协议 1.使用限制 2.构造payload CTF SSRF(服务器端伪 ...

  8. Mac php 装imagick扩展 菜鸟教程

    1.2.直接brew install imagemagick@6完成安装 2.去http://pecl.php.net/package/imagick下载安装包 2.1.下载完后解压tar -xzvf ...

  9. IOC注解方式1.0

    在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0" encoding=& ...

  10. NoSql数据库Redis系列(6)——Redis数据过期策略详解

    本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...