项目要求 定期向特定服务器传输软件运行状况文件(基于SFTP)
,因此计划写一个Python脚本,该脚本首先要定期读取产品运营数据,然后按要求生成数据文件,最后通过 Paramiko
上传到SFTP服务器。
这篇文章是我在实现以上需求过程中,对于Paramiko
的使用总结。
- Paramiko 简介
- Paramiko 安装
- Paramiko 使用
一、Paramiko 简介
Paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式,可实现远程命令执行、文件传输、中间SSH代理等功能。
通俗的讲:
Python的Paramiko依赖库,可以帮助开发者通过代码的方式
完成对远程服务器的文件上传
、文件下载操作
,也可以对远程服务器输入操作命令
。
二、Paramiko 安装
我的电脑Python环境Python 3.7.3,这里的安装也是基于该Python环境进行安装。
安装Paramiko
之前,首选需要安装 Pycrypto
依赖,其用于提供多种加密方式,是Paramiko
的依赖包。
# 安装Pycrypto:(Paramiko依赖PyCrypto,需要先安装PyCrypto,用于提供多种加密方式)
pip3 install pycrypto
# 安装Paramiko
pip3 install paramiko
若安装过程中遇到SSH支持问题相关的错误提醒,可更换如下方式进行安装:
# 安装Pycrypto:(豆瓣源)
pip3 install pycrypto -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
# 安装Paramiko:(豆瓣源)
pip3 install paramiko -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
三、Paramiko 使用
Paramiko主要包含两个部分:SFTPClient
和SSHClient
SFTPClient
:类似于SFTP工具
,可以实现对远程服务器的文件进行上传和下载。SSHClient
:类似于Linux的ssh命令
,可以通过SSHClient模块对远程服务器执行一些命令操作(Linux)。
3.1 SFTPClient
SFTPClient 类似于SFTP工具
,可以实现对远程服务器的文件进行上传和下载。
import paramiko
# 连接sftp服务器(Ip,端口)
sftp_transport = paramiko.Transport(('10.10.10.10', 6666))
# 登录sftp服务器(账号,密码)
sftp_transport.connect(username = 'xiaxl', password = 'secret')
# 建立传输通道
sftp = paramiko.SFTPClient.from_transport(sftp_transport)
# 上传文件(本地路径,目的服务器路径)
sftp.put('/home/workspace/D_001_20230110.txt', '/incoming/D_001_20230110.txt')
# 下载下载(本地路径,目的服务器路径)
#sftp.get('/home/workspace/D_002_20230110.txt', '/incoming/D_002_20230110.txt')
# 关闭连接
sftp_transport.close()
3.1 SSHClient
SSHClient 类似于Linux的ssh命令
,可以通过SSHClient模块对远程服务器执行一些命令操作(Linux)。
import paramiko
# 实例化 SSHclient
ssh_client = paramiko.SSHClient()
# 保存服务器密钥
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 输入服务器地址
ssh_client.connect(hostname='xxxx', port=22, username='root', password='xxxxxx')
# 返回了三个数据,第一个是输入命令,第2个是命令返回的结果,第3个是命令错误时返回的结果
stdin, stdout, stderr = ssh_client.exec_command('pwd;lll')
# 返回了当前的路径结果,如果错误则返回为空
print(stdout.read().decode('utf-8'))
# 返回错误的执行结果,如果正确则返回为空
print(stderr.read().decode('utf-8'))