Python subprocess.Popen和执行ssh命令时出现问题
我正在使用subprocess.Popen执行OS命令。以下是我试图在代码中模拟的内容:Python subprocess.Popen和执行ssh命令时出现问题,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,我正在使用subprocess.Popen执行OS命令。以下是我试图在代码中模拟的内容: ssh -T myhost < /path/to/some/file ssh-T myhost
ssh -T myhost < /path/to/some/file
ssh-T myhost
它的工作原理如下:
def runWorkerCode(filer, filename):
command = "/usr/bin/ssh -T " + filer + " < /devel/myscript"
try:
p = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
out, _ = p.communicate()
except Exception:
print "Error: %s" % Exception
sys.exit(1)
return out.rstrip().split('\n')
/bin/sh -T filer < /dev/myscript -c "/usr/sbin/ssh"
def runWorkerCode(文件管理器,文件名):
command=“/usr/bin/ssh-T”+filer+”
但以下对Popen的调用不起作用:
p = subprocess.Popen(["/usr/bin/ssh", "-T", filer, "<", "/devel/myscript"], stdout=subprocess.PIPE, shell=True)
p = subprocess.Popen(["/usr/bin/ssh -T", filer, "< /devel/myscript"], stdout=subprocess.PIPE, shell=True)
p=subprocess.Popen([“/usr/bin/ssh”,“-T”,文件管理器,"在UNIX上使用shell=True
时,应将参数作为字符串提供。在提供列表时,subprocess
将列表中的第一项解释为整个命令字符串,将列表中的其余项解释为传递给shell本身的参数,而不是命令。因此,在上面的示例中,您将我们的结局是这样的:
def runWorkerCode(filer, filename):
command = "/usr/bin/ssh -T " + filer + " < /devel/myscript"
try:
p = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
out, _ = p.communicate()
except Exception:
print "Error: %s" % Exception
sys.exit(1)
return out.rstrip().split('\n')
/bin/sh -T filer < /dev/myscript -c "/usr/sbin/ssh"
关于何时传递字符串与何时传递序列的规则非常混乱,尤其是当您将Windows也加入到混合中时。我会仔细阅读这些规则以试图理解所有内容。请查看args
部分和shell
部分,这不是文档所说的,“所有调用都需要args,args应该是字符串或程序参数序列。提供参数序列通常是首选,因为它允许模块处理所需的参数转义和引用(例如,允许文件名中有空格)。如果传递单个字符串,则任何一个shell都必须True
(见下文)或者字符串必须简单地命名要执行的程序,而不指定任何参数。“@wnnmaw我认为这更相关”在shell=True的Unix上,shell默认为/bin/sh。如果args是字符串,则该字符串指定要通过shell执行的命令。这意味着字符串的格式必须与在shell提示符下键入时的格式完全相同。例如,这包括引用或反斜杠转义文件名,其中包含空格。如果args是序列e、 第一项指定命令字符串,任何附加项都将被视为shell本身的附加参数。”。由于它建议您可以通过shell=True
@wnnmaw传递序列,但是,文档也这样说:“如果shell为True,建议将args作为字符串而不是序列传递。"我将编辑我的答案以澄清问题。@wnnmaw事实上,现在我又读了一遍,它的意思是,如果你提供一个带有shell=True
的序列,第一个元素是命令字符串,其余的是传递给shell的参数。因此,如果你不想传递argum,你真的应该传递一个字符串这将在Linux和Solaris(sparc和x86)主机上运行。