目录
1.expect命令:可以在外输入,某些命令执行后弹出的输入提示
1.expect命令:可以在外输入,某些命令执行后弹出的输入提示
spawn shell 命令程序
expect "捕获到shell 命令程序执行之后输出的字符串"
send "发送给 shell 命令程序的字符串"
[root@localhost .ssh]# ssh-keygen -t rsa -b 1024
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)?
/usr/bin/expect << eof
spawn ssh-keygen -t rsa -b 1024
# 开始进连续捕获
# 获取“Overwrite (y/n)?”的提示行,输入“y”表示同意(其中\n是换行符)
expect {
".ssh/id_rsa)" { send "\n"; }
"Overwrite (y/n)?" { send "y\n"; }
}
# 结束捕获
eof
2.完整脚本
#! /bin/bash
host_address=(192.168.174.151 192.168.174.152) # 客户端们的IP地址
host_hostname=(client1 client2) # 客户端们的域名
host_username=root # ssh连接的用户,控制端的用户为root
host_passwd=110119 # ssh连接的用户密码
# 安装expect命令
expect -v &> /dev/null
if [ `echo $?` -ne 0 ];then
echo "没有expect,安装expect命令"
yum install -y expect
fi
# 配置免密登录
echo "";echo ""
echo "########################## 本地开始配置ssh ##########################"
if [ `test -a ~/.ssh/id_rsa.pub;echo $?` == 0 ];then
echo "ssh公钥已创建"
else
echo "ssh公钥未创建,开始创建"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 10
spawn ssh-keygen -t rsa -b 1024
## 开始进连续捕获
expect {
"connecting (yes/no)?" { send "yes\n"; exp_continue }
"s password:" { send "${host_passwd}\n"; exp_continue }
".ssh/id_rsa)" { send "\n"; exp_continue }
"Overwrite (y/n)?" { send "y\n"; exp_continue }
"no passphrase):" { send "\n"; exp_continue }
"passphrase again:" { send "\n"; exp_continue }
}
eof
fi
# 本地的密钥开始加入被控制主机
for ((j=0;j<2;j++));do
echo "########################## ${host_address[j]}正在被添加公钥 ##########################"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 10
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub ${host_username}@${host_address[j]}
## 开始进连续捕获
expect {
"connecting (yes/no)?" { send "yes\n"; exp_continue }
"s password:" { send "${host_passwd}\n"; exp_continue }
}
eof
echo "############# ${host_address[j]}配置完毕 #############"
echo "";echo "";echo ""
done
flag_ssh=0
# 测试ssh配置是否成功
for ((j=0;j<2;j++));do
if [ `ssh ${host_username}@${host_address[j]} -o ConnectTimeout=5 "exit";echo $?` == 0 ];then
echo "Success: ${host_address[j]}连接成功"
else
echo "Failed: ${host_address[j]}的ssh连接失败,请检查!"
flag_ssh=1
fi
done
echo "";echo "";echo ""
if [ ${flag_ssh} == 1 ];then
echo "############# 已退出 #############"
exit
fi