我正在尝试在我编写的脚本中将IP地址(inet)作为参数使用。
在Unix终端中,是否有一种简单的方法可以仅获取IP地址,而不必查看ifconfig
?
我正在尝试在我编写的脚本中将IP地址(inet)作为参数使用。
在Unix终端中,是否有一种简单的方法可以仅获取IP地址,而不必查看ifconfig
?
使用这个一行脚本:
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(Ubuntu测试通过)都可以工作。
ifconfig en0
或ifconfig eth1
等来调用它 :) - jaygoobyip route | grep src
注意:此方法仅在您连接到互联网时才有效。/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
这里是我的版本,你可以传递一个按优先级排序的接口列表:
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 $@
如果我同时连接了VPN、WiFi和以太网,那么我的VPN地址(在接口tap0上)将被返回。该脚本适用于Linux和OSX,并且可以带参数,如果您想覆盖IFLIST。
请注意,如果您想使用IPV6,则必须将“inet”替换为“inet6”。
默认路由的IPv4地址:
ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet )[^ /]+"
默认路由的IPv6地址:
ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet6 )[^ /]+"
这些只需要使用命令ip
和grep
,并支持-P
和-o
选项。需要使用head -1
是因为当系统的网络设置足够复杂时,ip route
可能会显示多个默认路由。
如果你不关心IP地址的顺序,只需执行以下命令即可:
ip route | grep -Po '(?<=src )[^ ]+'
或者
hostname --all-ip-addresses
ip
命令但不支持grep -Po
,则可以用sed
或awk
替换它。grep -Po
未被POSIX定义...但是POSIX没有定义任何网络命令,因此您无法仅使用POSIX工具来完成此操作。 - Mikko Rantalainen另一种方法来完成它。
我经常需要检查各种接口(例如eth0,隧道等)的IP地址。
这就是我如何做到的:
ip -4 -br a | awk '{print $1,$3}'
输出:
$ ip -4 -br a | awk '{print $1,$3}'
lo 127.0.0.1/8
eth0 192.168.0.248/24
tun0 192.168.119.1
ip -4 -br a | awk '{print $3}'
127.0.0.1/8
192.168.0.248/24
192.168.119.124/24
$ alias me="ip -4 -br a | awk '{print \$1,\$3}'"
$ me
lo 127.0.0.1/8
eth0 192.168.0.248/24
tun0 192.168.119.124/24
我还没有看到使用命令行工具控制NetworkManager的nmcli
的任何答案。
所以这里是:
wolf@linux:~$ nmcli device
DEVICE TYPE STATE CONNECTION
eth1 ethernet unavailable --
eth0 ethernet unmanaged --
lo loopback unmanaged --
wolf@linux:~$
lo
),请按如下操作:wolf@linux:~$ nmcli device show lo
GENERAL.DEVICE: lo
GENERAL.TYPE: loopback
GENERAL.HWADDR: 00:00:00:00:00:00
GENERAL.MTU: 65536
GENERAL.STATE: 10 (unmanaged)
GENERAL.CONNECTION: --
GENERAL.CON-PATH: --
IP4.ADDRESS[1]: 127.0.0.1/8
IP4.GATEWAY: --
IP4.ROUTE[1]: dst = 127.0.0.0/8, nh = 0.0.0.0,>
IP4.ROUTE[2]: dst = 127.0.0.1/32, nh = 0.0.0.0>
IP6.ADDRESS[1]: ::1/128
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = ::1/128, nh = ::, mt = 256
IP6.ROUTE[2]: dst = ::1/128, nh = ::, mt = 0, >
wolf@linux:~$
但是,如果您只想获取IP地址,请将输出发送到grep
、cut
或awk
。
让我们一步一步来。 (不确定哪里出了问题,这3个示例的代码样本格式都不起作用。)
获取IPv4行
wolf@linux:~$ nmcli device show lo | grep 4.A IP4.ADDRESS[1]: 127.0.0.1/8 wolf@linux:~$
使用awk
获取IP
wolf@linux:~$ nmcli device show lo | awk '/4.A/ {print $2}' 127.0.0.1/8 wolf@linux:~$
使用cut
删除CIDR注释(/8)
wolf@linux:~$ nmcli device show lo | awk '/4.A/ {print $2}' | cut -d / -f1 127.0.0.1 wolf@linux:~$
您的答案在这里。
请注意,使用我刚才演示的工具有很多方法可以实现它。nmcli device show lo | grep 4.A
nmcli device show lo | awk '/4.A/ {print $2}'
nmcli device show lo | awk '/4.A/ {print $2}' | cut -d / -f1
以下是这三个命令的示例输出
命令1的输出
IP4.ADDRESS[1]: 127.0.0.1/8
命令2输出
127.0.0.1/8
命令3的输出
127.0.0.1
nmcli -g IP4.ADDRESS device show lo | cut -d / -f 1
。 - Jean Spector当在NAT主机上查找外部IP地址时,很多答案建议使用基于HTTP的方法,如ifconfig.me
。
$ curl ifconfig.me/ip
$ dig +short myip.opendns.com @resolver1.opendns.com
我在我的~/.bashrc
中有这个方便的别名:
alias wip='dig +short myip.opendns.com @resolver1.opendns.com'
以下两种方法对我有效:
获取接口eth0的IP地址。在下面的示例中,将eth0替换为您的接口名称。
ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "
使用主机名: 这将给出您的etho的inet即IPAddress。使用-I将为所有接口提供具有此值的inet值。
hostname -i
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
显示所有IP地址