Linux 服务器一键开户脚本:SSH 公钥部署与 Sudo 授权

2025 年 12 月 31 日 星期三(已编辑)
9
1

Linux 服务器一键开户脚本:SSH 公钥部署与 Sudo 授权

Linux 服务器一键开户脚本:SSH 公钥部署与 Sudo 授权

痛点分析

在管理多台服务器(如 Rocky Linux/CentOS/Ubuntu)时,为新同事开通账号通常涉及以下繁琐步骤:

创建用户 (useradd)

创建目录 (mkdir .ssh) 并赋予严格权限 (700)

写入公钥 (authorized_keys) 并赋予严格权限 (600)

配置 Sudo (/etc/sudoers.d/)

修复上下文 (SELinux restorecon)

如果手动操作,极易因权限配置错误(如目录权限非 700)导致 SSH 拒绝连接。本文分享一个企业级 Shell 脚本,将上述 5 步封装为“一键流”,确保零失误。

客户端准备 (生成公钥)

在 Windows (PowerShell) 或 macOS/Linux 终端执行生成指令。推荐使用 Ed25519 算法,因为它更短、更安全。

语法:ssh-keygen -t 算法 -C "备注信息"

ssh-keygen -t ed25519 -C "nathan"

提示:一路回车即可,默认保存在C:\Users用户.ssh 目录下。生成后两个文件

id_ed25519为私钥用于连接服务器

id_ed25519 .pub 为公钥复制给服务器

服务端部署 (自动化脚本)

在服务器上创建脚本文件 add_ssh_user.sh,粘贴以下内容。

脚本逻辑 (V4.0):采用“先贴公钥 -> 再定用户名”的顺手逻辑,内置了 幂等性检查(防止重复写入)和 SELinux/权限自动修复。

# ========================================================
# 脚本名称:Auto-Provision SSH User (V4.0)
# 功能描述:一键创建用户、写入公钥、配置免密 Sudo
# ========================================================

# 0. 权限自检
if [ "$EUID" -ne 0 ]; then echo "❌ 请以 root 运行"; exit 1; fi

# 1. 先粘贴公钥 (利用剪贴板热度)
read -p "🔑 请粘贴 SSH 公钥: " PUBKEY
if [[ -z "$PUBKEY" ]]; then echo "❌ 公钥不能为空,脚本退出"; exit 1; fi

# 2. 再输入用户名
read -p "👤 请输入用户名 (如 nathan): " USER_NAME
if [[ -z "$USER_NAME" ]]; then echo "❌ 用户名不能为空,脚本退出"; exit 1; fi

# 3. 创建账号 (静默模式,存在则忽略)
id "$USER_NAME" &>/dev/null || useradd -m -s /bin/bash "$USER_NAME"

# 4. 准备环境
U_HOME=$(eval echo ~$USER_NAME)
mkdir -p "$U_HOME/.ssh"

# 5. 写入公钥 (自动去重)
if ! grep -qF "$PUBKEY" "$U_HOME/.ssh/authorized_keys" 2>/dev/null; then
    echo "$PUBKEY" >> "$U_HOME/.ssh/authorized_keys"
    echo ">> 密钥已写入"
fi

# 6. 权限修复 (关键步骤:强制修正为 700/600)
chown -R "$USER_NAME":"$USER_NAME" "$U_HOME/.ssh"
chmod 700 "$U_HOME/.ssh"
chmod 600 "$U_HOME/.ssh/authorized_keys"
[ -x "$(command -v restorecon)" ] && restorecon -Rv "$U_HOME/.ssh" &>/dev/null

# 7. 赋予 Sudo 免密 (可选,不需要可注释掉)
echo "$USER_NAME ALL=(ALL) NOPASSWD: ALL" > "/etc/sudoers.d/$USER_NAME"
chmod 0440 "/etc/sudoers.d/$USER_NAME"

echo "✅ 配置完成!登录指令: ssh $USER_NAME@$(hostname -I | awk '{print $1}')"
  1. 赋予脚本执行权限并运行:
chmod +x add_ssh_user.sh
./add_ssh_user.sh

实际操作流程如下:

交互演示:(自行修改)

  1. 粘贴公钥 (提示弹出后,直接 Ctrl+V)🔑 请粘贴 SSH 公钥:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKx3fLZyWiZ45KQkcG3u7GbpOZAJbws0USchZGBR5yXw

  1. 定义用户名 👤 请输入用户名 (如 nathan): nathan

  2. 脚本自动完成配置

> 密钥已写入 ✅ 配置完成!登录指令: ssh nathan@192.168.31.200

  1. 结果验证与排查
  2. 验证公钥归位 使用 grep -H (强制显示文件名) 检查公钥是否正确写入。即便系统中只有一个用户,加上 -H 参数也能确保看到完整的路径,方便确认是否写错了目录。
grep -H "ssh-" /home/*/.ssh/authorized_keys

输出示例:

/home/nathan/.ssh/authorized_keys:ssh-ed25519 AAAAC3NzaC1lZDI1NTE5...

  1. 验证 Sudo 权限 登录新用户,输入 sudo -i,如果无需密码直接切换为 root,即代表配置成功。

  2. 故障排查 (老中医指令) 如果配置后仍无法登录,请在服务器端执行以下检查:

查日志 (最直接):查看 SSH 拒绝连接的具体原因(如 User unknown 或 Authentication refused)。 bash tail -n 20 /var/log/secure

查权限 (最常见):SSH 对权限非常敏感,.ssh 目录必须是 700,文件必须是 600。

ls -ld /home/nathan/.ssh

故障排查

检查目录权限 (应为 drwx------)

⚠️ 安全提示:脚本默认开启了 NOPASSWD (免密 Sudo) 方便内网开发。如果是生产环境,建议删除脚本中关于 /etc/sudoers.d 的部分,改用标准密码验证。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...