116 lines
3.4 KiB
Bash
116 lines
3.4 KiB
Bash
#!/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 "所有主机处理完成"
|