我花了几个小时研究这个并阅读有关SO和python文档的其他问题,但还没有解决这个问题。
我试图让python发送带有双引号(“)的echo命令,并使用变量在ssh上修正间距。
以下是相关的代码段:
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都是前面代码中定义的变量。
上面的代码产生了这个输出:
sudo: echo junk junk:/vol/junk: command not found
python需要发送:
echo "junk junk:/vol/junk"
提前感谢您的帮助。
答案 0 :(得分:2)
我不确定你在这里要做什么:
"echo' " ""
...但是Python将如何解释它:
首先,"echo' "
是一个6个字符的字符串(单词echo
,单个'
和空格)。然后""
是一个空字符串。它们连接在一起(当然形成相同的6个字符的字符串)。
如果要将双引号字符放入双引号字符串中,则必须使用反斜杠转义它们,如下所示:
"echo' \" \""
但是,有一种更容易处理这个问题的方法:只使用三引号。大多数人都将三重引用作为一种处理多行字符串的方式进行了学习,而且它非常适合 - 但它对于同时包含两种引号的字符串也很有用:
'''echo' " "'''
此外,不是一遍又一遍地打开和关闭引号,因此您可以使用字符串连接,使用单个格式字符串并在其上调用format
(或者,如果您愿意,也可以使用%
运算符。
但同时,如果你要发送的是这个:
echo "junk junk:/vol/junk"
我不知道为什么你开始使用echo'
作为字符串的开头,但你明显出现了问题。你想要的是:
'''echo "{0} {1}"'''.format(mtpt, filervol)
我在那里放了5个空格,因为原始代码有一个2空格字符串添加到3空格字符串。但是你想要的输出有14个空格,所以......我不确定你到底想要什么。如果实际代码中涉及的标签在复制粘贴到StackOverflow时丢失了,我建议在文字中使用\t
转义而不是实际标签。
答案 1 :(得分:2)
如果您在命令中使用|
或>
,则还需要使用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
和管道|
以及使用多个Popens connecting one's stdout to the next one's stdin重定向>
。