[Cialug] Just Tell Me The IP!

Todd Walton tdwalton at gmail.com
Thu May 21 17:10:41 UTC 2020


I'm running a mix of CentOS, Amazon Linux, and Ubuntu. The CentOS servers
span three generations, the Amazon Linux, like, four. And you know what's
surprisingly complicated to do across a variety of distributions and
versions? Tell me the IP of the server I'm on. Well, if I'm "on" the
server, it's just a couple of quick commands and an eyeball. But I need a
way to do it by script.

Problems include:

* The "ip" command shows up in three different locations, depending on
distribution.
* The "ifconfig" command shows up in 2 different locations.
* You can run those just fine sans sudo, but sbin is typically not in a
user's PATH.
* Network device names vary across distributions.
* Some servers have multiple IPs. I need one, it needs to be from a
"physical" device, and it needs to be the same one every time.
* ip's output varies across versions
* ip has json output, but only for a couple years now, so it's not in any
of my distros </grouse>

Is there just no reliable way to get a server's "primary" IP that works
across distros and distro versions? I wish there was something like
"hostname" that just spat back /the IP address/.

This is what I'm doing right now:

HOSTIP=$(find /sys/devices -type d -name 'net' -not -path '*/virtual/*'
-print | xargs -I% find % -mindepth 1 -maxdepth 1 -exec basename {} + |
grep -P '^e' | xargs -n1 ifconfig | grep 'inet ' | tr -s ' ' | sed -e
's/^[[:space:]]\+//g' -e 's/addr://g' | cut -d\  -f2 | sort | head -n1)
if [[ -z $HOSTIP ]]; then HOSTIP='$(ifconfig | grep 'inet ' | tr -s ' ' |
sed -e 's/^[[:space:]]\+//g' -e 's/addr://g' | cut -d\  -f2 | sort | head
-n1)'; fi
if [[ -z $HOSTIP ]]; then HOSTIP='127.0.0.1'; fi

It's fraught with disappointment, but less than anything else I've tried so
far.

(Also, I didn't realize until this little adventure that xargs will always
run once, even without input, unless you explicitly tell it not to. Ugh.)

--
Todd


More information about the Cialug mailing list