#!/bin/bash #版本信息 build_date="20200307" build_version="v1.0.0" #当前时间 格式:2020-03-12 14:36:31 NOW_DATE=$(date "+%Y-%m-%d %H:%M:%S") #当前时间 echo "=========== $(date) ===========" #定义字体颜色 color_black_start="\033[30m" color_red_start="\033[31m" color_green_start="\033[32m" color_yellow_start="\033[33m" color_blue_start="\033[34m" color_purple_start="\033[35m" color_sky_blue_start="\033[36m" color_white_start="\033[37m" color_end="\033[0m" #提示信息级别定义 message_info_tag="${color_sky_blue_start}[Info] ${NOW_DATE} ${color_end}" message_warning_tag="${color_yellow_start}[Warning] ${NOW_DATE} ${color_end}" message_error_tag="${color_red_start}[Error] ${NOW_DATE} ${color_end}" message_success_tag="${color_green_start}[Success] ${NOW_DATE} ${color_end}" message_fail_tag="${color_red_start}[Failed] ${NOW_DATE} ${color_end}" #功能、版本信息描述输出 function fun_show_version_info(){ echo -e "${color_green_start} ############################################################# # Aliyun Domain DNS Update Shell Script # # Dynamic DNS Update Using Aliyun API # # Version: ${build_version} # BuildDate: ${build_date} # Author: risfeng # GitHub: https://github.com/risfeng/aliyun-ddns-shell # # Usage: please refer to https://github.com/risfeng/aliyun-ddns-shell/blob/master/README.md # ############################################################# ${color_end}" } fun_show_version_info #全局变量定义 #操作系统发行名常量 MAC_OS_RELEASE="Darwin" CENT_OS_RELEASE="centos" UBUNTU_OS_RELEASE="ubuntu" DEBIAN_OS_RELEASE="debian" # 配置、日志文件存放目录 FILE_SAVE_DIR="" # 目录前缀 FILE_DIR_PREFIX="aliyun-ddns" #配置文件路径 CONFIG_FILE_PATH="" # 配置文件名 CONFIG_FILE_NAME="config.cfg" #日志储存目录 LOG_FILE_PATH="" # 日志文件名 LOG_FILE_NAME="log-info.log" #当前时间戳 var_now_timestamp="" #是否root权限执行 var_is_root_execute=false #是否支持sudo执行 var_is_support_sudo=false #是否已安装curl组件 var_is_installed_curl=false #是否已安装openssl组件 var_is_installed_openssl=false #是否已安装nslookup组件 var_is_installed_nslookup=false #当前操作系统发行版本 var_os_release=`uname -a` #当前网络是否通外网 var_is_online=false #是否存在配置文件 var_is_exist_config_file=false #检测外网是否通地址 默认:www.baidu.com var_check_online_url="" #检测外网是否通重试次数 默认:3 var_check_online_retry_times="" #阿里云Dns动态更新配置变量定义 #一级域名 例如:example.com var_first_level_domain="" #二级域名 例如:testddns var_second_level_domain="" # 域名解析类型:A、NS、MX、TXT、CNAME、SRV、AAAA、CAA、REDIRECT_URL、FORWARD_URL var_domain_record_type="" #域名生效时间,默认:600 单位:秒 var_domain_ttl="" #域名线路,默认为默认 var_domain_line="" #阿里云授权Key var_access_key_id="" #阿里云授权Key Secret var_access_key_secret="" #阿里云更新域名Api Host 默认:https://alidns.aliyuncs.com var_aliyun_ddns_api_host="https://alidns.aliyuncs.com" #获取本机外网IP的shell命令,不能带有双引号 默认:"curl -s http://members.3322.org/dyndns/getip" var_local_wan_ip="" #获取ddns域名当前的解析记录的shell命令,支持数组,不能带有双引号 默认:使用nslookup获取 var_domain_server_ip="" #域名解析记录Id var_domain_record_id="" #消息推送配置,使用阿里钉钉 #是否启用消息推送 var_enable_message_push=false #推送地址 var_push_message_api="https://oapi.dingtalk.com/robot/send" #加签密钥 var_push_message_secret="" #消息推送token var_push_message_access_token="" #==================函数==================== # ping地址是否通 function fun_ping() { if ping -c 1 $1 >/dev/null; then # ping通 echo true else # 不通 echo false fi } # 检测是否通外网 function fun_check_online(){ for((i=1;i<=$var_check_online_retry_times;i++)); do fun_wirte_log "${message_info_tag}正在尝试检测外网:ping ${var_check_online_url}${color_red_start} $i ${color_end}times......" var_is_online=$(fun_ping ${var_check_online_url}) if [[ ${var_is_online} = true ]]; then fun_wirte_log "${message_success_tag}检测外网成功!" break else fun_wirte_log "${message_fail_tag}外网不通,ping ${var_check_online_url} fail." fi done if [[ ${var_is_online} = false ]]; then fun_wirte_log "${message_error_tag}检测当前无外网环境,重试${$var_check_online_retry_times}次ping ${var_check_online_url}都失败,程序终止执行." exit 1 fi } # 检测root权限 function fun_check_root(){ if [[ "`id -u`" != "0" ]]; then var_is_root_execute=false else var_is_root_execute=true fi } # 设置配置、日志文件保存目录 function fun_setting_file_save_dir(){ fun_check_root if [ "${FILE_SAVE_DIR}" = "" ]; then if [[ "${var_os_release}" =~ "${MAC_OS_RELEASE}" ]]; then FILE_SAVE_DIR="./${FILE_DIR_PREFIX}" else if [ "${var_is_root_execute}" = true ]; then FILE_SAVE_DIR="/etc/${FILE_DIR_PREFIX}" else FILE_SAVE_DIR=~/"${FILE_DIR_PREFIX}" fi fi fi if [ ! -d "$FILE_SAVE_DIR" ]; then mkdir -p ${FILE_SAVE_DIR} fi if [ "${CONFIG_FILE_PATH}" = "" ]; then CONFIG_FILE_PATH="${FILE_SAVE_DIR}/${CONFIG_FILE_NAME}" fi if [ "${LOG_FILE_PATH}" = "" ]; then LOG_FILE_PATH="${FILE_SAVE_DIR}/${LOG_FILE_NAME}" fi } # 检测运行环境 function fun_check_run_environment(){ if [[ -f "/usr/bin/sudo" ]]; then var_is_support_sudo=true else var_is_support_sudo=false fi if [[ -f "/usr/bin/curl" ]]; then var_is_installed_curl=true else var_is_installed_curl=false fi if [[ -f "/usr/bin/openssl" ]]; then var_is_installed_openssl=true else var_is_installed_openssl=false fi if [[ -f "/usr/bin/nslookup" ]]; then var_is_installed_nslookup=true else var_is_installed_nslookup=false fi if [ -f "/etc/redhat-release" ]; then var_os_release="centos" elif [ -f "/etc/lsb-release" ]; then var_os_release="ubuntu" elif [ -f "/etc/debian_version" ]; then var_os_release="debian" fi } # 获取本机外网IP function fun_get_local_wan_ip(){ fun_wirte_log "${message_info_tag}正在获取本机外网ip......" if [[ "${var_local_wan_ip}" = "" ]]; then fun_wirte_log "${message_error_tag}获取外网ip配置项为空或无效." fun_wirte_log "${message_fail_tag}程序终止执行......" exit 1 fi var_local_wan_ip=`${var_local_wan_ip}` if [[ "${var_local_wan_ip}" = "" ]]; then fun_wirte_log "${message_error_tag}获取外网ip失败,请检查var_local_wan_ip配置项命令是否正确." fun_wirte_log "${message_fail_tag}程序终止执行......" exit 1 else fun_wirte_log "${message_info_tag}本机外网ip:${var_local_wan_ip}" fi } # 获取DDNS域名当前解析记录IP function fun_get_domain_server_ip(){ fun_wirte_log "${message_info_tag}正在获取${var_second_level_domain}.${var_first_level_domain}的ip......" if [[ "${var_domain_server_ip}" = "nslookup" ]]; then var_domain_server_ip=`nslookup -sil ${var_second_level_domain}.${var_first_level_domain} ns2.alidns.com 2>/dev/null | grep Address: | sed 1d | sed s/Address://g | sed 's/ //g'` else var_domain_server_ip=`${var_domain_server_ip} | sed 's/;/ /g'` fi fun_wirte_log "${message_info_tag}域名${var_second_level_domain}.${var_first_level_domain}的当前ip:${var_domain_server_ip}" } # 判断当前外网ip与域名到服务ip是否相同 function fun_is_wan_ip_and_domain_ip_same(){ if [[ "${var_domain_server_ip}" != "" ]]; then if [[ "${var_domain_server_ip}" =~ "${var_local_wan_ip}" ]]; then fun_wirte_log "${message_info_tag}当前外网ip:[${var_local_wan_ip}]与${var_second_level_domain}.${var_first_level_domain}($var_domain_server_ip)的ip相同." fun_wirte_log "${message_success_tag}本地ip与域名解析ip未发生任何变动,无需更改,程序退出." exit 0 fi fi } # 安装运行必需组件 function fun_install_run_environment(){ if [[ ${var_is_installed_curl} = false ]] || [[ ${var_is_installed_openssl} = false ]] || [[ ${var_is_installed_nslookup} = false ]]; then fun_wirte_log "${message_warning_tag}检测到缺少运行必需组件,正在尝试安装......" # 有root权限 if [[ "${var_is_root_execute}" = true ]]; then if [[ "${var_os_release}" = "${CENT_OS_RELEASE}" ]]; then fun_wirte_log "${message_info_tag}检测到当前系统发行版本为:${CENT_OS_RELEASE}" fun_wirte_log "${message_info_tag}正在安装必需组件......" yum install curl openssl bind-utils -y elif [[ "${var_os_release}" = "${UBUNTU_OS_RELEASE}" ]];then fun_wirte_log "${message_info_tag}检测到当前系统发行版本为:${UBUNTU_OS_RELEASE}" fun_wirte_log "${message_info_tag}正在安装必需组件......" apt-get install curl openssl bind-utils -y elif [[ "${var_os_release}" = "${DEBIAN_OS_RELEASE}" ]]; then fun_wirte_log "${message_info_tag}检测到当前系统发行版本为:${DEBIAN_OS_RELEASE}" fun_wirte_log "${message_info_tag}正在安装必需组件......" apt-get install curl openssl bind-utils -y else fun_wirte_log "${message_warning_tag}当前系统是:${var_os_release},不支持自动安装必需组件,建议手动安装【curl、openssl、bind-utils】" fi if [[ -f "/usr/bin/curl" ]]; then var_is_installed_curl=true else var_is_installed_curl=false fun_wirte_log "${message_error_tag}curl组件自动安装失败!可能会影响到程序运行,建议手动安装!" fi if [[ -f "/usr/bin/openssl" ]]; then var_is_installed_openssl=true else var_is_installed_openssl=false fun_wirte_log "${message_error_tag}openssl组件自动安装失败!可能会影响到程序运行,建议手动安装!" fi if [[ -f "/usr/bin/nslookup" ]]; then var_is_installed_nslookup=true else var_is_installed_nslookup=false fun_wirte_log "${message_error_tag}nslokkup组件自动安装失败!可能会影响到程序运行,建议手动安装!" fi elif [[ -f "/usr/bin/sudo" ]]; then fun_wirte_log "${message_warning_tag}当前脚本未以root权限执行,正在尝试以sudo命令安装必需组件......" if [[ "${var_os_release}" = "${CENT_OS_RELEASE}" ]]; then fun_wirte_log "${message_info_tag}检测到当前系统发行版本为:${CENT_OS_RELEASE}" fun_wirte_log "${message_info_tag}正在以sudo安装必需组件......" sudo yum install curl openssl bind-utils -y elif [[ "${var_os_release}" = "${UBUNTU_OS_RELEASE}" ]];then fun_wirte_log "${message_info_tag}检测到当前系统发行版本为:${UBUNTU_OS_RELEASE}" fun_wirte_log "${message_info_tag}正在以sudo安装必需组件......" sudo apt-get install curl openssl bind-utils -y elif ["${var_os_release}" = "${DEBIAN_OS_RELEASE}" ]; then fun_wirte_log "${message_info_tag}检测到当前系统发行版本为:${DEBIAN_OS_RELEASE}" fun_wirte_log "${message_info_tag}正在以sudo安装必需组件......" sudo apt-get install curl openssl bind-utils -y else fun_wirte_log "${message_warning_tag}当前系统是:${var_os_release},不支持自动安装必需组件,建议手动安装【curl、openssl、bind-utils】" fi else fun_wirte_log "${message_error_tag}系统缺少必需组件且无法自动安装,建议手动安装." fi fi } # 检测配置文件 function fun_check_config_file(){ fun_setting_file_save_dir if [[ -f "${CONFIG_FILE_PATH}" ]]; then fun_wirte_log "${message_info_tag}检测到配置文件,自动加载现有配置信息。可通过菜单选项【恢复出厂设置】重置." #加载配置文件 source ${CONFIG_FILE_PATH} if [[ "${var_first_level_domain}" = "" ]] || [[ "${var_second_level_domain}" = "" ]] || [[ "${var_domain_ttl}" = "" ]] \ || [[ "${var_domain_line}" = "" ]] \ || [[ "${var_access_key_id}" = "" ]] || [[ "${var_access_key_secret}" = "" ]] || [[ "${var_local_wan_ip}" = "" ]] \ || [[ "${var_domain_server_ip}" = "" ]] || [[ "${var_check_online_url}" = "" ]] || [[ "${var_check_online_retry_times}" = "" ]] \ || [[ "${var_aliyun_ddns_api_host}" = "" ]] \ || [[ "${var_enable_message_push}" = true && "${var_push_message_access_token}" = "" && "${var_push_message_secret}" = "" ]] \ || [[ "${var_check_online_url}" = "" ]] \ || [[ "${var_domain_record_type}" = "" ]] \ || [[ "${var_check_online_retry_times}" = "" ]] ; then fun_wirte_log "${message_error_tag}配置文件有误,请检查配置文件,建议清理后重新配置!程序退出执行." exit 1 fi var_is_exist_config_file=true else var_is_exist_config_file=fasle fi } # 设置配置文件 function fun_set_config(){ # 检测外网畅通ping等域名地址,默认:www.baidu.com if [[ "${var_check_online_url}" = "" ]]; then echo -e "\n${message_info_tag}[var_check_online_url]请输入外网检测Ping地址:" read -p "(默认:www.baidu.com,如有疑问请输入“-h”查看帮助):" var_check_online_url [[ "${var_check_online_url}" = "-h" ]] && fun_help_document "var_check_online_url" && echo -e "${message_info_tag}[var_check_online_url]请输入外网检测Ping地址:" && read -p "(默认:www.baidu.com):" var_check_online_url [[ -z "${var_check_online_url}" ]] && echo -e "${message_info_tag}输入为空值,已设置为:“www.baidu.com”" && var_check_online_url="www.baidu.com" fi # 检测外网畅通失败重试次数,默认:3 if [[ "${var_check_online_retry_times}" = "" ]]; then echo -e "\n${message_info_tag}[var_check_online_retry_times]请输入外网检测失败后重试次数:" read -p "(默认:3,如有疑问请输入“-h”查看帮助):" var_check_online_retry_times [[ "${var_check_online_retry_times}" = "-h" ]] && fun_help_document "var_check_online_retry_times" && echo -e "${message_info_tag}[var_check_online_retry_times]请输入外网检测失败后重试次数:" && read -p "(默认:3):" var_check_online_retry_times [[ -z "${var_check_online_retry_times}" ]] && echo -e "${message_info_tag}输入为空值,已设置为:“3”" && var_check_online_retry_times=3 fi # 一级域名 if [[ "${var_first_level_domain}" = "" ]]; then echo -e "\n${message_info_tag}[var_first_level_domain]请输入一级域名(示例 demo.com)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_first_level_domain [[ "${var_first_level_domain}" = "-h" ]] && fun_help_document "var_first_level_domain" && echo -e "${message_info_tag}[var_first_level_domain]请输入一级域名 (示例 demo.com)" && read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_first_level_domain while [[ "${var_first_level_domain}" = "" || "${var_first_level_domain}" = "-h" ]] do if [[ "${var_first_level_domain}" = "" ]]; then echo -e "${message_error_tag}此项不可为空,请重新输入!" echo -e "${message_info_tag}[var_first_level_domain]请输入一级域名(示例 demo.com)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_first_level_domain elif [[ "${var_first_level_domain}" = "-h" ]]; then fun_help_document "var_first_level_domain" echo -e "${message_info_tag}[var_first_level_domain]请输入一级域名(示例 demo.com)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_first_level_domain fi done fi # 二级域名 if [[ "${var_second_level_domain}" = "" ]]; then echo -e "\n${message_info_tag}[var_second_level_domain]请输入二级域名(示例 test)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_second_level_domain [[ "${var_second_level_domain}" = "-h" ]] && fun_help_document "var_second_level_domain" && echo -e "${message_info_tag}[var_second_level_domain]请输入二级域名 (示例 test)" && read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_second_level_domain while [[ "${var_second_level_domain}" = "" || "${var_second_level_domain}" = "-h" ]] do if [[ "${var_second_level_domain}" = "" ]]; then echo -e "${message_error_tag}此项不可为空,请重新输入!" echo -e "${message_info_tag}[var_second_level_domain]请输入二级域名(示例 test)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_second_level_domain elif [[ "${var_second_level_domain}" = "-h" ]]; then fun_help_document "var_second_level_domain" echo -e "${message_info_tag}[var_second_level_domain]请输入二级域名(示例 test)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_second_level_domain fi done fi # 域名解析类型:A、NS、MX、TXT、CNAME、SRV、AAAA、CAA、REDIRECT_URL、FORWARD_URL if [[ "${var_domain_record_type}" = "" ]]; then echo -e "\n${message_info_tag}[var_domain_record_type]请输入解析类型(示例 A)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_domain_record_type [[ "${var_domain_record_type}" = "-h" ]] && fun_help_document "var_domain_record_type" && echo -e "${message_info_tag}[var_domain_record_type]请输入解析类型(示例 A)" && read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_domain_record_type while [[ "${var_domain_record_type}" = "" || "${var_domain_record_type}" = "-h" ]] do if [[ "${var_domain_record_type}" = "" ]]; then echo -e "${message_error_tag}此项不可为空,请重新输入!" echo -e "${message_info_tag}[var_domain_record_type]请输入解析类型(示例 A)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_domain_record_type elif [[ "${var_domain_record_type}" = "-h" ]]; then fun_help_document "var_domain_record_type" echo -e "${message_info_tag}[var_domain_record_type]请输入解析类型(示例 A)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_domain_record_type fi done fi # 域名生效时间,默认:600 if [[ "${var_domain_ttl}" = "" ]]; then echo -e "\n${message_info_tag}[var_domain_ttl]请输入域名解析记录生效时间(TTL Time-To-Live)秒:" read -p "(默认600,如有疑问请输入“-h”查看帮助):" var_domain_ttl [[ "${var_domain_ttl}" = "-h" ]] && fun_help_document "var_domain_ttl" && echo -e "${message_info_tag}[var_domain_ttl]请输入域名解析记录生效时间(TTL Time-To-Live)秒:" && read -p "(默认600):" var_domain_ttl [[ -z "${var_domain_ttl}" ]] && echo -e "${message_info_tag}输入为空值,已设置TTL值为:“600”" && var_domain_ttl="600" fi # 域名线路,默认:默认 if [[ "${var_domain_line}" = "" ]]; then echo -e "\n${message_info_tag}[var_domain_line]请输入域名解析线路:" read -p "(默认默认,如有疑问请输入“-h”查看帮助):" var_domain_line [[ "${var_domain_line}" = "-h" ]] && fun_help_document "var_domain_line" && echo -e "${message_info_tag}[var_domain_line]请输入域名解析线路:" && read -p "(默认-default):" var_domain_line [[ -z "${var_domain_line}" ]] && echo -e "${message_info_tag}输入为空值,已设置线路为:“default”" && var_domain_line="default" fi # 阿里云授权Key if [[ "${var_access_key_id}" = "" ]]; then echo -e "\n${message_info_tag}[var_access_key_id]请输入阿里云AccessKeyId${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_access_key_id [[ "${var_access_key_id}" = "-h" ]] && fun_help_document "var_access_key_id" && echo -e "${message_info_tag}[var_access_key_id]请输入阿里云AccessKeyId" && read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_access_key_id while [[ "${var_access_key_id}" = "" || "${var_access_key_id}" = "-h" ]] do if [[ "${var_access_key_id}" = "" ]]; then echo -e "${message_error_tag}此项不可为空,请重新输入!" echo -e "${message_info_tag}[var_access_key_id]请输入阿里云AccessKeyId${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_access_key_id elif [[ "${var_access_key_id}" = "-h" ]]; then fun_help_document "var_access_key_id" echo -e "${message_info_tag}[var_access_key_id]请输入阿里云AccessKeyId${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_access_key_id fi done fi # 阿里云授权Key Secret if [[ "${var_access_key_secret}" = "" ]]; then echo -e "\n${message_info_tag}[var_access_key_secret]请输入阿里云AccessKeySecret${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_access_key_secret [[ "${var_access_key_secret}" = "-h" ]] && fun_help_document "var_access_key_secret" && echo -e "${message_info_tag}[var_access_key_secret]请输入阿里云AccessKeySecret" && read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_access_key_secret while [[ "${var_access_key_secret}" = "" || "${var_access_key_secret}" = "-h" ]] do if [[ "${var_access_key_secret}" = "" ]]; then echo -e "${message_error_tag}此项不可为空,请重新输入!" echo -e "${message_info_tag}[var_access_key_secret]请输入阿里云AccessKeySecret${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_access_key_secret elif [[ "${var_access_key_secret}" = "-h" ]]; then fun_help_document "var_access_key_secret" echo -e "${message_info_tag}[var_access_key_secret]请输入阿里云AccessKeySecret${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_access_key_secret fi done fi # 获取本机外网IP的shell命令 if [[ "${var_local_wan_ip}" = "" ]]; then echo -e "\n${message_info_tag}[var_local_wan_ip]请输入获取本机外网IP使用的命令(默认:只支持ipv4)" read -p "(如有疑问请输入“-h”查看帮助):" var_local_wan_ip [[ "${var_local_wan_ip}" = "-h" ]] && fun_help_document "var_local_wan_ip" && echo -e "${message_info_tag}[var_local_wan_ip]请输入获取本机外网IP使用的命令(默认:只支持ipv4)" && read -p "(如有疑问请输入“-h”查看帮助):" var_local_wan_ip [[ -z "${var_local_wan_ip}" ]] && echo -e "${message_info_tag}输入为空值,已设置执行命令为:“curl -s http://members.3322.org/dyndns/getip”" && var_local_wan_ip="curl -s http://members.3322.org/dyndns/getip" fi # 获取ddns域名当前的解析记录的shell命令 if [[ "${var_domain_server_ip}" = "" ]]; then echo -e "\n${message_info_tag}[var_domain_server_ip]请输入获取域名当前解析记录的IP使用的命令(建议默认)" read -p "(如有疑问请输入“-h”查看帮助):" var_domain_server_ip [[ "${var_domain_server_ip}" = "-h" ]] && fun_help_document "var_domain_server_ip" && echo -e "${message_info_tag}[var_domain_server_ip]请输入获取域名当前解析记录的IP使用的命令(建议默认)" && read -p "(如有疑问请输入“-h”查看帮助):" var_domain_server_ip [[ -z "${var_domain_server_ip}" ]] && echo -e "${message_info_tag}输入为空值,已设置执行命令为:“nslookup“" && var_domain_server_ip="nslookup" fi # 是否启用消息推送,默认:false if [[ "${var_enable_message_push}" = false ]]; then echo -e "\n${message_info_tag}[var_enable_message_push]请输入是否启用消息通知(钉钉机器人)推送(请输入true或false):" read -p "(默认false,如有疑问请输入“-h”查看帮助):" var_enable_message_push [[ "${var_enable_message_push}" = "-h" ]] && fun_help_document "var_enable_message_push" && echo -e "${message_info_tag}[var_enable_message_push]请输入是否启用消息通知(钉钉机器人)推送(请输入true或false):" && read -p "(默认false):" var_enable_message_push [[ -z "${var_enable_message_push}" ]] && echo -e "${message_info_tag}输入为空值,已设置为:false" && var_enable_message_push=false fi # 消息通知发送token if [[ "${var_enable_message_push}" = true && "${var_push_message_access_token}" = "" ]]; then echo -e "\n${message_info_tag}[var_push_message_access_token]请输入钉钉机器人推送access_token${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_push_message_access_token [[ "${var_push_message_access_token}" = "-h" ]] && fun_help_document "var_push_message_access_token" && echo -e "${message_info_tag}[var_push_message_access_token]请输入钉钉机器人推送access_token" && read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_push_message_access_token while [[ "${var_push_message_access_token}" = "" || "${var_push_message_access_token}" = "-h" ]] do if [[ "${var_push_message_access_token}" = "" ]]; then echo -e "${message_error_tag}此项不可为空,请重新输入!" echo -e "${message_info_tag}[var_push_message_access_token]请输入钉钉机器人推送access_token${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_push_message_access_token elif [[ "${var_push_message_access_token}" = "-h" ]]; then fun_help_document "var_push_message_access_token" echo -e "${message_info_tag}[var_push_message_access_token]请输入钉钉机器人推送access_token${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_push_message_access_token fi done fi # 消息通知发送secret if [[ "${var_enable_message_push}" = true && "${var_push_message_secret}" = "" ]]; then echo -e "\n${message_info_tag}[var_push_message_secret]请输入钉钉机器人安全设置的加签(密钥)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_push_message_secret [[ "${var_push_message_secret}" = "-h" ]] && fun_help_document "var_push_message_secret" && echo -e "${message_info_tag}[var_push_message_secret]请输入钉钉机器人安全设置的加签(密钥)" && read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_push_message_secret while [[ "${var_push_message_secret}" = "" || "${var_push_message_secret}" = "-h" ]] do if [[ "${var_push_message_secret}" = "" ]]; then echo -e "${message_error_tag}此项不可为空,请重新输入!" echo -e "${message_info_tag}[var_push_message_secret]请输入钉钉机器人安全设置的加签(密钥)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_push_message_secret elif [[ "${var_push_message_secret}" = "-h" ]]; then fun_help_document "var_push_message_secret" echo -e "${message_info_tag}[var_push_message_secret]请输入钉钉机器人安全设置的加签(密钥)${color_red_start}(*)${color_end}" read -p "(此项为必填,如有疑问请输入“-h”查看帮助):" var_push_message_secret fi done fi } # 保存配置文件 function fun_save_config(){ # 写入配置文件 fun_wirte_log "${message_info_tag}正在保存配置文件......" fun_setting_file_save_dir rm -f ${CONFIG_FILE_PATH} cat>${CONFIG_FILE_PATH}<> ${LOG_FILE_PATH} } # 消息推送 function fun_push_message(){ if [[ "${var_enable_message_push}" = true ]]; then fun_wirte_log "${message_info_tag}正在推送消息到钉钉......" fun_send_message_to_ding_ding "{'msgtype': 'text','text':{'content': '【域名解析服务-${NOW_DATE}】$1'}}" fi } #发送消息到钉钉 fun_send_message_to_ding_ding "内容" function fun_send_message_to_ding_ding(){ local timestamp_ms=$(fun_get_current_timestamp_ms) local str_to_sign="$timestamp_ms\n$var_push_message_secret"; local sign=$(get_signature "sha256" "$str_to_sign" "$var_push_message_secret") local encode_sign=$(fun_get_url_encryption "$sign"); local request_url="$var_push_message_api?access_token=$var_push_message_access_token×tamp=$timestamp_ms&sign=$encode_sign" # 发送请求 local response=$(curl -s "${request_url}" -H "Content-Type: application/json" -d "$1") fun_wirte_log "${message_info_tag}钉钉接口推送返回信息:${response}" false # json解析 local errcode=$(fun_parse_json "$response" "errcode") local errmsg=$(fun_parse_json "$response" "errmsg") if [[ "$errcode" -eq "0" ]]; then fun_wirte_log "${message_success_tag}消息推送成功,返回消息:${errmsg}" else fun_wirte_log "${message_warning_tag}消息推送失败,返回消息:${errmsg}" fi } # 恢复出厂设置 function fun_restore_settings(){ fun_setting_file_save_dir rm -f ${CONFIG_FILE_PATH} var_is_root_execute=false var_is_support_sudo=false var_first_level_domain="" var_second_level_domain="" var_domain_ttl="" var_domain_line="" var_access_key_id="" var_access_key_secret="" var_local_wan_ip="" var_domain_server_ip="" var_enable_message_push=false var_push_message_access_token="" var_push_message_secret="" var_domain_record_type="" fun_wirte_log "${message_success_tag}所有配置项重置成功!" } # 清除日志文件 function fun_clearn_logs(){ fun_setting_file_save_dir rm -f ${LOG_FILE_PATH} echo -e "${message_success_tag}日志文件清理成功!" } # 主入口1 配置并运行 function main_fun_config_and_run(){ fun_check_root fun_check_run_environment fun_install_run_environment fun_check_config_file fun_set_config fun_save_config fun_check_online fun_get_local_wan_ip fun_get_domain_server_ip fun_get_now_timestamp fun_is_wan_ip_and_domain_ip_same fun_update_record exit 0 } # 主入口2 仅运行 function main_fun_only_run(){ fun_check_config_file if [[ "${var_is_exist_config_file}" != true ]]; then fun_wirte_log "${message_error_tag}未检测到配置文件,请直接运行程序配置!" exit 1 fi fun_check_run_environment fun_install_run_environment fun_check_online fun_get_local_wan_ip fun_get_domain_server_ip fun_get_now_timestamp fun_is_wan_ip_and_domain_ip_same fun_update_record exit 0 } # 主入口3 仅配置 function main_fun_only_config(){ fun_check_root fun_check_run_environment fun_install_run_environment fun_check_config_file fun_set_config fun_save_config fun_wirte_log "${message_success_tag}配置完成!" exit 0 } # 主入口4 恢复出厂设置 function main_fun_restore_settings(){ fun_wirte_log "${message_info_tag}正在恢复出厂设置......" fun_restore_settings fun_wirte_log "${message_success_tag}恢复出厂设置成功,可重新运行程序进行配置。" exit 0 } # 主入口5 清理日志文件 function main_fun_clearn_logs(){ echo -e "${message_info_tag}正在清理日志文件......" fun_clearn_logs exit 0 } # 显示程序说明和版本信息 function main_fun_show_version(){ fun_show_version_info exit 0 } # 根据输入参数执行对应函数 case "$1" in "-config -run") main_fun_config_and_run ;; "-run") main_fun_only_run ;; "-config") main_fun_only_config ;; "-restore") main_fun_restore_settings ;; "-version") main_fun_show_version ;; "-clearn") main_fun_clearn_logs ;; *) echo -e "${color_blue_start}===阿里云域名动态IP自动解析小脚本===${color_end} 使用方法 (Usage): aliyun-ddns.sh -config -run 配置并执行脚本 aliyun-ddns.sh -run 执行脚本(前提需要有配置文件) aliyun-ddns.sh -config 仅配置信息 aliyun-ddns.sh -restore 恢复出厂设置(会清除配置文件等) aliyun-ddns.sh -clearn 清理日志文件 aliyun-ddns.sh -version 显示脚本说明及版本信息 " ;; esac echo -e "${message_info_tag}选择需要执行的功能" echo -e "\n 1.配置并执行脚本 \n 2.仅配置 \n 3.仅执行脚本 \n 4.恢复出厂设置 \n 5.清理日志文件 \n 0.退出 \n" read -p "请输入你的选择(输入数字):" run_function if [[ "${run_function}" == "1" ]]; then main_fun_config_and_run elif [[ "${run_function}" == "2" ]]; then main_fun_only_config elif [[ "${run_function}" == "3" ]]; then main_fun_only_run elif [[ "${run_function}" == "4" ]]; then main_fun_restore_settings elif [[ "${run_function}" == "5" ]]; then main_fun_clearn_logs else exit 0 fi