2017-01-21 3 views
0

Просто начать знакомство с Linux, запутался об этой линии в скриптеConfused об этой линии в сценарии

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 
} 

I`m угадал это, как предполагается, чтобы получить мой 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

ли вы попробуйте запустить его наблюдать, что он делает? – Inian

+0

какая линия? вы выложили скриптлет с 6 строками – rkosegi

ответ

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.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 
+0

Что означает остальная часть этого скрипта, кстати? :) – xtronaltic

+0

@xtronaltic: Не уверен, что вы имеете в виду. Попытался означать, что флаг '-o' будет работать только на IP-адресе и отрицательном совпадении, поэтому' head -1' не имеет значения. – Inian

+0

[-z $ {IP}] && IP = $ (wget -qO- -t1 -T2 ipv4.icanhazip.com) [-z $ {IP}] && IP = $ (wget -qO- -t1 -T2 ipinfo.io/ip) [! -z $ {IP}] && echo $ {IP} || эхо, что это? @Inian – xtronaltic

1

Пусть разобрать его на сегменты:

ip addr - показать информацию о ваших интерфейсах

egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

-o, --only-совпадающего только печати согласованные (непустые) части соответствующей строки, причем каждая такая часть находится на отдельной выходной строке.

Это пытается сопоставить IP-адреса от выхода из ip addr

egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\."

Это исключает IP addeses как 192.168. ., 172.16. . -172.19. . и т.д ...

head -n 1 Это ограничивает выход только первой линии

Так вся команда эффективно пытается найти IP-адрес на ваших интерфейсов, которые не от частных диапазонов.