[linux服务器]使用expect自动登录

使用expect自动登录

一,什么是expect?
   在做系统管理时,我们很多时候需要输入密码,例如:连接 ssh,连接ftp,
   那么如何能做到不输入密码吗?
   我们需要有一个工具,能代替我们实现与终端的交互,
   那么,就是它:expect,管理员的最好的朋友之一
   它能够代替我们实现与终端的交互,我们不必再守候在电脑旁边输入密码,
   或是根据系统的输出再运行相应的命令,
   这些都可以由expect代替我们来完成

   说明:expect到底是什么?
   expect是一种脚本语言,使用起来非常简单,我们看后面的例子即可以了解到了

三,安装expect

   备注:因为expect是基于tcl的,所以需要你的系统中安装有tcl
        如何检查?
        [root@dev ~]# whereis tcl
        tcl: /usr/lib/tcl8.4 /usr/share/tcl8.4
        如果看不到结果,请先安装tcl
   安装,
   [root@dev ~]# yum install expect
   也可以从http://rpm.pbone.net下载for相应发行版的rpm包

四,使用expect自动登录的例子
1,程序例子的内容 :
  先做功能 上的说明
  此程序ssh登录到作为参数传递过来的ip地址上
  然后执行: df -h
          free -m
          uptime
  来检查系统的情况


[root@dev ~]# cat monitor_auto
#!/usr/bin/expect -f

#-------------------------------------------------- about us
# product: monitorone
# Author: liuhongdi <[email protected]>
# Last Modified: 2008-05-13
# version: 0.3.2
# user:this script will help you to monitor many linux(unix) machine
# license: this script is based GPL

#-------------------------------------------------- set the variable,you can modify the value

set loginuser "root"                  
set loginpass {passwordonthishost}

set ipaddr [lrange $argv 0 0]   
set timeout 300
set cmd_prompt "]#|~]?"

#-------------------------------------------------- login by ssh
spawn ssh $loginuser@$ipaddr
set timeout 300
 expect {
     -re "Are you sure you want to continue connecting (yes/no)?" {
         send "yes\r"
     } -re "assword:" {
         send "$loginpass\r"
     } -re "Permission denied, please try again." {
        exit
     } -re "Connection refused" {
         exit
     } timeout {
        exit
     } eof {
        exit
     }
}

expect {
  -re "assword:" {
     send "$loginpass\r"
  }
  -re $cmd_prompt {
     send "\r"
  }
}

#---------------------------------------------------- now,we do some commands
exec sleep 1
expect {
  -re $cmd_prompt {
     send "df -h\r"
  }
}

exec sleep 1
expect {
  -re $cmd_prompt {
     send "free -m\r"
  }
}

exec sleep 1
expect {
  -re $cmd_prompt {
     send "uptime\r"
  }
}
exec sleep 1


#--------------------------------------------------
expect {
  -re $cmd_prompt {
     send "exit\r"
  }
}


exit
#interact

2,程序 运行的显示结果

[root@dev ~]# ./monitor_auto 209.209.94.107
spawn ssh [email protected]
[email protected]'s password:
Last login: Sun Feb 15 01:42:39 2009 from 201.103.105.49

[root@ws ~]#
[root@ws ~]# df -h
Filesystem            ÈÝ  ÒÑÓÃ ¿ÉÓÃ ÒÑÓÃ% ¹ÒÔصã
/dev/mapper/VolGroup00-LogVol00
                      133G   72G   55G  57% /
/dev/sda1              99M   13M   82M  14% /boot
none                 1014M     0 1014M   0% /dev/shm
209.209.94.109:/www/pics
                      5.9T  5.6T  138G  98% /bank/bank1
[root@ws ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          2026       1955         71          0         72       1621
-/+ buffers/cache:        261       1764
Swap:         1983         68       1915
[root@ws ~]# uptime
 01:48:00 up 561 days,  8:53,  2 users,  load average: 0.13, 0.09, 0.07
[root@ws ~]# [root@dev ~]#


四,对此程序的详细说明:
   1,set loginuser "root"
     set用来定义变量,定义之后的代码中可以使用所定义的变量
     使用时注意需添加$符号
     使用时的例子:  spawn ssh $loginuser@$ipaddr

猜你喜欢

转载自jxxms.iteye.com/blog/815121