ins*_*-IT 3 python bash python-2.7
我正在尝试使用标准的bash脚本编写一个monit配置文件,如果是python的话os.system(),这个字符串是我想模仿的.
echo -e "\t" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用的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')
Run Code Online (Sandbox Code Playgroud)
这是使用所有四个os.system()语句编写的内容.start program = /etc/init.d/snortd00 start
我正在寻找这个 start program = "/etc/init.d/snortd00 start"
只需使用原始字符串以避免双重转义(一次用于python,一次用于shell):
cmd = r'echo -e "\t" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit'
os.system(cmd)
Run Code Online (Sandbox Code Playgroud)
正如三元组在评论中指出的那样,os.system正在被子进程取代,所以上面的代码将改为:
subprocess.call(cmd, shell=True)
Run Code Online (Sandbox Code Playgroud)
更好的是,只需使用python:
with open("/etc/monit.d/ips_svcs.monit", "a") as file:
file.write('\t start program = "/etc/init.d/snortd00 start"\n')
Run Code Online (Sandbox Code Playgroud)
让我们考虑一下为什么您现有的方法不起作用:
在这种情况下,\由Python的处理,使外壳得到两个连续的“字符的外壳看到的。""/etc..."":
os.system('echo -e \"\t\" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)
这与以前的相同:\由Python处理:
os.system('echo -e \"\t\" start program = \"\"/etc/init.d/snortd00 start\"\" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)
在这种情况下,shell会显示“ / etc ...”:
os.system('echo -e \"\t\" start program = "/etc/init.d/snortd00 start" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)
同样在这种情况下,Python处理\并且外壳程序看到""/etc..."":
os.system('echo -e \"\t\" start program = "\"/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)
现在,您想要什么:
os.system('echo -e \"\t\" start program = \\"/etc/init.d/snortd00 start\\" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)
在这里,Python \\进入\Shell并看到Shell \",Shell 调用了echo真正看到的Shell 的转义机制"。