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