对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号