利用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 -p 2021(#my ssh port)
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
expect "]*"
send "curl -I http://www.mydomain.com:8088 \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 /home/test/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运行进程加个壳,用来传递交互指令。
expect “password:”
这 里的expect也是expect的一个内部命令,expect的shell命令和内部命令是一样的,www.linuxidc.com但不是一个功能。 这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的 30秒
send “nopasswd\r”
这里就是执行交互动作,与手工输入密码的动作等效。
温馨提示: 命令字符串结尾别忘记加上 “\r”,如果出现异常等待的状态可以核查一下。
interact
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可改为〔expect eof〕
Expect循环登录多台服务器执行命令的脚本
Expect循环登录多台服务器执行命令的脚本
#!/usr/bin/expect
foreach IP {
61.152.114.188
61.152.114.185
.............
} {
#循环,可以多台相同密码的服务器同时处理,不同密码的需要改动一下,在下面再加一个密码的循环,
spawn ssh
username@$IP
expect {
"*(yes/no)*" { send "yes\r"}
"password:" { send "123456\r" }
}            #SSH第一次远程登录服务器
expect "username"
send "su -\r"        #SSH普通用户名密码登录
expect "Password:"
send "123456\r"        #SSH的root用户名密码登录
expect -timeout 1
expect "root"
send "route add -net 10.1.1.0 netmask 255.255.255.0 gw 10.1.1.1\r"
}
#输入要执行的命令,这儿是加条路由。

#!/usr/bin/expect -f
for ((i=1;i*"
send "exec su -\r"
expect "Password:"
send "123456\r"
expect "*root]#"
send "exit\n"
done
Expect的安装及使用
expect在一些脚本中自动完成用户名或者密码的输入非常方便
相关文件下载在
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /pub/2011/07/25/Expect/
安装expect
1.下载tcl
这里的版本为tcl8.5.10-src.tar.gz
2.安装
cd unix
./configure --prefix=/usr/tcl
make
make install
3.安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。暂时不要删除tcl源代码,因为expect的安装过程还需要用。
最好是将所有的.h文件移到generic中
4.安装expect

我使用的版本是expect-5.39.0.tar.gz。
另外还需要下载补丁expect-5.39.0-spawn.patch
首先打补丁:
patch -Np1 -i ../expect-5.39.0-spawn.patch
5.
./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-x=no --with-tclinclude=/tcl源代码路径/generic
6.修改文件exp_inter.c 添加 #include "tclInt.h"
7.make
8.make install

你可能感兴趣的:(linux,职场,expect,批量部署,休闲)