潮州外贸网站建设,小熊代刷推广网站,绵阳建设招投标在哪个网站,wordpress登录地址怎么修改linux shell脚本批量创建公钥
为实现对多台服务器部署服务#xff0c;如果只用交互方式输入密码#xff0c;耗时耗力#xff0c;因此必须考虑自动化部署#xff0c;查询资料发现expect方式可以实现。
一、介绍
expect脚本是Tcl脚本语言的拓展。用来实现自动的交互式任务…linux shell脚本批量创建公钥
为实现对多台服务器部署服务如果只用交互方式输入密码耗时耗力因此必须考虑自动化部署查询资料发现expect方式可以实现。
一、介绍
expect脚本是Tcl脚本语言的拓展。用来实现自动的交互式任务无需人为干预。在实际开发中运行shell脚本有时候会输入linux密码或者是mysql密码等而expect可以帮我们输入。
二、安装
expect在linux系统中没有自带需要我们自行安装在centos系统下安装命令如下
yum install expect -y三、常用命令说明
命令说明set timeout n设置expect语句超时时间为n秒。-1为永不超时set name value设置变量名为name其值为valueset name [lindex $argv 0]设置变量名为name其值为 传入 expect脚本的第一个 参数 。第一个参数的索引值为0第二个为1依次类推spawn启动新的进程执行命令或者指定程序expect接收进程中返回的信息, 如果匹配成功有大小写区分, 就执行expect后的动作send向进程发送字符串send_user用来打印信息相当于shell中的echoexp_continue执行完expect后的动作后使expect不退出继续往下匹配expect eof不允许用户交互直接退出这个用的会比interact多interact允许用户交互
四、案例
#!/usr/bin/bash
# 利用expect实现批量公钥的传送方便后续批量部署
ip.txt
password1111
# userljw
#判断公钥是否存在,不存在创建
if [ ! -f ~/.ssh/id_rsa ];thenssh-keygen -P -f ~/.ssh/id_rsa
fifor i in {12..16}
do{ip192.168.10.$iping -c1 -W1 $ip /dev/nullif [ $? -eq 0 ];thenecho $ip ip.txt/usr/bin/expect -EOFset timeout 10 spawn ssh-copy-id $ipexpect {yes/no { send yes\r; exp_continue }password: {send $password\r}}expect eofEOFfi} #后台执行
done
wait解释 #!/bin/bash shell脚本执行,如果不需要shell而是全部expect则可以#!/usr/bin/expect
/usr/bin/expect -EOF 此处开始执行expect脚本记住EOF前面的“-”
expect中最关键的四个命令是send,expect,spawn,interact。
send用于向进程发送字符串 expect从进程接收字符串 spawn启动新的进程 interact执行完成后保持交互状态把控制权交给控制台这个时候便可以手工操作。如果没有该命令命令完成后即退出
1、spawn命令是Expect的初始命令它用于启动一个进程之后所有expect操作都在这个进程中进行如果没有spawn语句整个expect就无法再进行下去了
spawn ssh-copy-id $ip; 启动expect操作进程
2、expect 是针对需要交互的地方进行自动发送消息{ 大扣号前面必须要有空格前面引号内的内容是交互界面等待输入的匹配字串{} 内的是交互输入的内容:
a、send 发送数据最后的\r必需说明输入密码并回车了
b、exp_continue 继续处理下一步命令
expect eof 此命令和spawn 是匹配的spawn进程结束后会向expect发送eof表示退出spwan
EOF 解除expect脚本执行跳出到shell执行环境
五、 EOF和-EOF的区别
在我们使用cat EOF时我们输入完成后需要在一个新的一行输入EOF结束stdin的输入。EOF必须顶行写,前面不能用制表符或者空格。
比如,下面的语句就不会出错
cat EOF
Hello,world!
EOF如果结束分解符EOF前有制表符或者空格则EOF不会被当做结束分界符只会继续被当做stdin来输入。 而-就是为了解决这一问题
cat -EOF
Hello,world! EOF上面的写法虽然最后的EOF前面有多个制表符和空格但仍然会被当做结束分界符表示stdin的结束。