136 lines
4.2 KiB
Bash
Executable File
136 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# 功能:修复Ubuntu Server长时间无网络活动导致网络关闭的问题
|
||
# 使用方法:sudo bash fix_network_sleep.sh
|
||
|
||
# 检查是否以root权限运行
|
||
if [ "$(id -u)" -ne 0 ]; then
|
||
echo "错误:请使用root权限运行此脚本(sudo bash $0)" >&2
|
||
exit 1
|
||
fi
|
||
|
||
# 检测网卡名称(获取第一个活动的以太网接口)
|
||
get_active_nic() {
|
||
# 排除lo和docker等虚拟接口,获取第一个物理以太网接口
|
||
nic=$(ip -br link show | grep -v 'LOOPBACK' | grep -v 'DOCKER' | grep 'UP' | awk '{print $1}' | head -n 1)
|
||
if [ -z "$nic" ]; then
|
||
# 如果没有找到活动接口,获取第一个以太网接口
|
||
nic=$(ip -br link show | grep -v 'LOOPBACK' | grep -v 'DOCKER' | awk '{print $1}' | head -n 1)
|
||
fi
|
||
echo "$nic"
|
||
}
|
||
|
||
NIC=$(get_active_nic)
|
||
|
||
if [ -z "$NIC" ]; then
|
||
echo "错误:未检测到网络接口,请检查网络配置"
|
||
exit 1
|
||
fi
|
||
|
||
echo "检测到活动网络接口:$NIC"
|
||
|
||
# 备份相关配置文件
|
||
backup_configs() {
|
||
echo "正在备份配置文件..."
|
||
[ -d /etc/systemd/system/ ] && cp -n /etc/systemd/system/disable-nic-powersave.service /etc/systemd/system/disable-nic-powersave.service.bak 2>/dev/null
|
||
}
|
||
|
||
# 临时禁用网卡节能模式(立即生效)
|
||
disable_nic_powersave_temp() {
|
||
echo "正在临时禁用网卡节能模式..."
|
||
if command -v ethtool &> /dev/null; then
|
||
# 禁用EEE节能
|
||
sudo ethtool --change "$NIC" eee off 2>/dev/null
|
||
# 禁用电源管理
|
||
sudo ethtool -s "$NIC" power management off 2>/dev/null
|
||
# 启用WOL功能
|
||
sudo ethtool -s "$NIC" wol g 2>/dev/null
|
||
else
|
||
echo "警告:未安装ethtool,正在安装..."
|
||
sudo apt update >/dev/null
|
||
sudo apt install -y ethtool >/dev/null
|
||
disable_nic_powersave_temp
|
||
fi
|
||
}
|
||
|
||
# 永久禁用网卡节能模式(系统启动时生效)
|
||
disable_nic_powersave_permanent() {
|
||
echo "正在配置永久禁用网卡节能模式..."
|
||
|
||
# 创建systemd服务
|
||
cat << EOF | sudo tee /etc/systemd/system/disable-nic-powersave.service > /dev/null
|
||
[Unit]
|
||
Description=Disable NIC Power Saving Mode for $NIC
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=oneshot
|
||
ExecStart=/usr/sbin/ethtool -s $NIC wol g
|
||
ExecStart=/usr/sbin/ethtool --change $NIC eee off
|
||
ExecStart=/usr/sbin/ethtool --change $NIC power management off
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
# 启用并启动服务
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable disable-nic-powersave.service
|
||
sudo systemctl start disable-nic-powersave.service
|
||
}
|
||
|
||
# 优化SSH保持连接设置
|
||
optimize_ssh_settings() {
|
||
echo "正在优化SSH连接设置..."
|
||
SSH_CONFIG="/etc/ssh/sshd_config"
|
||
|
||
# 备份SSH配置
|
||
[ -f "$SSH_CONFIG" ] && cp -n "$SSH_CONFIG" "$SSH_CONFIG.bak"
|
||
|
||
# 设置SSH心跳检测
|
||
if ! grep -q "^ClientAliveInterval" "$SSH_CONFIG"; then
|
||
echo "ClientAliveInterval 60" >> "$SSH_CONFIG"
|
||
else
|
||
sed -i 's/^ClientAliveInterval.*/ClientAliveInterval 60/' "$SSH_CONFIG"
|
||
fi
|
||
|
||
if ! grep -q "^ClientAliveCountMax" "$SSH_CONFIG"; then
|
||
echo "ClientAliveCountMax 3" >> "$SSH_CONFIG"
|
||
else
|
||
sed -i 's/^ClientAliveCountMax.*/ClientAliveCountMax 3/' "$SSH_CONFIG"
|
||
fi
|
||
|
||
# 重启SSH服务
|
||
sudo systemctl restart sshd
|
||
}
|
||
|
||
# 检查并修复DNS服务问题
|
||
fix_dns_service() {
|
||
echo "正在检查DNS服务..."
|
||
if ! systemctl is-active --quiet systemd-resolved; then
|
||
echo "修复DNS服务问题..."
|
||
sudo apt update >/dev/null
|
||
sudo apt install --reinstall -y systemd-resolved >/dev/null
|
||
sudo systemctl enable --now systemd-resolved
|
||
fi
|
||
}
|
||
|
||
# 显示当前网卡电源管理状态
|
||
show_status() {
|
||
echo -e "\n当前网络接口状态:"
|
||
echo "-------------------------"
|
||
ip link show "$NIC" | grep -A 1 "$NIC"
|
||
echo -e "\n电源管理状态:"
|
||
ethtool "$NIC" | grep -iE "power management|energy"
|
||
echo "-------------------------"
|
||
echo "配置已完成,建议重启系统使所有设置生效"
|
||
echo "重启命令:sudo reboot"
|
||
}
|
||
|
||
# 主流程执行
|
||
backup_configs
|
||
disable_nic_powersave_temp
|
||
disable_nic_powersave_permanent
|
||
optimize_ssh_settings
|
||
fix_dns_service
|
||
show_status
|
||
|