Skip to content

Instantly share code, notes, and snippets.

@cyrusboadway
Created February 20, 2016 17:21
Show Gist options
  • Save cyrusboadway/5a7b715665f33c237996 to your computer and use it in GitHub Desktop.
Save cyrusboadway/5a7b715665f33c237996 to your computer and use it in GitHub Desktop.
Script to update a Google Domains DNS record
#!/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
@raceybe
Copy link

raceybe commented Jun 19, 2019

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:

https://help.dyn.com/remote-access-api/

@rafaelfranco-vera
Copy link

Should it work the same way if my agent has a n IPv6 address? Because it doesn't seem to work for me.

@cyrusboadway
Copy link
Author

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.

https://curl.haxx.se/docs/manpage.html#--data-urlencode

@rafaelfranco-vera
Copy link

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.

@n0v1c3
Copy link

n0v1c3 commented Sep 9, 2019

@rafaelfranco-vera

This will make it IP4
IP=$( curl -4s "https://domains.google.com/checkip" )

Bonus! Clean output
curl -sw '\n' $URL

@wluo
Copy link

wluo commented Oct 5, 2019

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

@rafex
Copy link

rafex commented Oct 23, 2019

I did something similar with python, avoiding calls from google domains. Today I have the script running every 5 minutes.

https://github.com/rafex/updateGoogleDomains

@jaddriggers
Copy link

jaddriggers commented Dec 20, 2019

I'm getting badagent when trying to run in macosx terminal
Nevermind fixed it. Changed to use Google domains to get IP

@rip057
Copy link

rip057 commented Feb 10, 2020

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 "[email protected]" --data-urlencode "myip=$currentipaddress" -H "Host: domains.google.com" -u "$username:$password" "https://domains.google.com/nic/update")

echo "$curloutput" to wherever you want

@AdamKearn
Copy link

AdamKearn commented May 20, 2020

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:[email protected]/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

Copy link

ghost commented Dec 8, 2020

I had to change line 15 to IP=$( curl ifconfig.me ). Other than that the script works.

@Dayday10
Copy link

A stare is born

@jlrosssc
Copy link

Does anyone know if there is an update to this to work with Squarespace since Google Domains has retired?

@cyrusboadway
Copy link
Author

Squarespace does not offer an API for DNS configuration. There is no practical mechanism to programmatically manage dynamic DNS records for domains they manage.

@AdamKearn
Copy link

AdamKearn commented Jun 18, 2024 via email

@cyrusboadway
Copy link
Author

cyrusboadway commented Jun 18, 2024

Squarespace has a registrar & DNS business, independent of their hosting services: https://domains.squarespace.com

Squarespace purchased all Google Domains registrations: https://support.google.com/domains/answer/13689670

Any users whose domain registrations were transferred with the purchase would need to find a new registrar if they want a DDNS API.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment