对FunHPC平台的服务器添加公钥

服务器的环境:容器下的Ubantu22.04系统

需求:FunHPC平台(DeepLn)不保存系统镜像,只保存用户的数据镜像(存在/data路径下),再加上需要频繁释放和恢复实例,而且每次恢复都会在不同的主机上,所以配置好ssh密钥对能节省不少时间

流程:

  1. 将公钥文件xxx.pub的内容添加到自定义的路径下的authorized_keys文件中(我放在/data/.ssh/authorized_keys下)
  2. 使用chmod 600 /data/.ssh/authorized_keys赋予权限
  3. 修改/etc/ssh/sshd_config文件,确保AuthorizedKeysFile项生效,并添加自定义的authorized_keys路径
    如:AuthorizedKeysFile .ssh/authorized_keys /data/.ssh/authorized_keys
  4. 重启ssh服务:sudo systemctl restart sshd

问题:执行systemctl restart sshd重启ssh,报错:-bash: systemctl: command not found

  • 原因:可能是在一个 Docker 容器、LXC 容器或其他轻量级虚拟化环境中运行 Ubuntu 22.04,并且该容器被配置为使用 s6 作为其初始化系统。
    验证:执行ps -p 1 -o comm=显示s6-svscan,执行cat /etc/os-release显示PRETTY_NAME="Ubuntu 22.04.4 LTS"
  • 解决思路:找出 SSH 服务是如何启动和被 s6 监控的,查找ssh服务的实际路径,然后用s6-svc重启ssh服务
  • 尝试:
    • 执行ps aux | grep [s]shd,查看输出:
      root 7 0.0 0.0 248 116 ? S 20:48 0:00 s6-supervise 01sshd
      root 9 0.0 0.0 15448 9408 ? Ss 20:48 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
      root 144 0.0 0.0 16204 10336 ? Ss 20:50 0:00 sshd: root@pts/0
    • 执行find /etc /run /var -type d -name "01sshd" 2>/dev/null,尝试在常见的s6服务目录中查找 01sshd 的目录,查看输出:
      /etc/services.d/01sshd
    • 执行sudo s6-svc -r /etc/services.d/01sshd重启ssh服务
    • 再次执行ps aux | grep [s]shd,查看输出(发现sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups进程号和启动时间已变):
      root 7 0.0 0.0 248 116 ? S 20:48 0:00 s6-supervise 01sshd
      root 144 0.0 0.0 16204 10336 ? Ss 20:50 0:00 sshd: root@pts/0
      root 465 0.5 0.0 15448 8916 ? Ss 21:12 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
    • 重新通过ssh连接,不用手动输密码,成功

便捷性设置:
写脚本存放在用户数据路径/data下,不用每次还原都重新手动配置,以后除了还原后第一次进入需要输入密码进系统,执行脚本后都无需再次输入:

#!/bin/bash

# 脚本名称: setup.sh
# 描述: 自动配置SSH服务器,使其在/data/.ssh/authorized_keys中查找公钥。

SSH_CONFIG_FILE="/etc/ssh/sshd_config"
AUTH_KEYS_PATH_TO_ADD="/data/.ssh/authorized_keys"
DEFAULT_AUTH_KEYS_PATH=".ssh/authorized_keys"

echo "==============================================="
echo "开始配置SSH服务以支持 /data/.ssh/authorized_keys"
echo "==============================================="

# 1. 检查是否以root权限运行
if [[ $EUID -ne 0 ]]; then
   echo "此脚本需要root权限运行。请使用 sudo ./configure_ssh_authorized_keys_path.sh"
   exit 1
fi

# 2. 备份原始的sshd_config文件
echo "备份原始的SSH配置文件到 ${SSH_CONFIG_FILE}.bak..."
cp "$SSH_CONFIG_FILE" "${SSH_CONFIG_FILE}.bak"
if [ $? -eq 0 ]; then
    echo "备份成功。"
else
    echo "备份失败!请手动备份后重试。"
    exit 1
fi

# 3. 检查并修改AuthorizedKeysFile配置
echo "检查 AuthorizedKeysFile 配置项..."

# 使用grep查找现有配置行
current_line=$(grep -E '^\s*#?AuthorizedKeysFile' "$SSH_CONFIG_FILE" | head -n 1)

if [ -z "$current_line" ]; then
    # 如果没有找到 AuthorizedKeysFile 行,则在文件末尾添加
    echo "未找到 AuthorizedKeysFile 配置项,在文件末尾添加新行。"
    echo "AuthorizedKeysFile ${DEFAULT_AUTH_KEYS_PATH} ${AUTH_KEYS_PATH_TO_ADD}" >> "$SSH_CONFIG_FILE"
    MODIFIED=true
elif [[ "$current_line" == *" ${AUTH_KEYS_PATH_TO_ADD}"* ]]; then
    # 如果已经包含 /data/.ssh/authorized_keys
    echo "AuthorizedKeysFile 已经包含 ${AUTH_KEYS_PATH_TO_ADD},无需修改。"
    MODIFIED=false
else
    # 如果找到了,但没有包含 /data/.ssh/authorized_keys
    echo "发现现有 AuthorizedKeysFile 配置:'$current_line'"

    # 替换现有行或取消注释并追加
    if [[ "$current_line" == \#* ]]; then
        # 如果是注释掉的行,取消注释并追加
        echo "取消注释并追加 ${AUTH_KEYS_PATH_TO_ADD} 到 AuthorizedKeysFile..."
        sed -i "s|^#AuthorizedKeysFile\s*\(.*\)$|AuthorizedKeysFile \1 ${AUTH_KEYS_PATH_TO_ADD}|" "$SSH_CONFIG_FILE"
    else
        # 如果是未注释的行,直接追加
        echo "追加 ${AUTH_KEYS_PATH_TO_ADD} 到现有 AuthorizedKeysFile..."
        # 确保不会重复添加默认路径
        sed -i "s|^AuthorizedKeysFile\s*\(.*\)$|AuthorizedKeysFile \1 ${AUTH_KEYS_PATH_TO_ADD}|" "$SSH_CONFIG_FILE"
    fi
    MODIFIED=true
fi

# 3. 重启SSH服务
echo "尝试重启SSH服务..."

# 尝试使用systemctl,如果失败则尝试service
if command -v systemctl &> /dev/null; then
    systemctl restart sshd
    if [ $? -eq 0 ]; then
        echo "SSH服务重启成功 (systemctl)。"
    else
        echo "SSH服务重启失败 (systemctl)。尝试 service 命令..."
        service sshd restart
        if [ $? -eq 0 ]; then
            echo "SSH服务重启成功 (service)。"
        else
            s6-svc -r /etc/services.d/01sshd
            if [ $? -eq 0 ]; then
                echo "SSH服务重启成功 (service)。"
            else
                echo "SSH服务重启失败 (service)。请手动检查SSH服务状态!"
                exit 1
        fi
    fi
else
    echo "未找到 systemctl 命令,尝试使用 service 命令..."
    service sshd restart
    if [ $? -eq 0 ]; then
        echo "SSH服务重启成功 (service)。"
    else
        s6-svc -r /etc/services.d/01sshd
        if [ $? -eq 0 ]; then
            echo "SSH服务重启成功 (service)。"
        else
            echo "SSH服务重启失败 (service)。请手动检查SSH服务状态!"
            exit 1
    fi
fi

echo "==============================================="
echo "SSH服务配置完成。请立即尝试从Windows连接以验证。"
echo "如果连接失败,请检查 /var/log/auth.log 或 /var/log/secure 获取更多信息。"
echo "原始配置文件已备份到 ${SSH_CONFIG_FILE}.bak"
echo "==============================================="
posted @ 2025-08-22 21:49  kksk43  阅读(23)  评论(0)    收藏  举报
特效
黑夜
侧边栏隐藏