利用Expect批量部署Linux服务器
Expect是Unix系统中用来进行自动化控制和测试的软件工具,由Don Libes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。
涉及文件:
1:login.exp
2:passwd.txt
3:expect.sh
目的批量执行test.sh文件
1:login.exp
#!/usr/bin/expect -f set ipaddress [lindex $argv 0] set passwd [lindex $argv 1] set timeout 30 spawn ssh root@$ipaddress expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$passwd\r" } } expect "]*" send "wget http://lazyom.com/test.sh \r" send "sh test.sh\r" send "exit\r" expect eof
2:passwd.txt
IP PASSWD
3:expect.sh
#!/bin/bash for i in `awk '{print $1}' passwd.txt` do j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt` expect /root/bin/expect/login.exp $i $j done
set timeout 30
设置超时时间的,计时单位:秒
spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
send “nopasswd\r”
这里就是执行交互动作,与手工输入密码的动作等效。
温馨提示: 命令字符串结尾别忘记加上 “\r”,如果出现异常等待的状态可以核查一下。
interact
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可改为〔expect eof〕