此脚本作用是使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