← Back
Set up key-based login
Writes a public key into the given user authorized_keys and fixes the permissions. The key arrives as an argument, never from standard input.
Root required
One-line run
curl -fsSL https://www.moiu.cn/scripts/ssh-key-setup.sh | bashSource
#!/usr/bin/env bash
# 配置 SSH 密钥登录
#
# 把一个公钥写进指定用户的 authorized_keys,权限一并修好。
# ❗ 公钥从命令行参数传,不从标准输入读 —— 这脚本是给 curl | bash 用的。
# 用法:bash ssh-key-setup.sh '<公钥>' [用户名] 默认 root
set -e
# 需要 root:下面的系统级改动都直接执行,不再逐条 sudo
if [ "$(id -u)" -ne 0 ]; then
echo '[!] 这个脚本需要 root 权限,请用 sudo 重新运行:'
echo ' curl -fsSL 脚本地址 | sudo bash'
echo ' 或已经下载到本地:sudo bash 本文件'
exit 1
fi
KEY="$1"
TARGET_USER="$2"
if [ -z "$KEY" ]; then
echo '用法:bash ssh-key-setup.sh <公钥> [用户名]'
echo " 例:bash ssh-key-setup.sh 'ssh-ed25519 AAAA... me@laptop' root"
exit 1
fi
if [ -z "$TARGET_USER" ]; then
TARGET_USER=root
fi
if ! id "$TARGET_USER" >/dev/null 2>&1; then
echo "[!] 没有这个用户:$TARGET_USER"
exit 1
fi
HOME_DIR=$(getent passwd "$TARGET_USER" | cut -d: -f6)
if [ -z "$HOME_DIR" ] || [ ! -d "$HOME_DIR" ]; then
echo "[!] 取不到 $TARGET_USER 的家目录"
exit 1
fi
SSH_DIR="$HOME_DIR/.ssh"
AUTH="$SSH_DIR/authorized_keys"
mkdir -p "$SSH_DIR"
touch "$AUTH"
if grep -qF "$KEY" "$AUTH"; then
echo '[*] 这个公钥已经在 authorized_keys 里了,没重复追加'
else
printf '%s\n' "$KEY" >> "$AUTH"
echo '[*] 已追加公钥'
fi
chmod 700 "$SSH_DIR"
chmod 600 "$AUTH"
chown -R "$TARGET_USER":"$TARGET_USER" "$SSH_DIR" 2>/dev/null || true
echo ''
echo " 用户:$TARGET_USER"
echo " 文件:$AUTH"
echo " 现有 $(grep -c . "$AUTH" || echo 0) 个公钥"
echo ''
echo '❗ 另开一个终端用密钥登录验证一次,再考虑关掉密码登录。'
