Обнаружение внешнего IP из командной строки FreeNAS
Есть ли какая-либо функция командной строки в производной FreeNAS (FreeBSD), которая могла бы вернуть мой внешний адрес? Поскольку этот же адрес синхронизируется с DynDns (через маршрутизатор), в C# я получил это с помощью DNS-запроса, например:
var hostEntry = Dns.GetHostEntry("myexternalname.dyndns.org");
foreach (var iAddress in hostEntry.AddressList) {
if (iAddress.AddressFamily == AddressFamily.InterNetwork) {
MessageBox.Show(iAddress);
}
}
3 ответа
Решение
Я нашел команду, которая работает на FreeNAS.
# host myexternalname.dyndns.org
Возвращается
myexternalname.dyndns.org A 89.172.197.320
Из этого я просто использую awk:
host myexternalname.dyndns.org | awk '{ print $3; }'
и это возвращает только IP:
89.172.197.320
PS Я знаю, что 89.172.197.320 не является реальным IP-адресом. Я написал это так, чтобы не передавать мой IP-адрес (или IP-адрес от кого-то еще).
PPS Спасибо за помощь Kronick и Avery Payne, так как их идеи подтолкнули меня в правильном направлении.
Вот моя любимая команда:
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
просто. Чисто. и если у вас есть curl:
curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
Предпосылки
- копать землю
- Gnu Grep
- GNU TR
- GNU AWK
- Сортировать
- уник
Из командной строки:
dig yourserver.dyndns.org | grep "IN" | grep "[0-9]" | awk '{print $5}' | sort | uniq
Хорошо:
- Очень простая последовательность каналов возвращает как минимум один IP-адрес.
- Может обрабатывать несколько IP-адресов для одного и того же имени.
Плохо:
- в результате выкачивает текст, а это значит, что вам, вероятно, понадобится перенаправление в файл
- Я могу вспомнить хотя бы один крайний случай, когда этот скрипт может потерпеть неудачу, хотя он "достаточно хорош"
Уродливый
- Сценарий далеко не оптимален. Я просто ударил его за несколько минут.
- Слишком много зависимостей командной строки.
- Хотя команды довольно общие, цепочка инструментов специфична для GNU.
- Лучше написано на Perl или Python как монолитный скрипт.