Invoke-RestMethod PowerShell Google DDNS - PullRequest
       18

Invoke-RestMethod PowerShell Google DDNS

1 голос
/ 13 апреля 2020

У меня, похоже, много проблем с этим, казалось бы, базовым c сценарием для обновления моего IP с помощью службы DDNS Google.

#Fetch current IP address
$ipuri = "https://api.ipify.org"
$ip = Invoke-RestMethod -Uri $ipuri
#Send fetched IP address to Google Domains through their API
$uri = "https://username:password.google.com/nic/update?hostname=home.domain.com&myip="$ip""
Invoke-RestMethod -Method 'Get' -Uri $uri

Первая проблема связана с переменной $ ip. Он не выдает выходных данных, если я сохраняю $ ip, но без него работает нормально (он мне нужен как переменная, поскольку я использую его позже).

Вторая проблема связана с https://username:password@domains.google.com/nic/update?hostname=home.domain.com&myip="$ ip".

Это прекрасно работает, если я помещаю точную строку в почтальон (подставляя фактический IP-адрес вместо $ ip), но не может отправить что-либо, даже если я запускаю его с вставленной вручную IP (например, https://username:password@domains.google.com/nic/update?hostname=home.domain.com&myip=1.2.3.4) в PowerShell.

PS В своем фактическом коде я подставляю правильное имя пользователя и пароль (предоставленные Google) и правильный субдомен, домен, top- домен уровня, как он относится ко мне.

Есть мысли по этому поводу?

РЕДАКТИРОВАТЬ: обновленный (и рабочий) код выглядит следующим образом:

#Fetches current IPv4 address
$ipuri = "https://api.ipify.org"
$ip = Invoke-RestMethod -Uri $ipuri
#Stores Google-provided username and password
$password = ConvertTo-SecureString "password" -AsPlainText -Force
$credential = New-Object Management.Automation.PSCredential ('username', $password)
#Send fetched IP address to Google Domains through their API
$uri = "https://domains.google.com/nic/update?hostname=home.domain.com&myip=$($ip)"
Invoke-RestMethod -Method 'POST' -Uri $uri -Credential $credential

1 Ответ

0 голосов
/ 13 апреля 2020

Во-первых, это аккуратный сервис, api.ipify.org, мне придется использовать его в будущем.

Во-вторых, я думаю, что единственная проблема здесь - это ваше определение $url ,

Синтаксис, который вы использовали ранее, фактически выдает ошибку, если вы пытаетесь запустить строку самостоятельно, ошибка, показанная здесь.

"https://username:password.google.com/nic/update?hostname=home.domain.com&myip="$ip""
At line:1 char:81
+ ... e:password.google.com/nic/update?hostname=home.domain.com&myip="$ip""
+                                                                     ~~~~~
Unexpected token '$ip""' in expression or statement.

В PowerShell вы должны использовать синтаксис расширения строки, как этот, вместо вложенных кавычек.

$uri = "https://username:password.google.com/nic/update?hostname=home.domain.com&myip=$($ip)"

Обновление

Здесь вы найдете документы по API https://support.google.com/domains/answer/6147083?hl=en. Они говорят, чтобы предоставить ваше имя пользователя и пароль, используя Basi c Auth, что делает закодированную в base64 строку ваших учетных данных. Мы можем сделать это в PowerShell довольно легко!

Вы можете предоставить свои учетные данные, используя командлет Get-Credential для их сохранения, затем передать их в Invoke-RestMethod и добавить -Credential и -Authentication в качестве параметров. Вот как будет выглядеть законченное решение.

$ipuri = "https://api.ipify.org"
$ip = Invoke-RestMethod -Uri $ipuri
#Send fetched IP address to Google Domains through their API
$myCredential = Get-Credential #you'll be prompted to provide your google username and pwd.  
$uri = "https://domains.google.com/nic/update?hostname=home.domain.com&myip=$($ip)"
Invoke-RestMethod -Method 'POST' -Uri $uri -Credential $myCredential -Authentication Basic

...