使用expect实现自动登陆的脚本,网上有不少,但是都没有一个明白的说明,初学者通常都是照抄、收藏。但是为何要这么写殊不知其然。本文用一个最短的例子说明脚本的原理。
脚本代码以下:
##############################################
#!/usr/bin/expect
set timeout 30
spawn ssh -l username 192.168.1.1
expect "password:"
send "ispass\r"
interact
##############################################
1. [#!/usr/bin/expect]
这一行告诉操做系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
注意:这一行须要在脚本的第一行。
2. [set timeout 30]
基本上认识英文的都知道这是设置超时时间的,如今你只要记住他的计时单位是:秒
3. [spawn ssh -l username 192.168.1.1]
spawn是进入expect环境后才能够执行的expect内部命令,若是没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。因此不要用 “which spawn“之类的命令去找spawn命令。比如windows里的dir就是一个内部命令,这个命令由shell自带,你没法找到一个dir.com 或 dir.exe 的可执行文件。
它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
4. [expect "password:"]
这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是同样的,但不是一个功能,习惯就行了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,若是有则当即返回,不然就等待一段时间后返回,这里等待时长就是前面设置的30秒
5. [send "ispass\r"]
这里就是执行交互动做,与手工输入密码的动做等效。
舒适提示: 命令字符串结尾别忘记加上“\r”,若是出现异常等待的状态能够核查一下。
6. [interact]
执行完成后保持交互状态,把控制权交给控制台,这个时候就能够手工操做了。若是没有这一句登陆完成后会退出,而不是留在远程终端上。若是你只是登陆过去执行
#!/usr/bin/expect #注意安装的路径,不肯定 whereis expect 一下
# Change a login shell to bash
set user [lindex $argv 0]
spawn bash $user
expect "]:"
send "/bin/bash "
expect eof
exitlinux
使用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 <hongdi.liu@chinafotopress.com>
# 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 root@209.209.94.107
root@209.209.94.107'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@$ipadshell