[RndTbl] determine IP address in linux

Adam Thompson athompso at athompso.net
Sun Mar 24 11:49:37 CDT 2013


There is (AFAIK) no generic, portable, standardized solution.
Reasons:
1. No UNIX system is guaranteed to have networking at all, never mind 
TCP/IP.
2. POSIX doesn't cover networking configuration commands (that I can 
find, anyway)
3. LSB doesn't cover networking configuration commands (that I can 
find)

To be portable across multiple versions, you have to check for various 
things:
1. existence of 'ip' command from iproute/iproute2 (and acceptable 
output)
2. if not, then existence of ifconfig (and at least two forms of 
output) isn't guaranteed either

There *is* one standardized way to get the info on any Linux kernel 
from the last ~10 years, but you can't do it from shell.  Use 
AF_NETLINK, which is what ip(8) does internally.  Bad design, IMHO... 
should have been exported via /proc or /sys to conform to the 
"everything is a file" paradigm.

See attached for how you would portably handle the four cases I'm aware 
of in bash.  Note that there are some bash-specific constructs in there. 
It's probably runnable under ksh, but the new-style conditionals 
definitely don't run in dash(1).

Obviously, the script could be made a LOT more compact.

-Adam



On 2013-03-23 22:40, Trevor Cordes wrote:
> Seems simple.  What's the best way (in a script) to get the IP 
> address of
> an ethernet interface (in linux).  For instance eth0.
>
> I used to have (perl, but also applies as a bash solution):
>
> $eip=`/sbin/ifconfig $int | grep 'inet addr' | awk '{print \$2}' |
> sed -e 's/.*://'`
>
> But the latest upgrade from F16 to F17 broke this (now the line 
> contains
> "inet" but not "inet addr".
>
> So I started thinking of finding the most standardized way that
> (hopefully) won't change after a future kernel upgrade :-)
>
> It would seem that the less field parsing done, the better, as 
> keywords
> and field position aren't guaranteed.
>
> Looks like ifconfig is now deprecated (according to man ifconfig).  
> So now
> I'm doing:
>
> $eip=`ip -o -4 addr list eth0 | awk '{print \$4}'`
>
> That works now, but it still has a output format-dependent 
> requirements.
>
> I looked for /sys or /dev files, but can't find any that have ip4 
> addr.  I
> tried to find more options to whittle ip's output to give me just the
> address, no joy there.
>
> Ideas?
>
> PS: this is important as failures like this force me to drive out 
> onsite
> to headless boxes, some of which are 200km away.
> _______________________________________________
> Roundtable mailing list
> Roundtable at muug.mb.ca
> http://www.muug.mb.ca/mailman/listinfo/roundtable
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: getip_example.sh
URL: <http://www.muug.mb.ca/pipermail/roundtable/attachments/20130324/2c94bd0b/attachment.ksh>


More information about the Roundtable mailing list