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
@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