How do you "echo" quotes using python's os.system()?
Question:
I’m trying to write to a monit config file using standard bash scripting inside if python’s os.system()
, this string is what I’d like to mimic.
echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit
Here are my attempts using os.system()
. They all produce the same results. None of which are writing the quotes around /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')
This is what is being written using all four os.system()
statments. start program = /etc/init.d/snortd00 start
I’m looking for this start program = "/etc/init.d/snortd00 start"
Answers:
Just use a raw string to avoid double-escaping (once for python, once for the shell):
cmd = r'echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit'
os.system(cmd)
As tripleee points out in the comments, os.system
is being replaced by subprocess, so the code above would change to this:
subprocess.call(cmd, shell=True)
Better yet, just use python:
with open("/etc/monit.d/ips_svcs.monit", "a") as file:
file.write('t start program = "/etc/init.d/snortd00 start"n')
Let’s consider why your existing approaches are not working:
In this case, the
is processed by Python, so the shell gets two consecutive ” characters. The shell sees ""/etc...""
:
os.system('echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit')
This is the same as previous: the
is processed by Python:
os.system('echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit')
In this case, the shell sees “/etc…”:
os.system('echo -e "t" start program = "/etc/init.d/snortd00 start" >> /etc/monit.d/ips_svcs.monit')
In this case also, Python processes
and the shell sees ""/etc...""
:
os.system('echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit')
Now, what you want:
os.system('echo -e "t" start program = \"/etc/init.d/snortd00 start\" >> /etc/monit.d/ips_svcs.monit')
Here, Python processes \
into
and the Shell sees "
, which invokes the escaping mechanism of the shell so echo
really sees "
.
I’m not sure I am following the logic here exactly.
So what would the os.system or subprocess call look like for the command:
cmd = r’echo -n -e x00x04x00x00 | ethercat -p 20 foe_write -o EventLogs -‘
Thanks
I’m trying to write to a monit config file using standard bash scripting inside if python’s os.system()
, this string is what I’d like to mimic.
echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit
Here are my attempts using os.system()
. They all produce the same results. None of which are writing the quotes around /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')
This is what is being written using all four os.system()
statments. start program = /etc/init.d/snortd00 start
I’m looking for this start program = "/etc/init.d/snortd00 start"
Just use a raw string to avoid double-escaping (once for python, once for the shell):
cmd = r'echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit'
os.system(cmd)
As tripleee points out in the comments, os.system
is being replaced by subprocess, so the code above would change to this:
subprocess.call(cmd, shell=True)
Better yet, just use python:
with open("/etc/monit.d/ips_svcs.monit", "a") as file:
file.write('t start program = "/etc/init.d/snortd00 start"n')
Let’s consider why your existing approaches are not working:
In this case, the is processed by Python, so the shell gets two consecutive ” characters. The shell sees
""/etc...""
:
os.system('echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit')
This is the same as previous: the is processed by Python:
os.system('echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit')
In this case, the shell sees “/etc…”:
os.system('echo -e "t" start program = "/etc/init.d/snortd00 start" >> /etc/monit.d/ips_svcs.monit')
In this case also, Python processes and the shell sees
""/etc...""
:
os.system('echo -e "t" start program = ""/etc/init.d/snortd00 start"" >> /etc/monit.d/ips_svcs.monit')
Now, what you want:
os.system('echo -e "t" start program = \"/etc/init.d/snortd00 start\" >> /etc/monit.d/ips_svcs.monit')
Here, Python processes \
into and the Shell sees
"
, which invokes the escaping mechanism of the shell so echo
really sees "
.
I’m not sure I am following the logic here exactly.
So what would the os.system or subprocess call look like for the command:
cmd = r’echo -n -e x00x04x00x00 | ethercat -p 20 foe_write -o EventLogs -‘
Thanks