linux下使用expect示例

2014-11-25

本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。

声明:
本博客欢迎转发,但请保留原作者信息!
新浪微博:@Lingxian_kong;
博客地址:孔令贤的博客;
内容系本人学习、研究和总结,如有雷同,实属荣幸!

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

文章评论

comments powered by Disqus


章节列表