我正在尝试在我编写的脚本中将IP地址(inet)作为参数使用。
在Unix终端中,是否有一种简单的方法可以仅获取IP地址,而不必查看ifconfig
?
我正在尝试在我编写的脚本中将IP地址(inet)作为参数使用。
在Unix终端中,是否有一种简单的方法可以仅获取IP地址,而不必查看ifconfig
?
我想要一个简单实用的Bash别名。我发现对于我来说hostname -I
效果最好(hostname v3.15)。hostname -i
由于某种原因返回回环IP,但是hostname -I
为我提供了正确的wlan0 IP,而且不需要通过grep或awk管道输出。缺点是,如果您有多个IP,则hostname -I
将输出所有 IP。
仅打印eth0
的IP地址,不显示其他文本:
ifconfig eth0 | grep -Po '(?<=inet addr:)[\d.]+'
要确定您的主要接口(因为它可能不是“eth0”),请使用:
route | grep ^default | sed "s/.* //"
以上两行代码可以合并为一条命令,如下所示:
ifconfig `route | grep ^default | sed "s/.* //"` \
| grep -Po '(?<=inet addr:)[\d.]+'
ifconfig
输出在多个版本中不稳定。有些版本需要inet addr:
,但有些版本只需要inet
。 - Mikko Rantalainen很少有答案使用新的ip
命令(代替ifconfig
),因此这里是一个使用ip addr
、grep
和awk
来简单打印与wlan0
接口相关联的IPv4地址的方法:
ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'
虽然不是最紧凑或最花哨的解决方案,但它(可以说)易于理解(见下面的说明),并且可以修改为其他目的,例如获取 MAC 地址的最后 3 个八位组,如下所示:
ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'
解释:ip addr show wlan0
命令用于输出与名为wlan0
的网络接口相关的信息,其输出结果应该类似于以下内容:
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
inet6 fe80::d340:5e4b:78e0:90f/64 scope link
valid_lft forever preferred_lft forever
grep inet
过滤掉不包含“inet”(IPv4和IPv6配置)的行,grep -v inet6
过滤掉其余包含“inet6”的行,应该会得到像这样的一行: inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
awk
提取了“172.18.18.1/24”字段,第二个去除了网络掩码的简写,只保留了IPv4地址。ipaddr-linux
,如果使用Ruby,则有linux-ip-parser
等。IP地址的简写方式
ip -4 -br addr show enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1
或者简写为
ip -4 -br a s enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1
该命令可在大多数现代Linux发行版中使用。
我们可以仅使用两个命令(ifconfig + awk)来获取所需的IP地址(v4),如下所示:
在Linux上,假设从eth0
接口获取IP地址,运行以下命令:
ifconfig eth0 | awk '/inet /{print $2}'
/sbin/ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'
在OSX上,假设从en0
接口获取IP地址,请运行以下命令:
/sbin/ifconfig en0 | awk '/inet /{print $2}'
要知道我们的公共/外部IP,请在~/.bashrc
中添加此函数
whatismyip () {
curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}
whatismyip
。ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')
在我的机器上,它解析为ping 192.168.1.2
。
专业提示: $(...)
表示在子shell中运行括号内的内容,并将其返回为值。
在 Ubuntu(和类似的Debian发行版)上
查看本地IP地址的方法:
hostname -I | awk '{print $1}'
查看您的全局IP地址:
curl -4 icanhazip.com
curl ifconfig.co //this responds faster
查看有关您(或任何人)的IP地址的所有信息:
whois $(curl ifconfig.co)
whois
,如果没有安装:sudo apt-get install whois
我总是在最意想不到的时候需要它,而且总是不得不在SO上搜索这样的线程。因此,我编写了一个简单的脚本来通过netstat获取IPv4地址,称为echoip
- 你可以在这里找到它。网络地址的bash代码如下,它还从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
echoip
脚本的输出结果如下:
$ echoip
public: 26.106.59.169
en0: 10.1.10.2
man hostname
中,甚至有一种更简单的方式来自动排除环回IP并仅显示分配给主机的IP地址列表,这些地址之间用空格分隔。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