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"

Asked By: insecure-IT

||

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')
Answered By: Tom Fenech

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 ".

Answered By: juhist

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

Answered By: David Fligelstone
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.