#! /usr/bin/expect -f
set timeout 3
spawn sudo apt-get install rake
expect "*sudo] password*"
send "123456\r"
expect "*@ubuntu-Box:~$*"
spawn sudo apt-get install htop
expect "*sudo] password*"
send "123456\r"
interact
文件名:ev.expect 终端下执行:./ev.expect
================================================
1。首先确认expect的包要安置。
[[zhuying@SOR_SYS opt]$ rpm -qa | grep expect
如果没有则需要下载安装,我安装的是expect-5.42.1-1.x86_64.rpm和expect-devel-5.42.1-1.x86_64.rpm
安装过后会显示:
[[zhuying@SOR_SYS opt]$ rpm -qa | grep expect
expect-5.43.0-5.1
expect-devel-5.42.1-1
2.查看expect的路径,可以用
[zhuying@SOR_SYS opt]$ which expect
/usr/bin/expect
[zhuying@SOR_SYS opt]$ view autosu.sh
3。确定脚本有可执行权限
chmod +x autosu.sh
#!/usr/bin/expect -f//这个expect的路径就是用which expect 查看的结果
spawn su - oracle //切换用户
expect "password:" //提示让输入密码
send "99billzy \r"//输入oracle的密码
interact //操作完成
这在root用户切换到oracle用户的时候特别的快,但是在其他用户切换到oracle的时候则需要等待一段时间!
另外需要注意的是:
不能按照习惯来用sh autosu.sh 来这行expect的程序,会提示找不到命令,如下:
autosu.sh: line 3: spawn: command not found
couldn't read file "password:": no such file or directory
autosu.sh: line 5: send: command not found
autosu.sh: line 6: interact: command not found
因为expect用的不是bash所以会报错。执行的时候直接./autosu.sh 就可以了。~切记!
来自:http://tomhibolu.iteye.com/blog/1214769
用的Ubuntu,本身没带expect,安装。
sudo apt-get install expect
2 写脚本 sample.script
下面是简单的一个例子,把登录名和密码都显式地写在脚本里。
#!/usr/bin/expect -f
#auto ssh login
set timeout 20
spawn ssh login_name@host_name
expect “*password:”
send “123456/r”
interact
上面的脚本中,spawn命令激活一个Unix程序来进行交互式的运行。send命令向进程发送字符串。expect命令等待进程的某些字符串。 expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect还能理解一些特殊情况,如超时和遇到文件尾。
如果希望脚本有一定的通用性,比如通过参数方式来输入用户名和主机地址。那么脚本可以象这样:
#!/usr/bin/expect -f
#auto ssh login
set timeout 20
set login_name [lindex $argv 0]
set host_name [lindex $argv 1]
spawn ssh $login_name@$host_name
expect “*password:”
send “123456/r”
interact
这样执行的时候$argv 0 就是输入的第一个参数, $argv 1 就是输入的第二个参数
3 给脚本加上可执行权限
chmod +x sample.script
如果文件默认有其它权限,建议最好设置为只能自己读取,修改和执行
chmod 700 sample.script
接着就可以通过执行脚本进行远程登录了 ./sample.script
=====================================================
管理员往往有这样的需求,希望根据当前的具体情况来以不同的方式对一个命令进行响应。我们可以通过后面的例子看到expect可以实现非常复杂的条件响应,而仅仅通过简单的修改预处理脚本就可以实现。下面的例子是一个更复杂的expect-send例子:
expect -re "\[(.*)]:"
if {$expect_out(1,string)!="/bin/tcsh"} {
send "/bin/tcsh" }
send " "
expect eof
在这个例子中,第一个expect命令现在使用了-re参数,这个参数表示指定的的字符串是一个正则表达式,而不是一个普通的字符串。对于上面 这 个例子里是查找一个左方括号字符(其必须进行三次逃逸(escape),因此有三个符号,因为它对于expect和正则表达时来说都是特殊字符)后面跟有 零个或多个字符,最后是一个右方括号字符。这里.*表示表示一个或多个任意字符,将其存放在()中是因为将匹配结果存放在一个变量中以实现随后的对匹配结 果的访问。
当发现一个匹配则检查包含在[]中的字符串,查看是否为/bin/tcsh。如果不是则发送/bin/tcsh给chsh命令作为输入,如果是则仅仅发送一个回车符。这个简单的针对具体情况发出不同相响应的小例子说明了expect的强大功能。
在一个正则表达时中,可以在()中包含若干个部分并通过expect_out数组访问它们。各个部分在表达式中从左到右进行编码,从1开始(0包含有整个匹配输出)。()可能会出现嵌套情况,这这种情况下编码从最内层到最外层来进行的。