fix: 复制密钥到远端服务器失败
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user