ReportIP.ps1

Я опять остался без выделенного IP-адреса, но на этот раз мне было лень настраивать DynDns, тем более что моя учетная запись там была удалена по причине неиспользования. На этот раз я решил написать скриптик, который будет проверять внешний ip-адрес моего домашнего сервера, и в случае его изменения сообщать мне новый адрес по электронной почте. Оказалось что это вовсе не сложно🙂

Итак, нам понадобится:

Скрипт Send-SmtpMail.ps1 для отправки почты. Брать тут.

Зашифрованный пароль для подключения к gmail. Пароль можно зашифровать такой вот строчкой (подробнее тут):

Read-Host -Prompt "Enter password" -AsSecureString | ConvertFrom-SecureString | Set-Content password.txt

После ввода пароля он будет сохранён в файле password.txt, и расшифровать его можно будет только под той же учетной записью под которой он был зашифрован.

Внешний IP адрес я получал с помощью запроса на специальную страничку на utorrent.com. Вообще она предназначена для проверки доступности порта, но кроме этого показывает и ip-адрес, и его достаточно просто выцепить🙂

Ну и непосредственно скрипт:

# Создаем объект webclient для выполнения http запроса
$WebClient = New-Object system.net.webclient
# Загружаем ответ на запрос в переменную $result
$result = $WebClient.DownloadString("http://www.utorrent.com/testport.php?port=123")
# Выцепляем из результата IP-адрес с помощью регулярного выражения. Ниже краткий ликбез :)
# \d - любая цифра
# \. - точка
# [\d\.] - цифра или точка
# [\d\.]+ - одна или более цифр или точек
# ([\d\.]+) - одна или более цифр или точек будут помещены в "группу захвата" ($matches[1])
# \.{3} - три точки подряд
if ($result -match "Checking port 123 on ([\d\.]+)\.{3}")
{
    # Помещаем ip-адрес в переменную $ip
    $ip = $matches[1]
    # Загружаем из файла сохранённый старый ip, -ErrorAction указывает что если файл 
    # отсутствует - ничего страшного, и не надо ругаться.
    $oldip = Get-Content D:\Scripts\Ip.txt -ErrorAction "SilentlyContinue"
    # Если новый ip не совпадает со старым ip, то отправляем сообщение
    if ($oldip -ne $ip)
    {
        # Обновляем ip в файле
        $ip | Set-Content D:\Scripts\Ip.txt
        
        # Загружаем сохранённый пароль из файла, и цепляем к нему логин.
        $SecStr = Get-Content D:\Scripts\password.txt | ConvertTo-SecureString
        $cred = New-Object System.Management.Automation.PSCredential("MyGmailLogin",$SecStr)

        # Отправляем сообщение
        D:\Scripts\Send-SmtpMail.ps1 -Server smtp.gmail.com `
        -From MyGmailLogin@gmail.com -To MyGmailLogin@gmail.com `
        -Body "Внешний IP адрес: $ip" -Subject "IP report" `
        -SSL -Credentials $cred
    }
}

Я сохранил его как ReportIp.ps1 и затем поместил в планировщик заданий, чтобы тот выполнялся каждый час.

ReportIp1

Еще раз обращаю внимание что скрипт должен выполнятся от имени той же учетной записи под которой был сохранён пароль.

ReportIp2

ReportIp3

Вот и всё, пока вроде работает🙂

комментария 4 to “ReportIP.ps1”

  1. Андрей Бешков Says:

    Кстати, заодно расскажи как ты этот скрипт запускаешь автоматически. Чтобы у народа было законченное решение.

  2. Xaegr Says:

    Андрей, дык внимательнее читай😉

  3. T Says:

    Ещё , для удобного определения своего IP адреса из программы , существуют сайты:
    http://www.myip.ru/
    http://ipid.shat.net/iponly/

  4. Xaegr Says:

    2 T: Отличное дополнение, спасибо🙂


Обсуждение закрыто.

%d такие блоггеры, как: