← 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 | bash

Source

#!/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 '❗ 另开一个终端用密钥登录验证一次,再考虑关掉密码登录。'

Download the raw file