1. [#! /usr/sfdfj/expect]
该行表示操作系统脚本中的代码将使用该shell执行。 这里的expect实际上与linux上的bash、windows上的cmd是同一种类的。
注:此行必须位于脚本的第一行。
2. [set timeout 30]
set自定义变量名:设置超时时间。 现在,请记住他的时间单位是“秒”。 timeout -1不会超时
3.[ spawn ssh-l username 192.168.1.1 ]
spawn是进入expect环境后可以执行的expect内部命令,如果没有安装expect,或者直接在默认shell下运行,将找不到spawn命令。 所以请不要用“which spawn”等命令寻找spawn命令。
主要功能是向ssh执行进程添加shell,并传递交互式命令。 开始新的过程可以理解
4. [expect 'password:']
从进程接收字符串。 这里的expect是expect的内部命令。 expect的shell命令与内部命令相同,但不是功能。 此命令确定上次输出是否包含字符串“password:”,如果有,则立即返回;否则,请稍等一会儿,然后返回。 在这里的等待时间是之前设定的30秒。
5. [send 'ispassr']
send接收字符串参数并将其发送到进程。 在此处执行交互式操作,就像手动输入密码一样。 请不要忘记在字符串的末尾加上“r”。 表示“回车键”。
6. [interact]
允许用户操作; 运行完成后保持交互状态,并将控制权交给控制台。 此时可以手动操作。 如果没有这句话,登录完成后退出,而不是保留在远程终端上。
7.$argv参数数组
expect脚本可以接收从bash传递的参数。 可以使用[lindex $argv n]获取。 n从0开始,分别表示第一个、第二个、第三个.参数
7 .以下expect脚本示例
运行此文件./launch.exp 1 2 3
画面上分别印刷着参数
send_user用于向用户发送内容。
参数的运用有很多技巧
例如,$argc中存储了参数,args被结构化为一个列表,存在argv。 $argv0将初始化为脚本名称。
另外,如果你在第一行(#! 该行)-d (调试参数)用于输出在运行时有用的信息
例如,你可以看到
argv [0]=/usr/sfdfj/expect argv [1]=-d argv [2]=./launch.exp argv [3]=1argv [4]=2argv [5]=3
也可以使用它们传递参数
8.
expect的命令行参数参考的是c语言,与bash shell略有不同。 其中$argc是命令行参数的数量,$argv0是脚本名称本身,$argv是命令行参数。 [lrange$argv0]表示第一个参数,[lrange $argv 0 4]是第一个到第五个参数。 与c语言的不同之处在于,$argv不包含脚本名称本身。
9.
exp_continue的用法
#! /usr/sfdfj/expect -f
set ipaddr 'localhost '
设置密码格式'
spawn ssh root@$ipaddr #spawn意味着执行命令,不存在于expect内命令或shell中
expect { (
' yes/no' { send 'yesr '; exp_continue}
' password : ' { send ' $ passwdr ' }
}
expect ']# '
意味着发送send 'touch a.txtr' #命令
send 'exitr '
导出
退出
一些示例:
1、
expect最常见的语法是来自tcl语言的模式-动作。 这个语法非常灵活。 以下,对各自的语法进行说明。
单分支模式语法:
expect 'hi' {send 'You said hi'}
如果匹配hi,将输出“you said hi”
多分支模式语法:
expect 'hi' { send 'You said hin' }
' hello' { send 'Hello yourselfn' }
' bye' { send 'dat was unexpectedn' }
匹配hi、hello、bye中的任意一个字符串时,执行对应的输出。 和以下的写法相同。
expect { (
' hi' { send 'You said hin'}
' hello' { send 'Hello yourselfn'}
' bye ' { send ' thatwasunexpectedn ' }
}
2、
所有demo都与标准输入和输出进行交互,但我们希望他能与某个进程进行交互。 spawm命令用于启动新的进程。 spawn后的send和expect命令与spawn打开的进程进行交互。 将上述send和expect命令组合使用,可以看到更复杂的段。
set timeout -1
spawn ftp ftp.test.com //打开用户连接到远程ftp服务器的新进程
expect 'Name' //进程返回Name时
在send 'userr' //进程中输入anonymousr
expect 'Password:' //进程返回Password:时
在send '123456r' //进程中输入don@libes.comr
expect 'ftp ' //进程返回ftp时
在send 'sfdfjaryr' //进程中输入sfdfjaryr
expect 'ftp ' //进程返回ftp时
在send 'get test.tar.gzr' //进程中输入get test.tar.gzr
此代码的作用是登录到ftp服务器FTP.yldsb.net并以二进制格式下载服务器上的test.tar.gz文件。 程序有详细的注释。
3、
下载ftp文件后,也可以保留ftp命令行并手动执行后续命令。 interact可以实现这些目的。 以下demo在自动登录ftp后允许用户交互。
spawn ftp ftp.test.com
expect 'Name '
发送用户 r '
快速密码: '
send '123456r '
内部
4、
以下脚本实现了从机器a登录到机器b,运行机器b上的pwd命令,停留在机器b上,等待用户操作。
#! /home/tools/sfdfj/64/expect -f
set timeout -1
spawn ssh $BUser@$BHost
expect ' * password : ' { send ' $ passwordr ' }
expect '$*' { send 'pwdr' }
内部