9

Что было бы проще всего найти по сценарию, если мой IP-адрес изменился?


Справочная информация:

У меня есть стандартный домашний кабельный модем, и мой провайдер назначает мне динамический IP. Время от времени оно меняется, время аренды DHCP кажется нерегулярным.

По сути, я занимаюсь собственным динамическим DNS и могу обновлять записи DNS, указывающие на мой домашний сервер, одним щелчком мыши. Осталось только обнаружить изменение IP-адреса, чтобы я мог полностью автоматизировать процесс.

Теперь есть несколько веб-сайтов, которые могут вернуть ваш IP-адрес, и я мог бы использовать задание cron, чтобы wget одну из этих страниц и grep с нее IP-адрес ... Но это кажется излишним с точки зрения использования процессора / пропускной способности, и это не очень KISS.

Я пропускаю какой-то простой и элегантный способ получить мой публичный IP и проверить, изменился ли он?

Дополнительная информация: мой модем / роутер - дешевый кирпич, в этом отношении он не очень интересен. Мой сервер работает с Centos 6.

6 ответов6

6

Вы можете запросить любой веб-сайт, который отображает ваш IP для этой задачи. Используя checkip.dyndns.com, так как он это text.only.

Пример:

wget -q -O - checkip.dyndns.com | grep -Po "[\d\.]+"
4

Предполагая, что вы находитесь за NAT, самый элегантный способ, который я могу придумать, - это запустить задание cron на самом маршрутизаторе, периодически проверяя, не слишком ли ifconfig и проверяет его текущий адрес WAN. Это может быть даже возможно на «дешевом кирпиче», если вы можете установить пользовательскую прошивку. Однако элегантный, вряд ли простой.

Как обсуждалось здесь, в Windows, но аргумент в равной степени действителен для Centos, при опросе IP-адреса WAN из-за NAT вы сталкиваетесь с проблемой, что у вас технически нет внешнего адреса. Вместо этого вы маршрутизируете через один на усмотрение маршрутизатора. Очевидно, что вы по-прежнему будете иметь доступ к этой информации, пока маршрутизатор находится под вашим контролем, но универсального способа передачи этого IP-адреса хостам в локальной сети не существует. В результате ваш сервер не может просто запросить у маршрутизатора внешний IP-адрес, который он будет использовать.

Наиболее эффективной альтернативой было бы просто позволить маршрутизатору сделать свое волшебство и фактически установить соединение с внешним сервером, а затем попросить его вернуть адрес, с которого был получен запрос. Многие веб-серверы были созданы специально для этой цели. Для сценариев я могу порекомендовать http://icanhazip.com/, так как он не требует дальнейшего анализа с вашей стороны (только IP возвращается в виде простого текста).

При необходимости ответы на вопрос, связанный с ранее, должны содержать множество советов по реализации.

0

Предыдущие ответы, исключая реализацию PS, на самом деле не говорят вам, изменился ли IP. (Я хочу любить PowerShell. Райан проделал хорошую работу по выявлению причин, по которым я этого не делаю: разрешения на безопасность выполнения мешают.

Парсинг IP не является необходимым, пока любой дополнительный вывод не изменяется, тогда как IP-адрес не изменился. Например, checkip.dyndns.com возвращает что-то вроде текущего IP-адреса: ddd.ddd.ddd.ddd. Таким образом, достаточно просто сравнить весь вывод.

Также, если вы используете curl, вы можете скрыть прогресс, используя флаг -s. Поскольку он написан на stderr, он не загрязняет стандартный вывод.

Итак, вот простой скрипт .cmd, который использует curl для сохранения вывода. Затем он использует FC для сравнения с предыдущим выводом, если таковой имеется. Мне не нужно устанавливать параметры FC для Unicode, чувствительности к регистру и т.д., Поскольку выходные данные должны быть двоичными, если IP-адрес не изменился. У Unix есть cmp вместо FC.

@REM 12/30/2017 The following work:
@REM                checkip.dyndns.com
@REM                wtfismyip.com/text
@REM                icanhazip.com
@REM                ifconfig.me/ip -- can be slow

curl icanhazip.com > CurrentIp.txt
fc /B LastIp.txt CurrentIp.txt 1> nul: 2>>&1

if ERRORLEVEL 1 (
    ECHO Ip Changed
    REM Remember for next time
    MOVE /Y CurrentIp.txt LastIp.txt 1>nul:
    exit /b 1
) else (
    ECHO Ip not Changed
)

Очевидно, что CurrentIp.txt LastIp.txt можно изменить, чтобы он подходил, например, префикс с «% TMP%\». Этот сценарий должен работать из планировщика задач с небольшими изменениями.

0

В ответ на OP: «Я упускаю какой-то простой и элегантный способ получить мой публичный IP и проверить, изменился ли он?"

Действительно простой ответ - нет. Просто периодически обновляйте свой IP.

Это кажется расточительным, но "умные" решения просто более сложны и менее надежны, без экономии ресурсов процессора, пропускной способности и т.д. Отправка 1500 байт или меньше (пакет) один раз в час - это очень дешево. Весь год будет потреблять 365 * 24 * 1500 = 13 мегабайт или около 3 минут стрелка на Netflix.

Стоимость процессора / полосы пропускания для получения вашего внешнего ip и периодической публикации нового ip, скорее всего, выше, чем просто избыточная периодическая публикация вашего ip. Я публиковал свой ip на duckdns каждый час в течение многих лет, без проблем. Очевидно, что если вы начнете делать это 1 / секунду, ваша доменная служба может понять это и разозлиться. Точно так же любой сервис, который вы используете для поиска вашего ip, не будет счастлив, если вы сделаете это.

Еще одна мысль: вопрос, который вы задаете, является частью проблемы, которую вы упоминаете. Триггер для обновления вашего динамического DNS может быть, когда ваше доменное имя не разрешается на ваш сервер. Вы можете использовать ping, но если ваш старый IP-адрес будет повторно использован, новый владелец IP-аренды вполне может ответить на ping.

Имея это в виду, вы можете периодически пытаться загрузить небольшой файл подписи / магии с вашего сервера. На самом деле это может быть любой статический файл, который сообщает вам, что вы нашли свой сервер, даже ваша домашняя веб-страница будет работать, но необычное имя будет намного лучше, чем default.html.

Если d/l не удается, обновите ваш IP, очистите кэш DNS и попробуйте снова. Обновление может занять несколько минут, в зависимости от службы DNS. Этот подход устраняет зависимость от какого-либо другого внешнего ip-сайта и фактически проверяет то, что вы действительно хотите знать: могут ли другие зайти на мой сайт?

0

У меня был тот же вопрос сегодня, и я не был удовлетворен ответами, которые я видел здесь или в Google, поэтому я написал сценарий PowerShell для отправки мне уведомления Slack при каждом изменении моего IP-адреса.

Если вы предпочитаете получать электронную почту, вы можете щелкнуть ссылки в сценарии, чтобы посмотреть другую версию, поддерживающую электронную почту Outlook.

Я надеюсь, что это помогает кому-то и зарабатывает голос. :-)

Сохраните следующий текст в файл .ps1. Отредактируйте его соответствующим образом, используя собственный URL-адрес Slack. Сохранить. Щелкните правой кнопкой мыши файл, чтобы "Запустить с PowerShell".

Или вы можете запланировать его запуск ежедневно или как часто.

#Script to compare current IP with old IP and sends Slack notification if different (and do nothing if there was no change).
#We can put this as a scheduled task to run daily.
#ScriptName: IP_change_detection_notification.ps1

$slackWebhookUrl = "XXXXXXXXXX" #put yours here
$ipDetectionUrl = "https://wtfismyip.com/text"
$IPAddFile = "C:\code\IP_change_detection_notification.dat" #absolute path to file that stores the old IP record
$slackOutputFile = "C:\code\IP_change_detection_notification_Slack.txt"
$optionalDebuggingFile = "C:\code\IP_change_detection_notification_debugging.txt"

$Request = Invoke-WebRequest $ipDetectionUrl
$IP_new = ($Request.Content.Trim())
Write-Host "Current IP address: [$IP_new]"

#Check if old IP record exists
If(Test-Path "$IPAddFile")
{
#Get old IP
$IP_old = Get-Content "$IPAddFile"
    #Compare IPs
    if(-not($IP_new -eq $IP_old))
    {
        Write-Host "Old IP address: [$IP_old]"
        $msg = "Your WAN IP has changed to $IP_new (was $IP_old)!"
        Write-Host "$msg"               
        $body = $("{""text"":""$msg""}")
        Write-Host "$body"
        Invoke-RestMethod -Uri $slackWebhookUrl -Method Post -ContentType 'application/json' -Body $body -OutFile $slackOutputFile

        "Notification Sent"     

        #Overwrite and update new IP
        $IP_new |  Out-File $IPAddFile

    }
    else
    {"No change, no notification"}

}
else
{
#Create new, as file not found
$IP_new |  Out-File $IPAddFile
"File created"
}
$(get-date -f yyyy-MM-dd_HH_mm_ss)  |  Out-File $optionalDebuggingFile
#Read-Host -Prompt "Press Enter to exit" #Comment out this line if this script will be run by a cron job. Otherwise, uncomment it so that you can see the results of the script in the console.

#This script was adapted from https://gallery.technet.microsoft.com/scriptcenter/Detect-IP-address-change-aeb51118 by Satyajit

Чтобы заставить работать планировщик заданий:

Мне пришлось запустить PowerShell от имени администратора, а затем запустить Get-ExecutionPolicy , который затем сказал мне, что моя текущая ExecutionPolicy была "Restricted".

Затем я запустил Set-ExecutionPolicy RemoteSigned (как показано здесь, но это заставляет меня нервничать: https://stackoverflow.com/a/26955050/470749).

Затем из основной командной строки Windows я попытался выполнить следующую команду несколько раз: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1" ( один раз, чтобы сохранить IP, и второй раз, чтобы проверить, изменился ли он).

(Пока вы не включите это, не пытайтесь использовать Task Scheduler.)

Затем я запланировал задачу с помощью C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe в качестве программы и -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1 в качестве аргументов.

-2

Я использую curl ifconfig.me , но это не то, что я пробовал на платформах, отличных от Debian.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .