linux下使用expect示例

2014-11-25 Lingxian Kong 更多博文 » 博客 » GitHub »

原文链接 https://lingxiankong.github.io/2014-11-25-linux-expect.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


expect是一种自动交互语言,能实现在shell脚本中为scp和ssh等自动输入密码自动登录,它本身是由 Tcl 语言实现的,所以下面脚本中的语法可以参考 Tcl 语言。一个例子:

#!/usr/bin/expect -f  
set ip [lindex $argv 0 ]     //接收第一个参数,并设置IP  
set password [lindex $argv 1 ]   //接收第二个参数,并设置密码  
set timeout 10                   //设置超时时间  
spawn ssh root@$ip       //发送ssh请滶  
expect {                 //返回信息匹配  
    "*yes/no" { send "yes\r"; exp_continue}  //第一次ssh连接会提示yes/no,继续  
    "*password:" { send "$password\r" }      //出现密码提示,发送密码  
}  
interact          //交互模式,用户会停留在远程服务器上面.  

运行结果:

root@ubuntu:/home/zhangy# ./test.exp 192.168.1.130 admin  
spawn ssh root@192.168.1.130  
Last login: Fri Sep  7 10:47:43 2012 from 192.168.1.142  
[root@linux ~]#  

我工作中用到的一个比较简单的场景,自动登录远程主机并自动输入su -的密码:

#!/usr/bin/expect -f
dict set nodemapping por-bill1 my-por-bill1.os.co.nz
dict set nodemapping por-bill2 my-por-bill2.os.co.nz
dict set nodemapping por-bill3 my-por-bill3.os.co.nz

dict set passmapping por-bill1 pass1
dict set passmapping por-bill2 pass2
dict set passmapping por-bill3 pass3

set nodename [lindex $argv 0 ]
set password [dict get $passmapping $nodename]
set nodefullname [dict get $nodemapping $nodename]

spawn ssh $nodefullname
expect {
    "*yes/no" { send "yes\r"; exp_continue}
    "*password*" { send "$password\r" }
}
interact