对FunHPC平台的服务器添加公钥
服务器的环境:容器下的Ubantu22.04系统
需求:FunHPC平台(DeepLn)不保存系统镜像,只保存用户的数据镜像(存在/data路径下),再加上需要频繁释放和恢复实例,而且每次恢复都会在不同的主机上,所以配置好ssh密钥对能节省不少时间
流程:
- 将公钥文件xxx.pub的内容添加到自定义的路径下的authorized_keys文件中(我放在/data/.ssh/authorized_keys下)
- 使用chmod 600 /data/.ssh/authorized_keys赋予权限
- 修改/etc/ssh/sshd_config文件,确保AuthorizedKeysFile项生效,并添加自定义的authorized_keys路径
 如:AuthorizedKeysFile .ssh/authorized_keys /data/.ssh/authorized_keys
- 重启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 "==============================================="

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号