Linux交互命令工具expect与自动切换登陆用户

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

赋值方法:待续。。

相关文章
相关标签/搜索