You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows10下如何在Python的scp脚本中获取传输进度百分比

解决方案

一、Windows下获取scp传输进度的方法

Windows环境下(比如使用系统自带的OpenSSH scp客户端),scp的传输进度默认输出到stderr而非stdout,你之前用proc.wait()会等到进程结束才读取内容,自然无法实时获取进度。需要调整subprocess调用方式,实时读取stderr并解析进度:

修改后的Python代码

import subprocess
import re

# 替换为实际的密钥路径、本地文件路径和远程地址
command = "scp -i c:<path-to-ssh-key> c:<path-to-file> <user@host>:<remote-filepath>"

# 启用行缓冲,实时读取输出
proc = subprocess.Popen(
    command,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True,
    bufsize=1,
    universal_newlines=True
)

# 正则匹配进度百分比
progress_pattern = re.compile(r'(\d+)%')
for line in proc.stderr:
    match = progress_pattern.search(line)
    if match:
        print(f"本地到跳板机传输进度: {match.group(1)}%")

# 等待进程结束并获取返回码
return_code = proc.wait()
if return_code == 0:
    print("传输成功")
else:
    print(f"传输失败,返回码: {return_code}")

注意:如果scp未输出进度,检查是否添加了-q(安静模式)参数,确保移除该参数;部分scp版本在非终端环境下可能自动关闭进度输出,这种情况下可以尝试使用pty模块模拟终端(Windows下pty支持有限,不推荐优先使用)。

二、更优方案:使用paramiko库(纯Python实现)

相比调用外部scp命令,使用paramiko库可以更灵活地控制SSH/SCP传输,直接通过回调函数获取进度,无需解析命令行输出,适配性更强。

步骤1:安装paramiko

pip install paramiko

步骤2:带进度回调的传输代码

import paramiko

def transfer_progress(transferred_bytes, total_bytes):
    """进度回调函数"""
    progress_percent = (transferred_bytes / total_bytes) * 100
    print(f"本地到跳板机传输进度: {progress_percent:.1f}%")

# 建立与跳板机的SSH连接
ssh_client = paramiko.SSHClient()
# 自动接受未知主机密钥(生产环境建议替换为指定密钥验证)
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
    ssh_client.connect(
        hostname="<跳板机IP/主机名>",
        username="<用户名>",
        key_filename="c:<path-to-ssh-key>"  # 本地SSH密钥路径
    )

    # 开启SFTP会话上传文件
    sftp = ssh_client.open_sftp()
    sftp.put(
        localpath="c:<path-to-file>",  # 本地文件路径
        remotepath="<跳板机上的目标路径>",
        callback=transfer_progress  # 绑定进度回调
    )
    sftp.close()
    print("本地到跳板机传输完成")

    # 可选:从跳板机传输到内部其他设备
    # 可以在跳板机上执行scp命令,或通过跳板机建立到内部设备的SFTP连接
    # 示例:在跳板机上执行scp命令到内部设备
    internal_transfer_cmd = "scp <跳板机上的文件路径> <内部设备用户@IP>:<目标路径>"
    stdin, stdout, stderr = ssh_client.exec_command(internal_transfer_cmd)
    # 可按需解析内部传输的输出

finally:
    ssh_client.close()

该方案的优势

  • 纯Python实现,不依赖系统scp命令,跨平台兼容性更好;
  • 进度回调直观可控,无需正则解析命令行输出;
  • 可直接通过同一个SSH连接完成跳板机到内部设备的二次传输,流程更统一。

内容的提问来源于stack exchange,提问作者rogueakula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:45:40