diff --git a/tools/ssh_key_push.sh b/tools/ssh_key_push.sh index a5fdd0c..1ed04c1 100755 --- a/tools/ssh_key_push.sh +++ b/tools/ssh_key_push.sh @@ -29,18 +29,47 @@ else fi servers=() while IFS= read -r line; do + # 跳过空行和注释行 + [[ -z "$line" || "$line" =~ ^# ]] && continue servers+=("$line") done < "$file_path" fi # 推送公钥到远程服务器 +public_key=$(cat ~/.ssh/id_rsa.pub) for server in "${servers[@]}"; do - public_key=$(cat ~/.ssh/id_rsa.pub) - ssh "$server" "mkdir -p ~/.ssh && echo '$public_key' >> ~/.ssh/authorized_keys" - if [ $? -eq 0 ]; then + # 第一次尝试推送 + echo "正在推送公钥到 $server..." + output=$(ssh "$server" "mkdir -p ~/.ssh && echo '$public_key' >> ~/.ssh/authorized_keys" 2>&1) + exit_code=$? + + if [ $exit_code -eq 0 ]; then echo "公钥已成功推送到 $server" - else - echo "推送公钥到 $server 时出错。" + continue fi -done - \ No newline at end of file + + # 检测是否是主机密钥验证失败 + if echo "$output" | grep -q "Host key verification failed"; then + echo "检测到 $server 的主机密钥已变更,正在清理旧密钥..." + # 提取主机地址(处理 user@host 格式,取 @ 后面的部分) + host=$(echo "$server" | cut -d'@' -f2) + # 清理旧密钥 + cleanup_output=$(ssh-keygen -R "$host" 2>&1) + if [ $? -ne 0 ]; then + echo "清理 $host 旧密钥失败:$cleanup_output" + continue + fi + echo "已清理 $host 的旧密钥,重新尝试推送..." + # 重新推送 + retry_output=$(ssh "$server" "mkdir -p ~/.ssh && echo '$public_key' >> ~/.ssh/authorized_keys" 2>&1) + retry_code=$? + if [ $retry_code -eq 0 ]; then + echo "公钥已成功推送到 $server" + else + echo "重新推送 $server 失败:$retry_output" + fi + else + # 其他错误类型 + echo "推送 $server 失败:$output" + fi +done \ No newline at end of file