How do you "echo" quotes using python's os.system()?

11,127

Solution 1

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

Solution 2

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')
Share:
11,127
insecure-IT
Author by

insecure-IT

Updated on June 15, 2022

Comments

  • insecure-IT
    insecure-IT almost 2 years

    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"

  • twalberg
    twalberg about 9 years
    +1 for the proper Python code suggestion... Although, there should probably be a newline in the write() call, since it's not added automatically like print ... would...
  • tripleee
    tripleee about 9 years
    Perhaps also tangentially note that os.system() is being replaced by subprocess although the recommended replacement code is rather unattractive. But maybe that's just to encourage you to use Python's own facilities when that makes sense.