expect基本用法

1.[#!/bin/bash/expect]
这一行告诉操作系统脚本里面的代码用哪一个shell执行,这里的expect其实和linux的bash一样。
2.[set timeout 30]
设置超时时间,timeout -1 永不超时
3[spawn ssh -l username 172.16.1.1]
spawn 是进入expect环境后才可以执行的expect内部命令,如果没有装expect执行spawn是找不到的,它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
4[expect "password:"]
这里的expect也是expect的一个内部命令,这个命令的意思是判断上次输出的结果里面是否包含"password:"的字符串,如果有立即返回,否则就等待一段时间后返回,这里等待的时间就是前面设置的30s
5[send "ipspass\r"]
这里就是执行交互动作,与手工输入密码的动作等效。
温馨提示:命令字符串结尾别忘记加上"\r",如果出现异常等待的状态可以检查一下。
6[interact]
执行完成后保持交互状态,把控制权交给控制台,这个时候可以手工操作了,如果没有这一句登录完成后就会退出,而不是永远留在远程终端上
7$argv参数数组
expect脚本可以接受从bash传递过来的参数,可以使用[lindex $argv n]获得,n从0开始,分别代表第一个,第二个,第三个,参数
$argc存储了参数的个数,args被结构化成一个列表在argv,$argv0被初始化为脚本名字。
接下来我们举一个简单的列子,批量修改服务器密码
vim a.sh
#!/usr/bin/expect
set ipaddress [lindex $argv 0 ]   接受第一个参数,并设置ip
set passwd [lindex $argv 1 ]     接受第二个参数,并设置密码
spawn ssh root@$ipaddress     发送ssh请求
expect {    返回信息的匹配
"yes/no" {send "yes\r";exp_continue}   第一次ssh连接会提示yes/no,继续
"password" {send "$passwd\r"} 出现密码提示,发送密码
}
expect "#"   登录成功后捕捉shell终端提示符
send "mkdir -p /tmp/test\r"
send "echo 123 | passwd  --stdin root\r"
expect "successfully"
send "exit\r"
expect eof
exit
vim login.exp
#!/bin/bash
for i in `awk '{print $1}' passwd.txt`
do
j=`awk -v I="$i" '{if(I==$1)print $2}'  passwd.txt`
awk -v 后面紧跟着变量名字和对变量的赋值,获取对应ip地址的密码。
expect /root/shell/a.sh $i $j  这里的$i $j 的值其实赋给了 [lindex $argv 0 ]   [lindex $argv 1 ]
done
我们查看passwd.txt内容
cat /etc/passwd.txt
172.16.1.88 zhangfang
172.16.1.89 zhangfang
执行./loginx.ext


你可能感兴趣的:(expect,控制台,手工)