Python远程SSH库Paramiko详细操作

山海之间
山海之间
发布时间:2026-10-15| 4人浏览过
原创

本文详细介绍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内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。