自动批量实现linux机器ssh免密shell脚本
要同时指定SSH端口和密码来实现非交互式地使用ssh-copy-id,可以使用sshpass来实现。sshpass是一个用于通过非交互方式输入密码的工具。下面是一个示例脚本,它使用sshpass、ssh-copy-id以及指定的端口号来实现这一目标:
1 #!/bin/bash 2 3 # 检查是否提供了目标主机列表文件 4 if [ $# -eq 0 ]; then 5 echo "用法: $0 <目标主机列表文件> <SSH端口号> <密码>" 6 exit 1 7 fi 8 9 # 目标主机列表文件 10 host_list_file="$1" 11 12 # 检查文件是否存在 13 if [ ! -f "$host_list_file" ]; then 14 echo "错误: 文件 '$host_list_file' 不存在" 15 exit 1 16 fi 17 18 # SSH端口号 19 ssh_port="$2" 20 21 # 密码 22 password="$3" 23 24 # 读取目标主机列表文件,一行一个主机 25 while IFS= read -r host; do 26 echo "正在处理 $host..." 27 28 # 生成SSH密钥对(如果不存在) 29 if [ ! -f ~/.ssh/id_rsa ]; then 30 ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa 31 fi 32 33 # 使用sshpass和ssh-copy-id将公钥拷贝到目标主机上 34 sshpass -p "$password" ssh-copy-id -i ~/.ssh/id_rsa.pub "-p $ssh_port" "$host" 35 36 # 检查结果并输出 37 if [ $? -eq 0 ]; then 38 echo "成功将公钥拷贝到 $host" 39 else 40 echo "无法将公钥拷贝到 $host,请手动处理" 41 fi 42 done < "$host_list_file"
请注意,此脚本假定你已经生成了SSH密钥对(如果没有,请先使用ssh-keygen命令生成)。然后,你可以将脚本保存为一个文件(比如ssh_setup.sh
),给予执行权限:
bash
chmod +x ssh_setup.sh
然后,运行脚本并传递目标主机列表文件的路径、SSH端口号和密码作为参数:
bash
./ssh_setup.sh host_list.txt 2222 YourPassword
这样脚本会将公钥拷贝到每个目标主机上,并且在这个过程中使用指定的SSH端口和密码。
本人从事IT行业,目前在企业做私有云,擅长openstack、ceph、k8s、python等技术,欢迎一起学习!