Python远程SSH库Paramiko详细操作
本文详细介绍Python第三方库Paramiko的使用,涵盖SSHClient与SFTPCore组件的核心功能。内容包含环境安装、连接参数配置、私钥认证流程、常用命令执行及文件上传下载示例,帮助开发者快速掌握远程服务器自动化操作。
Paramiko是一个基于Python语言开发的模块,遵循SSH2协议标准,支持通过加密和认证机制建立远程服务器连接。该模块兼容Linux、Solaris、BSD、MacOS X及Windows等多种平台,允许用户通过SSH协议在不同平台间进行交互。借助此模块,用户可以便捷地实现SSH远程连接以及基于SFTP协议的文件传输操作。
Paramiko(https://www.paramiko.org/)实现了SSHv2协议,其底层依赖cryptography库进行加密处理。使用该模块,开发者能够对远程服务器执行系统命令或进行文件管理操作。
核心组件
若环境中尚未安装,请先执行pip install paramiko进行安装。
Paramiko主要包含两个核心组件:SSHClient和SFTPClient。
SSHClient:该组件类似于Linux系统中的ssh命令,是对SSH会话的封装。它内部封装了传输层(Transport)、通道(Channel)以及建立SFTP客户端的方法(open_sftp),通常用于执行远程命令。SFTPClient:该组件类似于Linux系统中的sftp命令,是对SFTP客户端的封装,主要用于实现远程文件操作,包括文件上传、下载以及修改文件权限等功能。
涉及的基础概念名词如下:
Channel:这是一种类似Socket的安全SSH传输通道。Transport:这是一种加密会话,在建立时会同步创建一个加密的通道(Channel)。Session:这是保持Client与Server连接的对象,通过connect()、start_client()或start_server()方法启动会话。
SSHClient常用方法
SSHClient主要用于执行SSH命令。
connect()方法用于实现远程服务器的连接与认证,其中hostname是必传参数。
hostname:指定连接的目标主机地址。port=SSH_PORT:指定SSH服务端口号。username=None:指定登录使用的用户名。password=None:指定登录用户的密码。pkey=None:指定以私钥方式进行身份验证,用于替代password方式。key_filename=None:指定私钥文件的路径名或文件列表。timeout=None:可选的TCP连接超时时间设置。allow_agent=True:控制是否允许连接到SSH代理,默认值为True(允许)。look_for_keys=True:控制是否在~/.ssh目录下搜索私钥文件,默认值为True(允许)。compress=False:控制是否启用数据压缩,默认值为False。
set_missing_host_key_policy()方法用于设置当远程服务器未在known_hosts文件中记录时的应对策略。
AutoAddPolicy:自动将主机名及密钥添加到本地HostKeys对象中,即建立新SSH连接时无需手动输入yes或no进行确认。WarningPolicy:当记录未知主机密钥时会发出警告,功能上与AutoAddPolicy类似,但会提示这是新连接。RejectPolicy:默认选项;自动拒绝未知的主机(即本地known_hosts中不存在的)。
exec_command()方法用于在远程服务器上执行Linux命令。
open_sftp()方法在当前SSH会话基础上创建一个SFTP会话,并返回一个SFTPClient对象。
sftp = sshClient.open_sftp()
SFTPClient常用方法
SFTPClient作为SFTP客户端对象,实现远程文件操作,如上传、下载、查询权限和状态等。
from_transport(cls,t):创建一个已连通的SFTP客户端通道。put(localpath, remotepath, callback=None, confirm=True):将本地文件上传到服务器。参数confirm用于控制是否调用stat()方法检查文件状态,返回类似ls -l的结果。get(remotepath, localpath, callback=None):从服务器下载文件到本地。mkdir():在服务器上创建目录。remove():在服务器上删除目录。rename():在服务器上重命名目录。stat():查看服务器文件状态。listdir():列出服务器目录下的文件。
使用示例
SSH私钥创建
若要通过私钥登录,需先生成私钥(以Windows远程登录Linux为例)。
- 生成私钥步骤如下:
打开cmd命令行,执行ssh-keygen命令。
一路回车确认默认设置。
生成完成后,会在‘用户’目录下的.ssh目录中生成id_rsa与id_rsa.pub文件。
- 上传公钥步骤如下:
将id_rsa.pub文件复制到远端Linux机器的~/.ssh目录下。
将公钥内容追加到authorized_keys文件中:cat id_rsa.pub >> authorized_keys。
SSHClient运行命令
演示以私钥方式登录并执行命令。
def execCmd(host, user, psw, cmd, port=22) -> (str, str):
"""
:param host:
:param user:
:param psw:
:param cmd:
:param port:
:return: (stdout string, stderr string)
"""
with paramiko.SSHClient() as ssh_client:
# 自动添加策略,保存服务器的主机名和密钥信息,须放在connect方法的前面
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接SSH服务端,以用户名和密码进行认证
# ssh_client.connect(hostname=host, port=port, username=user, password=psw)
# 连接SSH服务端,以用户名和私钥进行认证
prvKey = paramiko.RSAKey.from_private_key_file(psw)
ssh_client.connect(hostname=host, port=port, username=user, pkey=prvKey)
# 打开一个Channel并执行命令: 正确输出放到stdout中,如果有错误放到stderr中
_, stdout, stderr = ssh_client.exec_command(cmd)
result = stdout.read().decode('utf-8')
# print("[OUT]:", result)
err = stderr.read().decode('utf-8')
# print("[ERR]:", err)
ssh_client.close()
return result, err函数以元组形式返回结果,若执行过程中出现错误,则返回的err变量非空。
SFTPClient下载文件
演示以用户名与密码方式登录并下载文件。
def downloadFile(host, user, psw, localFile, remoteFile, port=22):
# 实例化一个transport对象
with paramiko.Transport((host, port)) as tran:
# 连接SSH服务端,,以用户名和密码进行认证
tran.connect(username=user, password=psw)
# 连接SSH服务端,以用户名和私钥进行认证
# prvKey = paramiko.RSAKey.from_private_key_file(psw)
# tran.connect(username=user, pkey=prvKey)
# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
# 执行下载动作
sftp.get(remoteFile, localFile)
# 关闭Transport通道
tran.close()
默认情况下,远端当前目录为用户home目录,例如下载".viminfo"文件的操作。
downloadFile(host, user, psw, "d:\\tmp.conf", ".viminfo")本文关于Python远程SSH库Paramiko的简介到此结束,更多相关Python远程Paramiko内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









