刚开始熟悉linux,对脚本中的这一行感到困惑
get_ip(){
local IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 )
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip )
[ ! -z ${IP} ] && echo ${IP} || echo
}
我猜这应该是我的IP地址?
你们可以向我详细解释一下吗?
这一行ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1
答案 0 :(得分:2)
它是regEx
的组合,用于检查IPv4
地址是否使用正确的语法(第一个),并检查有效IP
是否属于特定范围。
regEx
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
匹配4个八位字节,其长度可以由1-3
组成,由0-9
组成,由.
分隔。这可确保从处理中过滤掉任何IP
地址。
第二个带有-v
标志的反转匹配,即意味着排除这种类型的那个,
^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\.
从
开始排除IPs
192.168
172.16
,172.17
,172.18
,172.19
172.20
,172.21
,172.22
,172.23
高达172.29
172.30
,172.31
,172.32
10.
127.
255.
0.
和head -n 1
在这里无关紧要,因为上述命令仅在整行上单行操作。
至于脚本的其余部分
# This line checks if variable containing the IP address is empty and if it is
# empty i.e. the condition `[ -z ${IP} ] ` turned out to be true set the IP
# address to the value obtained from `wget` output
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )
# same as above
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip )
# with a '!' symbol it means the variable is not empty just print value
# to stdout or (||) print just an empty output (just echo)
[ ! -z ${IP} ] && echo ${IP} || echo
答案 1 :(得分:1)
让我们把它拆分成段:
ip addr
- 显示有关您的界面的信息
egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
-o, - 仅匹配 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
这会尝试匹配ip addr
egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\."
这不包括IP地址,如192.168。。,172.16。。 -172.19。。等......
head -n 1
这会将输出限制为仅第一行
因此整个命令有效地尝试在您的接口上找到不属于私有范围的IP地址。