Vultr Api做DDNS域名脚本
CHATGPT真好用,新的官方API客户端也好用
RUST版
学习RUST写的: https://github.com/yi-shiyu/vultr_ddns
shell脚本版
内容
相关代码都有注释解释作用
#!/bin/bash
export PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
########## 需修改内容 #################
# 此处示例域名"abc.xxx.com
# 你的vultr的API KEY
export VULTR_API_KEY='xxxxxxxxxxxxxxxxxxxxxxxx'
# 子域名
domain_head=abc
# 域名
domain_body=xxx.com
# 此脚本缓存文件所在目录
work_dir=/usr/local/ddns/abc.xxx.com
#####################################
[[ ! -d $work_dir ]] && mkdir -p $work_dir
cd $work_dir
[[ ! -d cache ]] && mkdir cache
[[ ! -f cache/nowIP.txt ]] && touch cache/nowIP.txt
[[ ! -f log.txt ]] && touch log.txt
# 安装API客户端
if [[ ! -f /bin/vultr-cli ]]; then
wget https://github.com/vultr/vultr-cli/releases/download/v2.21.0/vultr-cli_v2.21.0_linux_amd64.tar.gz
tar -zxvf vultr-cli_v2.21.0_linux_amd64.tar.gz
mv vultr-cli /bin/
chmod +x /bin/vultr-cli
fi
# 使用 curl 获取 IPv4 地址 这个地址我也忘记哪里搞的了,如果将来失败了,自行更换或搭建
ipv4_address=$(curl -s https://ip.42.pl/short)
# 校验是否为有效的 IPv4 地址
if [[ ! $ipv4_address =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
# echo "获取的内容不是有效的 IPv4 地址:$ipv4_address"
exit 0
fi
[[ $ipv4_address == $(cat cache/nowIP.txt) ]] && exit 0
vultr-cli dns record list $domain_body >cache/data.txt
# 数据格式如下
# ID TYPE NAME DATA PRIORITY TTL
# 9e-00 MX mxbiz1.qq.com 300
# 7e-4a MX mxbiz2.qq.com 10 300
# c0-79 A ht4 127.0.54.150 300
# 4d-09 NS ns1.vultr.com -1 3600
# ed-02 NS ns2.vultr.com -1 3600
# cc-17 A n1.hl 127.0.53.127 3600
# 3a-30 CAA n1.hl 0 issue "letsencrypt.org" -1 3600
# 9d-17 A n2.hl 127.0.53.136 3600
# 计算domain_head的条数
domain_head_count=$(awk '{if($3 == "'"$domain_head"'" && $2 == "A") sum += 1} END {print sum}' cache/data.txt)
date "+%Y-%m-%d %H:%M:%S" >>log.txt
if [[ $domain_head_count > 1 ]]; then
# 大于1条记录,就删除所有记录,新增一条
awk '{if($3 == "'"$domain_head"'" && $2 == "A") print $1}' cache/data.txt | xargs -I {} vultr-cli dns record delete $domain_body {}
vultr-cli dns record create --type A --domain $domain_body --name $domain_head --data $ipv4_address --ttl 300
elif [[ $domain_head_count == 1 ]]; then
# 更新记录
awk '{if($3 == "'"$domain_head"'" && $2 == "A") print $1}' cache/data.txt | xargs -I {} vultr-cli dns record update $domain_body {} --data $ipv4_address --name $domain_head
else
# 新增记录
vultr-cli dns record create --type A --domain $domain_body --name $domain_head --data $ipv4_address --ttl 300
fi
echo $ipv4_address >cache/nowIP.txt
# 本站的解析IP归属服务 准确性较低 主要做日志展示 如果将来G了,不影响功能
curl -s https://evlan.cc/ip/$ipv4_address >>log.txt
echo -e "" >>log.txt
echo "-----------------------" >>log.txt
# 最多500行日志
tail -n 500 log.txt >cache/log.txt
rm -f log.txt && mv cache/log.txt ./
rm -f cache/data.txt
使用方法
此处以脚本示例中的/usr/local/ddns/abc.xxx.com为例子
先搞一个目录,此处和脚本缓存文件放一起,就全放/usr/local/ddns/abc.xxx.com中
mkdir -p /usr/local/ddns/abc.xxx.com
cd /usr/local/ddns/abc.xxx.com
新建一个ddns.sh文件,把上面脚本修改一下API、域名后粘贴到文件中保存,授权文件可执行
chmod +x ddns.sh
执行脚本bash ddns.sh
,如果正常,就成功了,然后加入定时任务,让他每3分执行一次,在/var/spool/cron/root文件中加入下面这一行,如果没文件就新建
*/3 * * * * /bin/bash /usr/local/ddns/abc.xxx.com/ddns.sh > /dev/null 2>&1