6/28/2026
setup-ssh-admin.sh
#!/usr/bin/env bash
set -euo pipefail
# 用法:
# sudo chmod +x setup-ssh-admin.sh
# sudo ./setup-ssh-admin.sh [用户名,默认 root]
#
# 警告:
# 1. 此脚本会修改 SSH 配置并设置密码,存在安全风险,请仅在受信任网络使用。
# 2. 建议使用强密码,并在配置完成后考虑改用密钥登录。
# 3. 操作前会自动备份 /etc/ssh/sshd_config。
ADMIN_USER="${1:-root}"
SSHD_CONFIG="/etc/ssh/sshd_config"
BACKUP_SUFFIX=".bak.$(date +%Y%m%d%H%M%S)"
if [[ "$EUID" -ne 0 ]]; then
echo "错误: 此脚本需要 root 权限,请使用 sudo 运行。"
exit 1
fi
echo ""
echo "========================================"
echo "警告: 即将启用 $ADMIN_USER 的 SSH 密码登录"
echo "========================================"
echo ""
echo "这会带来以下影响:"
echo " - 如未安装,会自动安装 OpenSSH 服务器"
echo " - 修改 $SSHD_CONFIG"
echo " - 设置/修改 $ADMIN_USER 的密码"
echo " - 重启 SSH 服务"
echo ""
read -rp "确定要继续吗? (yes/no): " CONFIRM
if [[ "$CONFIRM" != "yes" ]]; then
echo "已取消操作。"
exit 0
fi
# 安装 OpenSSH 服务器
install_ssh_server() {
echo "==> 检查并安装 OpenSSH 服务器..."
if command -v sshd &>/dev/null && [[ -f "$SSHD_CONFIG" ]]; then
echo "==> OpenSSH 服务器已安装。"
return 0
fi
if command -v apt-get &>/dev/null; then
apt-get update
apt-get install -y openssh-server
elif command -v dnf &>/dev/null; then
dnf install -y openssh-server
elif command -v yum &>/dev/null; then
yum install -y openssh-server
elif command -v pacman &>/dev/null; then
pacman -S --noconfirm openssh
elif command -v zypper &>/dev/null; then
zypper install -y openssh
else
echo "错误: 无法识别包管理器,请手动安装 openssh-server。"
exit 1
fi
# 启用并启动服务
if command -v systemctl &>/dev/null; then
systemctl enable sshd 2>/dev/null || systemctl enable ssh 2>/dev/null || true
systemctl start sshd 2>/dev/null || systemctl start ssh 2>/dev/null || true
elif command -v service &>/dev/null; then
service sshd start 2>/dev/null || service ssh start 2>/dev/null || true
fi
}
install_ssh_server
# 备份原配置
echo "==> 备份 $SSHD_CONFIG ..."
cp "$SSHD_CONFIG" "${SSHD_CONFIG}${BACKUP_SUFFIX}"
# 设置/修改密码
echo "==> 设置 $ADMIN_USER 的密码..."
if [[ "$ADMIN_USER" == "root" ]]; then
passwd
else
passwd "$ADMIN_USER"
fi
# 修改 SSH 配置
echo "==> 修改 SSH 配置..."
# 确保配置项存在,先注释掉所有旧的,再追加新的
sed -i 's/^[[:space:]]*#*[[:space:]]*PermitRootLogin.*/#PermitRootLogin commented by script/' "$SSHD_CONFIG" || true
sed -i 's/^[[:space:]]*#*[[:space:]]*PasswordAuthentication.*/#PasswordAuthentication commented by script/' "$SSHD_CONFIG" || true
sed -i 's/^[[:space:]]*#*[[:space:]]*ChallengeResponseAuthentication.*/#ChallengeResponseAuthentication commented by script/' "$SSHD_CONFIG" || true
sed -i 's/^[[:space:]]*#*[[:space:]]*UsePAM.*/#UsePAM commented by script/' "$SSHD_CONFIG" || true
cat >> "$SSHD_CONFIG" <<EOF
# Added by setup-ssh-admin.sh
PasswordAuthentication yes
ChallengeResponseAuthentication yes
UsePAM yes
EOF
if [[ "$ADMIN_USER" == "root" ]]; then
cat >> "$SSHD_CONFIG" <<EOF
PermitRootLogin yes
EOF
else
cat >> "$SSHD_CONFIG" <<EOF
PermitRootLogin prohibit-password
EOF
fi
# 重启 SSH 服务
echo "==> 重启 SSH 服务..."
if command -v systemctl &>/dev/null; then
systemctl restart sshd || systemctl restart ssh
elif command -v service &>/dev/null; then
service sshd restart || service ssh restart
else
echo "警告: 无法自动重启 SSH 服务,请手动重启。"
exit 1
fi
echo ""
echo "==> SSH 配置完成。"
echo "备份文件: ${SSHD_CONFIG}${BACKUP_SUFFIX}"
echo ""
echo "当前生效配置:"
sshd -T 2>/dev/null | grep -E '^(permitrootlogin|passwordauthentication|challengeresponseauthentication|usepam)' || true