如何在subprocess.Popen中添加scp的端口参数?
解决scp传输的两个问题:端口参数添加与主机密钥验证失败
一、正确添加端口参数的方法
你之前把scp -p 33作为单个参数传入subprocess.Popen,导致系统找不到这个命令。正确的做法是将每个命令参数拆分为列表中的独立元素,而且要注意scp指定端口的参数是大写的-P(小写-p是用来保留文件权限、修改时间等属性的,和端口无关)。
修改后的上传文件代码如下:
import subprocess import os # 拆分每个参数为列表元素,-P指定端口33 p = subprocess.Popen(["scp", "-P", "33", "test.txt", "root@x.x.x.x:/workspace/waic/data"]) sts = os.waitpid(p.pid, 0) print('Done')
如果是从远程机器复制文件到本地,命令结构要调整为:
# 从远程复制到本地:scp -P 端口 远程路径 本地路径 p = subprocess.Popen(["scp", "-P", "33", "root@x.x.x.x:/远程文件路径", "./本地保存路径"])
二、解决"Host key verification failed"报错
这个错误是因为本地主机没有记录远程主机的SSH密钥,有两种解决方式:
- 方式1:手动信任远程主机密钥
在终端直接执行一次scp -P 33 test.txt root@x.x.x.x:/workspace/waic/data,按照提示输入yes确认信任,之后再运行Python代码就不会报错了。 - 方式2:命令中跳过密钥验证(不推荐生产环境)
如果需要自动化执行,可添加-o StrictHostKeyChecking=no参数跳过验证,但这种方式会降低安全性,仅适合测试环境:
p = subprocess.Popen(["scp", "-P", "33", "-o", "StrictHostKeyChecking=no", "test.txt", "root@x.x.x.x:/workspace/waic/data"])
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

