背景:批量做免密操作,114台主机10分钟才跑完,主机在国外
前提条件:
使用ssh-keygen生成密钥
ssh-keygen -q -f ~/.ssh/zabbix001 -b 2048 -t rsa -N '' -C 用于aws云主机的
-q:静默输入
-f:指定用来保存密钥的文件名
-b:指定密钥长度
-t:指定要创建的密钥类型
-C:添加注释
expect是单独的一种脚本语言工具。expect不是/bin/sh,也不是/bin/bash,它是Linux用于模拟人机交互行为的程序。
- Expect中最关键的四个命令:
spawn:启动需要交互的进程,只有spawn 执行的命令结果才会被expect 捕捉到
send:发送字符串给spawn 启动的那个进程,用于模仿“人"向进程发出linux命令用
expect:从进程中捕获关键字
interact:用于将交互双方由expect脚本和机器内核改为——>字符终端和机器内核(即为正常人和机器交 - 其他命令
expect eof: 结束expect匹配互的模式
单线程
#!/bin/bash
username=pchuant
passwd=123456
for ip in `cat hosts`
do
/usr/bin/expect << EOF
spawn ssh-copy-id $username@$ip
expect {
# 如果有yes或no关键字
"(yes/no)?" {
# 则输入yes
send "yes\r"
# 输入完yes后如果输出结果有password关键字,
expect "password:"
# 则输入密码
send "$passwd\r"
}
# 如果上次输出结果有password,则输入密码
"password:" {send "$passwd\r"}
}
expect eof
EOF
done
多线程(不太行)
#!/bin/bash
#Concurrency is 10
user=juzix
passwd=123456
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1 #创建有名管道
exec 3<>/tmp/fd1 #创建文件描述符,以可读可写的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性
rm -rf /tmp/fd1 #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
for((i=1;i<=10;i++))
do
echo >&3 #$3代表引用文件描述符3,这条命令代表往管道里面放入一个“令牌”
done
#for ip in `cat hosts`
for ip in {1..40}
do
read -u3
{
/usr/bin/expect << EOF
spawn ssh-copy-id ${user}@10.1.1.${ip}
expect {
"(yes/no)?" {
send "yes\r"
expect "password:" {send "${passwd}\r"}
}
"password:" {send "${passwd}\r"}
}
expect eof
EOF
echo >&3
}&
done
wait
exec 3<&- #关闭文件描述符的读
exec 3>&- #关闭文件描述符的写