Search code examples
pythonawkgateway

Setting Variable to Gateway IP


I have a code so far that filters out everything except the gateway IP (route -n | awk '{if($4=="UG")print $2}'), but I'm trying to figure out how to pipe this to a variable in Python. Here's what I got:

import shlex;
from subprocess import Popen, PIPE;

cmd = "route -n | grep 'UG[ \t]' | awk '{print $2}'";
gateway = Popen(shlex.split(cmd), stdout=PIPE);
gateway.communicate();
exit_code = gateway.wait();

Any ideas?

NOTE: I'm new at this.


Solution

  • For better or worse, your cmd uses a shell pipeline. To use shell features in subprocess, one must set shell=True:

    from subprocess import Popen, PIPE
    cmd = "/sbin/route -n | grep 'UG[ \t]' | awk '{print $2}'"
    gateway = Popen(cmd, shell=True, stdout=PIPE)
    stdout, stderr = gateway.communicate()
    exit_code = gateway.wait()
    

    Alternatively, one could keep shell=False, eliminate the pipeline, and do all the string processing in python:

    from subprocess import Popen, PIPE
    cmd = "/sbin/route -n"
    gateway = Popen(cmd.split(), stdout=PIPE)
    stdout, stderr = gateway.communicate()
    exit_code = gateway.wait()
    gw = [line.split()[1] for line in stdout.decode().split('\n') if 'UG' in line][0]
    

    Because of the vagaries of shell processing, and unless there is a specific need, it is probably best to avoid shell=True.