diff --git a/generate_ssh_key.sh b/generate_ssh_key.sh new file mode 100644 index 0000000..92f311c --- /dev/null +++ b/generate_ssh_key.sh @@ -0,0 +1,37 @@ +#!/bin/sh +set -e + +# ====================================================== +# OpenWrt 公钥生成脚本 +# ====================================================== + +KEY_NAME="id_dropbear" +HIDDEN_DIR="$HOME/.ssh" +PUBLIC_DIR="$HOME/ssh_public" # 普通目录,方便用户下载 + +PRIV_KEY="$HIDDEN_DIR/$KEY_NAME" +PUB_KEY="$HIDDEN_DIR/$KEY_NAME.pub" +PUB_KEY_COPY="$PUBLIC_DIR/$KEY_NAME.pub" + +# 创建目录 +mkdir -p "$HIDDEN_DIR" +chmod 700 "$HIDDEN_DIR" + +mkdir -p "$PUBLIC_DIR" +chmod 755 "$PUBLIC_DIR" + +# 生成密钥 +if [ ! -f "$PRIV_KEY" ]; then + echo "未发现 SSH 密钥,开始生成(ed25519)..." + ssh-keygen -t ed25519 -f "$PRIV_KEY" -N "" +else + echo "已存在 SSH 密钥,跳过生成" +fi + +# 复制公钥到普通目录,方便用户下载 +cp -f "$PUB_KEY" "$PUB_KEY_COPY" +chmod 644 "$PUB_KEY_COPY" + +echo "✅ 公钥生成完成" +echo "隐藏目录: $PUB_KEY" +echo "可下载副本: $PUB_KEY_COPY" diff --git a/install_pubkey_fnos.sh b/install_pubkey_fnos.sh new file mode 100644 index 0000000..5d4d1db --- /dev/null +++ b/install_pubkey_fnos.sh @@ -0,0 +1,44 @@ +#!/bin/sh +set -e + +# ====================================================== +# 飞牛 NAS 安装公钥 & 修复权限 & 添加 sudo NOPASSWD(避免重复) +# ====================================================== + +USER_NAME="$1" +PUB_KEY_PATH="$2" + +if [ -z "$USER_NAME" ] || [ -z "$PUB_KEY_PATH" ]; then + echo "用法: $0 <用户名> <公钥文件路径>" + exit 1 +fi + +HOME_DIR="/home/$USER_NAME" +SSH_DIR="$HOME_DIR/.ssh" +AUTH_KEYS="$SSH_DIR/authorized_keys" + +# ===== 安装公钥 ===== +mkdir -p "$SSH_DIR" +cp -f "$PUB_KEY_PATH" "$AUTH_KEYS" + +# 修复权限 +chown "$USER_NAME" "$HOME_DIR" "$SSH_DIR" "$AUTH_KEYS" +chmod 700 "$SSH_DIR" +chmod 600 "$AUTH_KEYS" + +echo "✅ 公钥已安装并权限修复完成" + +# ===== 配置 sudoers NOPASSWD ===== +SUDO_FILE="/etc/sudoers.d/${USER_NAME}_poweroff" +SUDO_RULE="$USER_NAME ALL=(root) NOPASSWD:/usr/bin/systemctl poweroff" + +# 如果文件不存在或者文件内容不同,则写入 +if [ ! -f "$SUDO_FILE" ] || ! grep -Fxq "$SUDO_RULE" "$SUDO_FILE"; then + echo "$SUDO_RULE" > "$SUDO_FILE" + chmod 440 "$SUDO_FILE" + echo "✅ sudoers 已添加 NOPASSWD 规则 ($SUDO_FILE)" +else + echo "⚠️ sudoers NOPASSWD 规则已存在,无需重复添加" +fi + +echo "可以测试: ssh $USER_NAME@NAS_IP 'sudo -n /usr/bin/systemctl poweroff'" diff --git a/push-sshkey-to-fnos.sh b/push-sshkey-to-fnos.sh deleted file mode 100644 index c11215b..0000000 --- a/push-sshkey-to-fnos.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/sh -set -e - -# ===== 参数 ===== -USER_NAME="$1" -NAS_IP="$2" - -KEY_DIR="/root/.ssh" -KEY_NAME="id_dropbear" -PRIV_KEY="$KEY_DIR/$KEY_NAME" -PUB_KEY="$KEY_DIR/$KEY_NAME.pub" - -# ===== 参数检查 ===== -if [ -z "$USER_NAME" ] || [ -z "$NAS_IP" ]; then - echo "用法: $0 <飞牛用户名> <飞牛IP>" - exit 1 -fi - -# ===== 阶段一:在 OpenWrt 上生成 SSH 密钥 ===== -echo "== [1/2] 检查并生成 SSH 密钥 ==" - -if [ ! -d "$KEY_DIR" ]; then - mkdir -p "$KEY_DIR" - chmod 700 "$KEY_DIR" -fi - -if [ ! -f "$PRIV_KEY" ]; then - echo "未发现 SSH 密钥,开始生成(ed25519)..." - ssh-keygen -t ed25519 -f "$PRIV_KEY" -N "" -else - echo "已存在 SSH 密钥,跳过生成" -fi - -# ===== 阶段二:检测远程是否能免密,首次登录提示手动输入密码 ===== -echo "== [2/2] 推送公钥到飞牛 NAS ==" - -# 尝试用公钥免密登录 -ssh -o BatchMode=yes "$USER_NAME@$NAS_IP" "echo '免密测试成功'" >/dev/null 2>&1 -if [ $? -ne 0 ]; then - echo "⚠️ 检测到首次登录,需手动输入密码并确认 host key" - echo "请在提示时输入密码,完成一次手动登录,然后再运行脚本即可实现免密" - echo "你可以先运行: ssh $USER_NAME@$NAS_IP" - exit 1 -fi - -# 远程操作:创建 .ssh 目录及权限 -ssh "$USER_NAME@$NAS_IP" << 'EOF' -set -e - -# 使用远程真实 HOME -HOME_DIR="$HOME" -SSH_DIR="$HOME_DIR/.ssh" -AUTH_KEYS="$SSH_DIR/authorized_keys" - -mkdir -p "$SSH_DIR" -chmod 700 "$SSH_DIR" - -touch "$AUTH_KEYS" -chmod 600 "$AUTH_KEYS" -EOF - -# 推送公钥到远程 authorized_keys -cat "$PUB_KEY" | ssh "$USER_NAME@$NAS_IP" "cat >> ~/.ssh/authorized_keys" - -echo "✅ SSH 公钥已成功推送:$USER_NAME@$NAS_IP" -echo "ℹ️ 以后可直接免密登录(ssh $USER_NAME@$NAS_IP)"