Daily Archives: 一月 11th, 2008

关于如何向expect脚本里面传递参数

比如下面的脚本,通过脚本运行的命令行获取pscd这个参数,然后利用这个作为密码的一部分,通过两次ssh连接登录到一台主机。
1 #!/usr/bin/expect -f
2 set pscd [lrange $argv 0 0]
3 set timeout 120
4 spawn /home/nicholas/bin/jxrelay
5 expect “PASSCODE: ”
6 send “PASS1$pscd\r”
7 send “export TERM=linux\r”
8 expect “$ ”
9 send “ssh archley@MACHINE_A\n”
10 expect “d: ”
11 send “PASSWD\r”
12 expect “$ ”
13 send “export LANG=zh_CN.GBK\r”
14 send “export LC_ALL=zh_CN.GBK\r”
15 send “clear\r”
16 send “screen -DR\r”
17 interact
以下是自己写的
#!/usr/bin/expect
set host [lindex $argv 0]
spawn rsh $host
expect ”Password:”
send ”yyyyyyy\r”
expect ”>”
send ”su -\r”
expect ”Password:”
send ”xxxxxx\r”
expect ”#”
send ”ls\r”
interact

揭开Expect的神秘面纱

http://www.chinahack.org/classical/HTML/29125.html
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。
Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。 :)
Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。
Expect工作原理
从最简单的层次来说,Expect的工作方式象一个通用化的Chat脚本工具。Chat脚本最早用于UUCP网络内,以用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。
Chat脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。例如下面的Chat 脚本实现等待标准输出出现Login:字符串,然后发送somebody作为用户名;然后等待Password:提示符,并发出响应sillyme。
Login: somebody Password: sillyme
这个脚本用来实现一个登录过程,并用特定的用户名和密码实现登录。
Expect最简单的脚本操作模式本质上和Chat脚本工作模式是一样的。下面我们分析一个响应chsh命令的脚本。我们首先回顾一下这个交互命令的格式。假设我们为用户chavez改变登录脚本,命令交互过程如下:
# chsh chavez
Changing the login shell for chavez
Enter the new value, or press return for the default
Login Shell [/bin/bash]: /bin/tcsh
#
可以看到该命令首先输出若干行提示信息并且提示输入用户新的登录shell。我们必须在提示信息后面输入用户的登录shell或者直接回车不修改登录shell。
下面是一个能用来实现自动执行该命令的Expect脚本:
#!/usr/bin/expect
# Change a login shell to tcsh
set user [lindex $argv 0]
spawn chsh $user
expect “]:”
send “/bin/tcsh ”
expect eof
exit
这个简单的脚本可以解释很多Expect程序的特性。和其他脚本一样首行指定用来执行该脚本的命令程序,这里是/usr/bin/expect。程序第一行用来获得脚本的执行参数(其保存在数组$argv中,从0号开始是参数),并将其保存到变量user中。
第二个参数使用Expect的spawn命令来启动脚本和命令的会话,这里启动的是chsh命令,实际上命令是以衍生子进程的方式来运行的。
随后的expect和send命令用来实现交互过程。脚本首先等待输出中出现]:字符串,一旦在输出中出现chsh输出到的特征字符串(一般特征字符串往往是等待输入的最后的提示符的特征信息)。对于其他不匹配的信息则会完全忽略。当脚本得到特征字符串时,expect将发送/bin/tcsh和一个回车符给chsh命令。最后脚本等待命令退出(chsh结束),一旦接收到标识子进程已经结束的eof字符,expect脚本也就退出结束。
决定如何响应
管理员往往有这样的需求,希望根据当前的具体情况来以不同的方式对一个命令进行响应。我们可以通过后面的例子看到expect可以实现非常复杂的条件响应,而仅仅通过简单的修改预处理脚本就可以实现。下面的例子是一个更复杂的expect-send例子:
expect -re “\[(.*)]:”
if {$expect_out(1,string)!=”/bin/tcsh”} {
send “/bin/tcsh” [...]

rsh命令

http://www.ifpubs.com/books/aix52/rsh.htm
rsh 或 remsh 命令

用途

在远程主机上或登录到远程主机执行指定的命令。

语法
{ rsh | remsh } RemoteHost [ -a ] [ -n ] [ -l User ] [ -f | -F ] [ -k realm ] [ Command ]

描述

/usr/bin/rsh 命令在由 RemoteHost 参数指定的远程主机上执行由 Command 参数指定的命令;如果不指定 Command 参数,rsh 命令登录到由 RemoteHost 参数指定的远程主机。rsh 命令发送从本地命令行的标准输入到远程命令和接收远程命令的标准输出和标准错误。

注:
由于任何到远程命令的输入必须在本地命令行上指定,不能使用 rsh 命令来执行在远程主机上的交互式的命令。如果需要在远程主机上执行交互式命令,请使用不指定 [...]