Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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:如何在子流程中使用反勾号?_Python_Bash_Subprocess_Backticks - Fatal编程技术网

Python:如何在子流程中使用反勾号?

Python:如何在子流程中使用反勾号?,python,bash,subprocess,backticks,Python,Bash,Subprocess,Backticks,我想从Python运行一个子流程。命令字符串中有几个带反勾号的子命令: subprocess = subprocess.Popen(["echo", "COMMAND [`date +%%s`] SCHEDULE_HOST_DOWNTIME;%s;`date +%%s`;`date -d 'now + %d sec' +%%s`;1;;;%s;Downtime comment" % (hostname, 300, username)], stdout=subprocess.PIPE) 尽管不执

我想从Python运行一个子流程。命令字符串中有几个带反勾号的子命令:

subprocess = subprocess.Popen(["echo", "COMMAND [`date +%%s`] SCHEDULE_HOST_DOWNTIME;%s;`date +%%s`;`date -d 'now + %d sec' +%%s`;1;;;%s;Downtime comment" % (hostname, 300, username)], stdout=subprocess.PIPE)
尽管不执行反勾号中的日期命令。此命令的标准输出为:

COMMAND [`date +%s`] SCHEDULE_HOST_DOWNTIME;example.com;`date +%s`;`date -d 'now + 300 sec' +%s`;1;;;my-username;Downtime comment
我还尝试使用$date+%s而不是backticks,并通过subprocess.Popen[/bin/bash,-c,echo,…]显式地将其发送给bash,结果相同

如何解决这个问题?我知道我当然可以在这种特殊情况下使用Pythons的datetime模块。但我想知道为什么这不起作用,以及如何在不破坏命令的情况下解决它。虽然我可以在Python中轻松地运行时间戳计算,但在其他情况下,它可能会更复杂,我将被迫运行几个子进程,这些子进程很快就会变得非常难看。

反勾号是一个shell语法特性,但您不是在shell中运行命令。子流程模块直接运行该命令

提供一个字符串而不是列表,如果shell需要将命令作为一个条目处理,则将shell设置为True:

subprocess = subprocess.Popen(
    'echo "COMMAND [`date +%%s`] SCHEDULE_HOST_DOWNTIME;%s;`date +%%s`;`date -d \'now + %d sec\' +%%s`;1;;;%s;Downtime comment"' % (hostname, 300, username),
     stdout=subprocess.PIPE
     shell=True)
Backticks是一个shell语法特性,但是您没有在shell中运行命令。子流程模块直接运行该命令

提供一个字符串而不是列表,如果shell需要将命令作为一个条目处理,则将shell设置为True:

subprocess = subprocess.Popen(
    'echo "COMMAND [`date +%%s`] SCHEDULE_HOST_DOWNTIME;%s;`date +%%s`;`date -d \'now + %d sec\' +%%s`;1;;;%s;Downtime comment"' % (hostname, 300, username),
     stdout=subprocess.PIPE
     shell=True)

这是迅速而正确的。回音字符串需要被引用,但效果很好。谢谢@DanielSchroeder:为您添加了引号。或者,通过subprocess.Popen或直接使用python的时间函数捕获date+%s的输出,然后通过字符串串联来表示字符串,如果您想避免shell=True。。。我见过一些人不喜欢shell=True…:D@anishsane:正如OP所说,这个例子是人为的。但“不喜欢”部分的根源在于安全。如果主机名或用户名以任何方式受到外部用户的影响,那么攻击者可以出于自己的目的接管该外壳。这是快速而正确的。回音字符串需要被引用,但效果很好。谢谢@DanielSchroeder:为您添加了引号。或者,通过subprocess.Popen或直接使用python的时间函数捕获date+%s的输出,然后通过字符串串联来表示字符串,如果您想避免shell=True。。。我见过一些人不喜欢shell=True…:D@anishsane:正如OP所说,这个例子是人为的。但“不喜欢”部分的根源在于安全。如果主机名或用户名以任何方式受到外部用户的影响,则攻击者可以出于自己的目的接管该shell。无关:您可以调用Python中的inttime.time来模拟date+%s shell命令。无关:您可以调用Python中的inttime.time来模拟date+%s shell命令。