Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.Popen和执行ssh命令时出现问题_Python_Python 2.7_Subprocess - Fatal编程技术网

Python subprocess.Popen和执行ssh命令时出现问题

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

我正在使用subprocess.Popen执行OS命令。以下是我试图在代码中模拟的内容:

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)主机上运行。