为什么 subprocess.call() 不执行 scp 除非包含 "shell=True"?
Why does subprocess.call() not execute scp unless "shell=True" is included?
我的程序以这种方式安全复制: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
。
但是,像这样添加 shell=True
subprocess.run(scp -P 22 username@address.com:path/to/file $HOME/Downloads, 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 的默认端口。
我的程序以这种方式安全复制: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
。
但是,像这样添加 shell=True
subprocess.run(scp -P 22 username@address.com:path/to/file $HOME/Downloads, 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 的默认端口。