使用场景
比如我们在使用ansible批量部署大量服务器的时候,如果一台一台的服务器去分发密钥会很麻烦 所以用脚本实现批量部署免密登录就很现实了。下面的代码亲测成功
但是有一个缺点,缺点就是服务器的密码都是一致的,如果不是一致的,是不成功的。
这里用到了一个软件expect,expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect 自动交互流程:
spawn启动指定进程–expect获取指定关键字–send指定程序发送指定字符 --执行完退出。
expect常用命令总结:
spawn 交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间
ssh部署免密登录的具体脚本
#!/bin/bash
rpm -q expect
if [ $? -eq 0 ]; then
echo "已安装"
else
yum -y install expect
if [ $? -eq 0 ]; then
echo "安装成功"
else
echo "安装失败"
fi
fi
#本机是否有ssh密钥 没有则生成
if [ ! -f ~/.ssh/id_rsa ]; then
echo "请按3次enter健"
ssh-keygen -t rsa
fi
ssh_expect() {
expect -c "set timeout -1;
spawn ssh-copy-id root@$1
expect {
"yes/no" { send -- yes\r;exp_continue;}
"password:" { send -- $2\r;exp_continue;}
eof
}";
}
[ -f hosts.txt ] && rm -rf hosts.txt
#定义 hosts.txt
cat > hosts.txt << EOF
10.0.0.42
10.0.0.43
EOF
passwd=123456
for ip in `cat hosts.txt|awk '{print $1}'`
do
ssh_expect ${ip} ${passwd}
done