I'm trying to use just the IP address (inet) as a parameter in a script I wrote.
Is there an easy way in a unix terminal to get just the IP address, rather than looking through ifconfig
?
I'm trying to use just the IP address (inet) as a parameter in a script I wrote.
Is there an easy way in a unix terminal to get just the IP address, rather than looking through ifconfig
?
You can write a script that only return the IP like:
/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'
For MAC:
ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2
Or for linux system
hostname -i | awk '{print $3}' # Ubuntu
hostname -i # Debian
This will give you all IPv4 interfaces, including the loopback 127.0.0.1:
ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
This will only show eth0
:
ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
And this way you can get IPv6 addresses:
ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'
Only eth0
IPv6:
ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'
Generally, it is never guaranteed that a system will only have one IP address, for example, you can have both an ethernet and wlan connections, and if you have an active VPN connection then you'll have yet another IP address.
On Linux, hostname -I
will list the current IP address(es). Relying on it always returning just one IP address will most likely not work as expected under some scenarios (i.e. a VPN link is up), so a more reliable way would be converting the result to an array and then loop over the elements:
ips=($(hostname -I))
for ip in "${ips[@]}"
do
echo $ip
done
On OSX, if you know the interface, you could use:
~$ ipconfig getifaddr en0
192.168.1.123
which will return just the IP address.
Or you could loop over possible interface names, starting with a suffix, i.e. en
:
for NUMBER in $(seq 0 5); do
ip=`ipconfig getifaddr en$NUMBER`
if [ -n "$ip" ]; then
myip="$ip"
break
fi
done
echo $myip
Also, getting the IP address becomes non-deterministic in case both a cable and wifi connections are established, when a machine has more than one ethernet interfaces, or when VPN tunnels are present.
If you need the external IP, then you can query a text-mode service, for example curl ipecho.net/plain
would return a plain text external IP.
On latest Ubuntu versions (14.04 - 16.04), this command did the trick for me.
hostname -I | awk '{print $1}'
hostname -I
This command will give you the exact ip address as you want in Ubuntu.
If you have limited environment, you may use this command:
ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
Command ifconfig
is deprected and you should use ip
command on Linux.
Also ip a
will give you scope on the same line as IP so it's easier to use.
This command will show you your global (external) IP:
ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'
All IPv4 (also 127.0.0.1):
ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'
All IPv6 (also ::1):
ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'
We can simply use only 2 commands ( ifconfig + awk ) to get just the IP (v4) we want like so:
On Linux, assuming to get IP address from eth0
interface, run the following command:
/sbin/ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'
On OSX, assumming to get IP adddress from en0
interface, run the following command:
/sbin/ifconfig en0 | awk '/inet /{print $2}'
I wanted something simple that worked as a Bash alias. I found that hostname -I
works best for me (hostname v3.15). hostname -i
returns the loopback IP, for some reason, but hostname -I
gives me the correct IP for wlan0, and without having to pipe output through grep or awk. A drawback is that hostname -I
will output all IPs, if you have more than one.
To get only the IP address on Mac OS X you can type the following command:
ipconfig getifaddr en0
That would do the trick in a Mac :
ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')
That resolved to ping 192.168.1.2
in my machine.
Pro tip: $(...)
means run whatever is inside the parentheses in a subshell and return that as the value.
Use the following command:
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
Here is my version, in which you can pass a list of interfaces, ordered by priority:
getIpFromInterface()
{
interface=$1
ifconfig ${interface} > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}
getCurrentIpAddress(){
IFLIST=(${@:-${IFLIST[@]}})
for currentInterface in ${IFLIST[@]}
do
IP=$(getIpFromInterface $currentInterface)
[[ -z "$IP" ]] && continue
echo ${IP/*:}
return
done
}
IFLIST=(tap0 en1 en0)
getCurrentIpAddress $@
So if I'm connected with VPN, Wifi and ethernet, my VPN address (on interface tap0) will be returned. The script works on both linux and osx, and can take arguments if you want to override IFLIST
Note that if you want to use IPV6, you'll have to replace 'inet ' by 'inet6'.
I always wind up needing this at the most unexpected times and, without fail, wind up searching for threads like this on SO. So I wrote a simple script to get IPv4 addresses via netstat, called echoip
- you can find it here. The bash for network addresses looks like this, it also gets your public address from ipecho.net:
IPV4='\d+(\.\d+){3}'
INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1`
INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"`
for i in "${!INTERFACES[@]}"; do
printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}"
done
The echoip
script yields an output like this:
$ echoip
public: 26.106.59.169
en0: 10.1.10.2
use this one line script:
ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}'
mac & linux (tested in ubuntu) both works.
In man hostname
there is even more easier way which automatically excluding loopback IP and showing only space separated list of all assigned to host ip addresses:
root@srv:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19
root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/void
inet 11.12.13.14/32 scope global venet0:0
inet 192.168.15.19/32 scope global venet0:1
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
shows all your ips
On Redhat 64bit, this solved problem for me.
ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'
You can also use the following command:
ip route | grep src
NOTE: This will only work if you have connectivity to the internet.
curl ifconfig.co
This returns only the ip address of your system.
I would Use Hostname -L
to get just the IP to use as a variable in a script.