编辑
2024-11-21
脚本备份
00
请注意,本文编写于 541 天前,最后修改于 541 天前,其中某些信息可能已经过时。

此脚本作用是使Linux系统安装chrony软件实现自动校时功能 NTP池有10.10.1.10内网地址与阿里云和香港时间地址

SHELL
#!/bin/bash # 定义 NTP 服务器地址 NTP_SERVERS=( "server 10.10.1.10 iburst" "server 172.16.26.2 iburst" "server 3.hk.pool.ntp.org iburst" "server 1.asia.pool.ntp.org iburst" "server 3.asia.pool.ntp.org iburst" "server ntp.aliyun.com iburst" ) # 检查操作系统信息 get_os_info() { if [[ -f /etc/os-release ]]; then . /etc/os-release OS_ID=$ID OS_VERSION_ID=$VERSION_ID elif [[ -f /etc/redhat-release ]]; then OS_ID="centos" OS_VERSION_ID=$(grep -oE '[0-9]+' /etc/redhat-release | head -n1) else echo "无法检测到操作系统信息" >&2 exit 1 fi } # 修改时区 set_timezone() { echo "正在将时区设置为 Asia/Shanghai..." if command -v timedatectl >/dev/null 2>&1; then timedatectl set-timezone Asia/Shanghai else echo "系统不支持 timedatectl,使用手动方式设置时区..." rm -f /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime fi # 显示当前时间设置 echo "当前时间设置:" date } # 检查 chrony 同步状态 check_chrony_status() { if command -v chronyc >/dev/null 2>&1; then LEAP_STATUS=$(chronyc tracking | grep 'Leap status' | awk '{print $NF}') if [[ "$LEAP_STATUS" == "Normal" ]]; then echo "Chrony 已成功同步时间 (Leap status: Normal)" return 0 else echo "Chrony 尚未同步时间,继续配置..." return 1 fi else echo "Chrony 未安装或不可用" return 1 fi } # 检查并安装 chrony install_chrony() { if check_chrony_status; then return 0 # 如果 chrony 已经正常同步,跳过安装步骤 fi case "$OS_ID" in centos|rocky|alma) if [[ "$OS_VERSION_ID" -ge "8" ]]; then dnf install -y chrony || { echo "chrony 安装失败"; exit 1; } else yum install -y chrony || yum install -y chronyd || { echo "chrony 安装失败"; exit 1; } fi ;; debian|ubuntu) apt-get install -y chrony || { echo "chrony 安装失败"; exit 1; } ;; *) echo "不支持的操作系统: $OS_ID" >&2 exit 1 ;; esac } # 修改 chrony 配置 modify_chrony_config() { case "$OS_ID" in centos|rocky|alma) CONFIG_FILE="/etc/chrony.conf" ;; debian|ubuntu) CONFIG_FILE="/etc/chrony/chrony.conf" ;; *) echo "不支持的操作系统: $OS_ID" >&2 exit 1 ;; esac # 备份配置文件 cp $CONFIG_FILE "${CONFIG_FILE}.bak" # 注释掉现有的 server 和 pool 行 sed -i '/^\s*\(server\|pool\) / s/^\([^#]\)/#\1/' $CONFIG_FILE # 添加新的 NTP 服务器 for server in "${NTP_SERVERS[@]}"; do grep -qxF "$server" $CONFIG_FILE || echo "$server" >> $CONFIG_FILE done echo "已修改 $CONFIG_FILE 的时间同步地址。" } # 重启并启用 chrony 服务 restart_and_enable_chrony() { if [[ "$OS_ID" == "centos" || "$OS_ID" == "rocky" || "$OS_ID" == "alma" ]]; then # 获取主版本号和次版本号 OS_VERSION_MAJOR=$(echo "$OS_VERSION_ID" | awk -F'.' '{print $1}') OS_VERSION_MINOR=$(echo "$OS_VERSION_ID" | awk -F'.' '{print $2}') if [[ "$OS_VERSION_MAJOR" -ge 7 ]]; then # CentOS 7 和 Rocky 8 等使用 systemd systemctl restart chronyd systemctl enable chronyd else # CentOS 6 使用 SysVinit /etc/init.d/chronyd restart chkconfig chronyd on fi elif [[ "$OS_ID" == "ubuntu" ]]; then if [[ "$VERSION_ID" =~ 14.* || "$VERSION_ID" =~ 16.* ]]; then # 对于 Ubuntu 14/16 使用 service 和 update-rc.d service chrony restart update-rc.d chrony defaults else # 对于 Ubuntu 16 以上版本使用 systemctl systemctl restart chrony systemctl enable chrony fi else echo "不支持的操作系统: $OS_ID" >&2 exit 1 fi if [[ $? -eq 0 ]]; then echo "已重启chrony服务并设置开机自启。" chronyc makestep > /dev/null echo "请输入 chronyc tracking 来验证是否同步成功" else echo "Chrony 服务重启失败" >&2 exit 1 fi } # 主函数 main() { get_os_info set_timezone install_chrony modify_chrony_config restart_and_enable_chrony } main