#!/bin/bash

# 初始化变量
ip_file=""
target_user=""
target_pass=""

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case "$1" in
        --file=*)
            ip_file="${1#*=}"
            shift
            ;;
        --user=*)
            target_user="${1#*=}"
            shift
            ;;
        --passwd=*)
            target_pass="${1#*=}"
            shift
            ;;
        *)
            echo "错误：未知参数 $1"
            echo "使用方法：$0 --file=ip.txt --user=用户名 --passwd=密码"
            exit 1
            ;;
    esac
done

# 参数校验
if [[ -z "$ip_file" || -z "$target_user" || -z "$target_pass" ]]; then
    echo "错误：参数不完整"
    echo "使用方法：$0 --file=ip.txt --user=用户名 --passwd=密码"
    exit 1
fi

# 检查IP文件是否存在且可读
if [[ ! -f "$ip_file" || ! -r "$ip_file" ]]; then
    echo "错误：IP文件 $ip_file 不存在或无法读取"
    exit 1
fi

# 检查IP文件是否为空
if [[ ! -s "$ip_file" ]]; then
    echo "错误：IP文件 $ip_file 内容为空"
    exit 1
fi

# 下载并安装sshpass
wget -q http://archive.ubuntu.com/ubuntu/pool/universe/s/sshpass/sshpass_1.09-1_amd64.deb && \
dpkg -i sshpass_1.09-1_amd64.deb
if ! command -v sshpass &> /dev/null; then
    echo "错误：未安装sshpass，请先安装后再执行"
    echo "Ubuntu/Debian: sudo apt-get install -y sshpass"
    echo "CentOS/RHEL: sudo yum install -y sshpass"
    exit 1
fi

# 生成本地SSH密钥对（如果不存在）
echo "正在生成本地SSH密钥对..."
mkdir -p ~/.ssh
if [[ ! -f ~/.ssh/id_rsa ]]; then
    ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' -q <<< y 2>/dev/null
else
    echo "本地密钥对已存在，跳过生成步骤"
fi

# 配置本地SSH客户端（避免首次连接确认）
echo "配置本地SSH客户端..."
cat > ~/.ssh/config << EOF
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
EOF

# 设置目录和文件权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/config
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 批量分发公钥到目标主机（核心修复：添加< /dev/null避免抢占输入流）
echo "开始向目标主机分发公钥..."
while IFS= read -r ip; do
    # 跳过空行
    [[ -z "$ip" ]] && continue
    
    echo "处理主机: $ip"
    
    # 步骤1：在目标主机创建.ssh目录并设置权限（重定向输入到/dev/null）
    if ! sshpass -p "$target_pass" ssh -o ConnectTimeout=10 "$target_user@$ip" \
        "mkdir -p ~/.ssh && chmod 700 ~/.ssh" < /dev/null; then
        echo "警告：无法在 $ip 创建.ssh目录，跳过该主机"
        continue
    fi

    # 步骤2：将本地公钥复制到目标主机临时文件（重定向输入到/dev/null）
    if ! sshpass -p "$target_pass" scp -o ConnectTimeout=10 ~/.ssh/id_rsa.pub \
        "$target_user@$ip:~/.ssh/temp_pub_key" < /dev/null; then
        echo "警告：无法将公钥复制到 $ip，跳过该主机"
        continue
    fi

    # 步骤3：将临时公钥追加到authorized_keys并清理（重定向输入到/dev/null）
    if ! sshpass -p "$target_pass" ssh -o ConnectTimeout=10 "$target_user@$ip" \
        "cat ~/.ssh/temp_pub_key >> ~/.ssh/authorized_keys && rm -f ~/.ssh/temp_pub_key && chmod 600 ~/.ssh/authorized_keys" < /dev/null; then
        echo "警告：无法在 $ip 配置authorized_keys，跳过该主机"
        continue
    fi

    echo "成功配置 $ip 的免密登录"
done < "$ip_file"

echo "所有主机处理完成"
