我试图使用标准的bash脚本编写一个monit配置文件,如果是python' s os.system()
,这个字符串是我想模仿的。
echo -e "\t" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit
以下是我使用os.system()
的尝试。它们都产生相同的结果。其中没有一个在/etc/init.d/snortd00 start
os.system('echo -e \"\t\" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
os.system('echo -e \"\t\" start program = \"\"/etc/init.d/snortd00 start\"\" >> /etc/monit.d/ips_svcs.monit')
os.system('echo -e \"\t\" start program = "/etc/init.d/snortd00 start" >> /etc/monit.d/ips_svcs.monit')
os.system('echo -e \"\t\" start program = "\"/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
这是使用所有四个os.system()
声明编写的内容。 start program = /etc/init.d/snortd00 start
我正在寻找start program = "/etc/init.d/snortd00 start"
答案 0 :(得分:6)
只需使用原始字符串以避免双重转义(一次用于python,一次用于shell):
cmd = r'echo -e "\t" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit'
os.system(cmd)
正如三人在评论中指出的os.system
is being replaced by subprocess,所以上面的代码会改为:
subprocess.call(cmd, shell=True)
更好的是,只需使用python:
with open("/etc/monit.d/ips_svcs.monit", "a") as file:
file.write('\t start program = "/etc/init.d/snortd00 start"\n')
答案 1 :(得分:4)
让我们考虑一下您现有方法无效的原因:
在这种情况下,\
由Python处理,因此shell连续两次获得"字符。 shell看到""/etc...""
:
os.system('echo -e \"\t\" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
这与上一个相同:\
由Python处理:
os.system('echo -e \"\t\" start program = \"\"/etc/init.d/snortd00 start\"\" >> /etc/monit.d/ips_svcs.monit')
在这种情况下,shell会看到" / etc ...":
os.system('echo -e \"\t\" start program = "/etc/init.d/snortd00 start" >> /etc/monit.d/ips_svcs.monit')
在这种情况下,Python处理\
并且shell看到""/etc...""
:
os.system('echo -e \"\t\" start program = "\"/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
现在,你想要的是什么:
os.system('echo -e \"\t\" start program = \\"/etc/init.d/snortd00 start\\" >> /etc/monit.d/ips_svcs.monit')
这里,Python将\\
处理为\
,Shell看到\"
,它会调用shell的转义机制,以便echo
真正看到"
。