fix: 复制密钥到远端服务器失败

This commit is contained in:
2025-12-07 20:14:03 +08:00
parent 01cc96f23e
commit 5e7a736017

View File

@@ -408,54 +408,71 @@ task_12_copy_ssh_key() {
# 使用 sshpass 执行 ssh-copy-id添加 SSH 选项以处理 host key
log_info "正在尝试复制公钥到远程服务器(使用 kairee 用户的密钥)..."
# 创建临时脚本文件来执行 SSH 命令(避免引号嵌套问题)
TEMP_SCRIPT=$(mktemp)
chmod 700 "$TEMP_SCRIPT"
# 在 kairee 用户目录下创建临时脚本文件(避免 /tmp 权限问题)
TEMP_SCRIPT="${KAIREE_HOME}/.ssh/temp_ssh_copy_$$.sh"
mkdir -p "${KAIREE_HOME}/.ssh"
chown kairee:kairee "${KAIREE_HOME}/.ssh"
# 先测试连接并接受 host key这会自动将 host key 添加到 kairee 用户的 known_hosts
cat > "$TEMP_SCRIPT" << EOF
# 使用 sudo -u kairee tee 来创建文件,确保文件所有者是 kairee
sudo -u kairee tee "$TEMP_SCRIPT" > /dev/null << EOF
#!/bin/bash
sshpass -p "$REMOTE_SSH_PASSWORD" ssh -p $REMOTE_PORT \
sshpass -p "$REMOTE_SSH_PASSWORD" ssh -p "$REMOTE_PORT" \
-o StrictHostKeyChecking=accept-new \
-o PasswordAuthentication=yes \
-o UserKnownHostsFile="$SSH_KNOWN_HOSTS" \
"$REMOTE_SSH_COPY_ID_USER@$REMOTE_HOST" exit
EOF
chmod 700 "$TEMP_SCRIPT"
if sudo -u kairee bash "$TEMP_SCRIPT" >/dev/null 2>&1; then
# 执行测试连接,捕获错误信息
TEST_OUTPUT=$(sudo -u kairee bash "$TEMP_SCRIPT" 2>&1)
TEST_EXIT_CODE=$?
if [ $TEST_EXIT_CODE -eq 0 ]; then
# 连接成功,现在复制公钥(此时 host key 已确认,使用 StrictHostKeyChecking=no
cat > "$TEMP_SCRIPT" << EOF
sudo -u kairee tee "$TEMP_SCRIPT" > /dev/null << EOF
#!/bin/bash
sshpass -p "$REMOTE_SSH_PASSWORD" ssh-copy-id -p $REMOTE_PORT \
sshpass -p "$REMOTE_SSH_PASSWORD" ssh-copy-id -p "$REMOTE_PORT" \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile="$SSH_KNOWN_HOSTS" \
"$REMOTE_SSH_COPY_ID_USER@$REMOTE_HOST"
EOF
chmod 700 "$TEMP_SCRIPT"
if sudo -u kairee bash "$TEMP_SCRIPT" >/dev/null 2>&1; then
rm -f "$TEMP_SCRIPT"
# 执行 ssh-copy-id捕获错误信息
COPY_OUTPUT=$(sudo -u kairee bash "$TEMP_SCRIPT" 2>&1)
COPY_EXIT_CODE=$?
if [ $COPY_EXIT_CODE -eq 0 ]; then
sudo -u kairee rm -f "$TEMP_SCRIPT"
log_success "公钥已复制到远程服务器kairee 用户)"
rm -f "$TEMP_SCRIPT"
unset REMOTE_SSH_PASSWORD
return 0
else
rm -f "$TEMP_SCRIPT"
sudo -u kairee rm -f "$TEMP_SCRIPT"
RETRY_COUNT=$((RETRY_COUNT + 1))
if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
log_error "公钥复制失败,请重试"
log_info "错误信息: ${COPY_OUTPUT:0:200}" # 只显示前200个字符
unset REMOTE_SSH_PASSWORD
else
log_error "已达到最大重试次数,跳过 ssh-copy-id"
log_info "最后错误信息: ${COPY_OUTPUT:0:200}"
unset REMOTE_SSH_PASSWORD
return 1
fi
fi
else
rm -f "$TEMP_SCRIPT"
sudo -u kairee rm -f "$TEMP_SCRIPT"
RETRY_COUNT=$((RETRY_COUNT + 1))
if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
log_error "密码错误或连接失败,请重试"
log_info "错误信息: ${TEST_OUTPUT:0:200}" # 只显示前200个字符
unset REMOTE_SSH_PASSWORD
else
log_error "已达到最大重试次数,跳过 ssh-copy-id"
log_info "最后错误信息: ${TEST_OUTPUT:0:200}"
unset REMOTE_SSH_PASSWORD
return 1
fi