Python 使用 Paramiko 模块实现远程文件拷贝

发布日期 :2026-09-07 08:04:07 UTC

作者 :xuzhiping

访问量: 10 次浏览

一、模块介绍

paramiko 遵循 SSH2 协议,以加密安全方式和远程服务器建立连接,两大常用能力:

1.SSH 客户端:登录远程主机,执行 shell 命令;

2.SFTP 客户端:基于 SSH 通道,实现文件上传、下载拷贝。

二、模块安装

现代推荐(pip,新版本)

pip install paramiko

旧版本源码编译(文章原始方式,适用于 paramiko‑1.7.7.1,现已老旧不推荐)

wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz
wget http://www.lag.net/paramiko/download/paramiko-1.7.7.1.tar.gz

tar -zxvf pycrypto-2.6.tar.gz
cd pycrypto-2.6/
python setup.py build && python setup.py install

tar xvzf paramiko-1.7.7.1.tar.gz
cd paramiko-1.7.7.1/
python setup.py build && python setup.py install

Linux yum 安装

yum install python‑paramiko -y

注意:旧版依赖 pycrypto,新版本 paramiko 底层使用 cryptography,不再需要 pycrypto。

三、核心 API 说明

1.paramiko.Transport((主机IP,端口)):建立 SSH 传输通道;默认 SSH 端口 22;

2.transport.connect(username=,password=):账号密码认证建立连接;

3.paramiko.SFTPClient.from_transport(transport):从已有通道创建 SFTP 客户端对象;

4.sftp.get(remote_path, local_path)下载:远程文件 → 本地文件;

5.sftp.put(local_path, remote_path)上传:本地文件 → 远程服务器;

6.transport.close():关闭传输连接。

四、封装通用文件拷贝函数

#coding=utf-8
import paramiko
import os

def remote_scp(op_type, host_ip, remote_path, local_path, username, password):
    """
    :param op_type: remoteRead=下载(远程读到本地);remoteWrite=上传(本地写到远程)
    :param host_ip: 远程服务器IP
    :param remote_path: 远程文件路径
    :param local_path: 本地文件路径
    :param username: ssh用户名
    :param password: ssh密码
    :return: 成功返回True,异常返回False
    """
    ssh_port = 22
    try:
        # 创建传输通道
        conn = paramiko.Transport((host_ip, ssh_port))
        conn.connect(username=username, password=password)
        # 获取sftp对象
        sftp = paramiko.SFTPClient.from_transport(conn)

        if op_type == 'remoteRead':
            # 下载:远程→本地,如果本地路径为空,自动保存到/tmp目录
            if not local_path:
                fileName = os.path.split(remote_path)
                local_path = os.path.join('/tmp', fileName[1])
            sftp.get(remote_path, local_path)

        if op_type == "remoteWrite":
            # 上传:本地→远程
            sftp.put(local_path, remote_path)

        conn.close()
        return True
    except Exception:
        return False

五、函数调用示例

1. 下载(远程文件下载到本地)

# 下载远程服务器 /root/test.txt 到本地 /tmp/test.txt
res = remote_scp(
    op_type="remoteRead",
    host_ip="192.168.1.100",
    remote_path="/root/test.txt",
    local_path="/tmp/test.txt",
    username="root",
    password="123456"
)
print("下载成功" if res else "下载失败")

2. 上传(本地文件上传到远程服务器)

# 上传本地 /tmp/log.txt 到远程服务器 /root/log.txt
res = remote_scp(
    op_type="remoteWrite",
    host_ip="192.168.1.100",
    remote_path="/root/log.txt",
    local_path="/tmp/log.txt",
    username="root",
    password="123456"
)
print("上传成功" if res else "上传失败")

六、开发注意事项

1.SFTP 的get()put()只支持单个文件,不能直接拷贝文件夹;拷贝目录需要手动循环遍历文件;

2.本地保存目录、远程目标目录必须提前存在,sftp 不会自动创建目录,目录缺失直接报错;

3.文件路径建议写绝对路径,相对路径容易出错;

4.传输完成必须执行conn.close()关闭连接,避免连接泄漏;

5.示例是密码登录;生产环境优先使用密钥认证,避免明文写密码;

6.原始代码只捕获全部异常,没有打印具体错误,生产建议打印异常信息方便排错。