为什么subprocess.call()不执行scp,除非包含"shell=True"?



我的程序以这种方式安全地复制:subprocess.run(scp -P 22 username@address.com:path/to/file $HOME/Downloads)

但它给了我以下错误:FileNotFoundError: [Errno 2] No such file or directory: 'scp -P 22 username@address.com:path/to/file $HOME/Downloads

然而,像添加subprocess.run(scp -P 22 username@address.com:path/to/file $HOME/Downloads, shell=True)一样添加shell=True可以修复它

为什么?有没有办法绕过它,或者shell=True是必不可少的?

如果您查看文档,您会发现subprocess.run实际上想要一个值列表,而不是一个字符串:

subprocess.run( ["scp", "-P", "22", 
"username@address.com:path/to/file"
"$HOME/Downloads"] )

然而,这里还有另一个问题。$HOME是一个shell变量。如果你不使用shell=True,那么你需要自己扩展它:

subprocess.run( ["scp", "-P", "22", 
"username@address.com:path/to/file",
os.environ["HOME"]+"/Downloads"] )

您不需要指定"-P 22〃;。这是ssh的默认端口。

相关内容

  • 没有找到相关文章