使用双qoutes和变量的Popen

2024-10-02 14:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我花了好几个小时来研究这个问题,并阅读了关于SO和python文档的其他问题,但是还没有解决这个问题。在

我试图让python使用变量在ssh上发送一个带有双引号(“)和正确间距的echo命令。在

下面是相关的代码片段:

ssh_upd = Popen([
    'ssh', server, 'sudo', '-S',
    "echo' " "" + mtpt + "  " + "   " +filervol + "'",
    "|", "sudo tee -a", "/etc/"+map, ">", "/dev/null" ], stdout=None, stdin=PIPE, stderr=STDOUT)

mtpt和filervol都是前面在代码中定义的变量。在

上述代码生成以下输出:

^{pr2}$

python需要发送:

echo "junk              junk:/vol/junk"

提前谢谢你的帮助。在


Tags: 代码文档命令echososudosshpopen
2条回答

我不知道你想在这里做什么:

"echo' " ""

……但是Python将如何解释它:

首先,"echo' "是一个6个字符的字符串(单词echo,一个'和一个空格)。那么""是一个空字符串。它们被连接在一起(当然,形成相同的6个字符的字符串)。在

如果要将双引号字符放入双引号字符串中,则必须使用反斜杠对其进行转义,如下所示:

^{pr2}$

然而,有一种更简单的方法来处理这些问题:使用三重引用。大多数人都知道三重引号是处理多行字符串的一种方法,这一点很好,但对于包含两种引号的字符串也很有用:

'''echo' " "'''

另外,使用一个单一格式的字符串并对其调用format(或者,如果您愿意,可以使用%运算符),而不是一遍又一遍地打开和结束引号以便使用字符串连接。在


但同时,如果你想发送的是:

echo "junk              junk:/vol/junk"

我不知道为什么要用echo'作为字符串的开头,但是很明显,你一下子就搞错了。你想要的是:

'''echo "{0}     {1}"'''.format(mtpt, filervol)

我在那里放了5个空格,因为你的原始代码有一个2个空格的字符串加上了一个3个空格的字符串。但是你想要的输出有14个空格,所以…我不确定你到底想要什么。如果实际代码中涉及的制表符在复制粘贴到StackOverflow时丢失,我建议在文本中使用\t转义符,而不是实际的制表符。在

如果在命令中使用|>,那么还需要使用shell=True。在

如果使用shell=True,则Popen的第一个参数应该是字符串,而不是列表:

ssh_upd = Popen(
    'ssh {server} sudo -S echo "{mtpt}      {filervol}" | sudo tee -a /etc/{map} > /dev/null'.format(server=server, mtpt=mtpt, filervol=filervol, map=map), stdout=None, stdin=PIPE, stderr=STDOUT, shell=True)

请注意,如果发送到Popen的命令包含用户输入,则不应使用shell=True,因为这可能存在安全风险。(请务必阅读the Warning in the docs。)

您可以避免使用shell=True和管道|,以及重定向{},方法是使用多个popenconnecting one's stdout to the next one's stdin。在

相关问题 更多 >