-
-
Save cyrusboadway/5a7b715665f33c237996 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
### Google Domains provides an API to update a DNS "Syntheitc record". This script | |
### updates a record with the script-runner's public IP, as resolved using a DNS | |
### lookup. | |
### | |
### Google Dynamic DNS: https://support.google.com/domains/answer/6147083 | |
### Synthetic Records: https://support.google.com/domains/answer/6069273 | |
USERNAME="" | |
PASSWORD="" | |
HOSTNAME="yoursubdomain.yourdomain.here" | |
# Resolve current public IP | |
IP=$( dig +short myip.opendns.com @resolver1.opendns.com ) | |
# Update Google DNS Record | |
URL="https://${USERNAME}:${PASSWORD}@domains.google.com/nic/update?hostname=${HOSTNAME}&myip=${IP}" | |
curl -s $URL |
How do I use this if I have more than 1 subdomain?
For the record, all of this is based on the Dyn API developed in the 90s and most vendors support it for dynamic updates. You can check for details here:
Should it work the same way if my agent has a n IPv6 address? Because it doesn't seem to work for me.
The documentation suggests the API supports IPv6 updates.
https://support.google.com/domains/answer/6147083
You may need to modify the script to url-encode the ip address (the colons in particular). Rather than composing the Url as a single string, you could add the data parameters component through curl's method, which will do the encoding:
curl --data-urlencode "myip=${IP}" https://domains.google.com/etc
.
Thanks for the quick response.
The .sh script works and returns "good 'my IPv6 address'".
However my domain only works if I am connected in the same network as the server. But is a type my IPv4 address in a browser on a device that is not in the same network it actually works.
I don't know what's the problem.
This will make it IP4
IP=$( curl -4s "https://domains.google.com/checkip" )
Bonus! Clean output
curl -sw '\n' $URL
I think it would be slightly more secure to do this so your username and password are not in plain text (url) provided you're making an HTTPS request:
curl --user ${USERNAME}:${PASSWORD} -s $URL
I did something similar with python, avoiding calls from google domains. Today I have the script running every 5 minutes.
I'm getting badagent when trying to run in macosx terminal
Nevermind fixed it. Changed to use Google domains to get IP
only posting here because i was drawn in by the search engine... never transmit your username and password in anything but TLS and proper TLS... dont be a fool its not worth it in the end.
you can use this for ip address retrieval
currentipaddress="$(wget -q -O - checkip.dyndns.org | sed -e 's/.Current IP Address: //' -e 's/<.$//')"
or you can use this if you are directly connected... change to your correct network interface though
currentipaddress="$(ifconfig eth1 | grep -o "inet addr:([0-9]{1,3}.){3}[0-9]{1,3}" | sed 's/inet addr://')"
and this is the curl request that i have formed and it works perfectly everytime.
curloutput=$(curl -s --data-urlencode "hostname=@.domain.com" --data-urlencode "myip=$currentipaddress" -H "Host: domains.google.com" -u "$username:$password" "https://domains.google.com/nic/update")
echo "$curloutput" to wherever you want
I know this is an old thread but you can just send a request to the URL and not include the IP just pass the username and password.
The API will then use the IP the request was sent from.
e.g.
curl https://username:password@domains.google.com/nic/update?hostname=subdomain.yourdomain.com
For more details see the section at the bottom of this page labelled "Using the API to update your Dynamic DNS record"
https://support.google.com/domains/answer/6147083?hl=en-GB
I had to change line 15 to IP=$( curl ifconfig.me )
. Other than that the script works.
A stare is born
You can also use Google Domains to get your public IP address.
IP=$(curl -s "https://domains.google.com/checkip")
In my Gist, I fetch the current record Google has, and compare it to my public IP before trying to submit an update. I also examine the response and echo out a more detailed status update.