diff --git a/init-debian.sh b/init-debian.sh index 98ae392..1d9bab4 100644 --- a/init-debian.sh +++ b/init-debian.sh @@ -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