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
相关产品推荐
相关产品推荐

