linux expect 安装 Expect是在Tcl基础上建立起来的,它还提供了一些Tcl所没有的命令,它能够用来作一些linux下没法作到交互的一些命令操做,在远程管 理方面发挥很大的做用。 spawn命令激活一个Unix程序来进行交互式的运行。 send命令向进程发送字符串。 expect 命令等待进程的某些字符串。 expect支持正规表达式并能同时等待多个字符串,并对每个字符串执行不一样的操做.linux
A. Tcl 安装 主页: http://www.tcl.tk 下载地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml 1.下载源码包 wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz 2.解压缩源码包 tar xfvz tcl8.4.11-src.tar.gz 3.安装配置 cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install
安装完毕之后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。 暂时不要删除tcl源代码,由于expect的安装过程还须要用。shell
B. expect 安装 (需Tcl的库) 主页: http://expect.nist.gov/ 1.下载源码包 wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download 2.解压缩源码包 tar xzvf expect5.45.tar.gz 3.安装配置 cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
自动切换登录用户的脚本与执行 如何可以将输入密码的工做在shell里面自动完成,研究发现这种交互式的工做,普通的shell实现不了,听说能够借助expect来搞定:bash
例子:函数
实现从普通用户“test”切换到root用户,自动输入root的密码,不用在终端提示符下执行密码输入操做。 步骤: (1)建立并打开脚本文件 vi autosu.sh (2)编辑脚本内容 #! /usr/expect/bin/expect -f //指定expect工具的路径,若是不清楚具体路径,能够用"which expect"命令来查看。 spawn su - // 在expect 中用"spawn"关键字来调用命令“su - ” expect ":" //在执行了su - 命令以后,提示输入密码的提示符。例如你在执行了su - 命令以后,终端里面会出现提示“口令:”,那么你就能够在这里写expect ":",或者expect -exact "口令:" send "rootpasswd/r" //这里expect用send将你的root密码自动输入到上面的提示符以后。 interact //操做完成。 (3)执行脚本文件 ./autosu.sh 注意:执行脚本时要注意的地方,不能按照习惯来用sh **.sh来这个expect的程序,会提示找不到命令,由于expect用的不是bash因此会报错。执行的时候直接./**.sh就能够了。
Linux Expect命令详解:工具
http://www.xuetimes.com/archives/781 http://www.tuicool.com/articles/63iy2mui
Linux/Unix 程序退出状态详解:spa
http://blog.csdn.net/Hadas_Wang/article/details/43601981?locationNum=2.net
附注:unix
对于 *NIX 系统而言,每一条命令,无论是内置的,SHELL 函数仍是外置的,当它退出时,都 会返回一个小整数给引用它的程序,这就是程序退出状态 ( exit status ). 通常来说,退出状态 0 表示正常执行,没有遭遇任何问题。其余非零的状态码均表示失败。 在 shell 中,可使用 $? 来访问最后一个程序的退出状态。 下面是 POSIX 的结束状态: 退出状态码 含义 0 命令成功退出 > 0 在重定向或者单词展开期间(~、变量、命令、算术展开以及单词切割)失败。 1 – 125 命令不成功退出。特定的退出值的含义,有各个命令自行定义。 126 命令找到了,可是文件没法执行。 127 命令没有找到 > 128 命令因收到信号而死亡。 POSIX 没有定义 128 的状态码,仅要求它表示某种错误。由于只有低位的 8 个位会返回给父进程,所以,全部大于 255 的退出状态都会被对 256 取模,而后将其结果做为实际的 exit status code. 在 shell 脚本中,可使用 exit integer_value 这种方式声明退出状态。若是没有显式地声明,则会以最后一个程序的退出状态做为当前脚本的退出状态。也可使用 exit $? 来表示。
Expect 的默认Exit value为0: exit 等价于 exit 0 所以,当expect中执行了子命令时(如shell命令),要想在expect退出时获得子命令的退出状态,就须要再Exepect退出时对exit value从新赋值。code
赋值方法:待续。。