文档章节

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

YuanyuanL
 YuanyuanL
发布于 2016/12/07 10:25
字数 1143
阅读 200
收藏 0

linux expect 安装 Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作,在远程管 理方面发挥很大的作用。 spawn命令激活一个Unix程序来进行交互式的运行。  send命令向进程发送字符串。 expect 命令等待进程的某些字符串。  expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作.

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的安装过程还需要用。

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来搞定:

例子:

实现从普通用户“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/63iy2m

Linux/Unix 程序退出状态详解:

http://blog.csdn.net/Hadas_Wang/article/details/43601981?locationNum=2

附注:

对于 *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重新赋值。

赋值方法:待续。。

© 著作权归作者所有

共有 人打赏支持
YuanyuanL

YuanyuanL

粉丝 152
博文 320
码字总数 187682
作品 0
济南
部门经理
教会你Linux Shell自动交互的三种方法

你了解Linux系统么?你是Linux系统的应用者么?如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享一下。 一、背景...

魏邪乎
2014/02/13
0
0
[linux comm]expect

Expect是一个用来处理交互的命令。借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成。形象的说,ssh登录,ftp登录等都符合交互的定义。下文我们首先提出一个问题,然后介绍基础...

SibylY
2015/03/04
0
0
expect实现自动交互由浅入深

expect实现自动交互由浅入深 作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如t...

JAYZ_HAO
2017/10/14
0
0
shell expect的简单用法

为什么需要expect? 我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如 telnet服务器等进行交互...

PlayWithYou
2017/10/01
0
0
linux expect详解(ssh自动登录)

shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expectspawn ssh root@192.168.22.194expect "password:"send "123r"expect "#"interact Expect是一个用来处理交互的命令。借助Expect,...

独钓渔
2016/03/31
26
0

没有更多内容

加载失败,请刷新页面

加载更多

PowerDesigner导出所有表到Excel

'******************************************************************************'* File: pdm2excel.vbs'* Purpose: 分目录递归,查找当前PDM下所有表,并导出Excel'* Title: ......

了凡川
20分钟前
2
0
Maven 项目中依赖的搜索顺序

ettings_mirror 的优先级高于 central settings_profile_repo 优先级高于 settings_mirror settings_profile_repo 优先级高于 pom_repositories settings_profile_repo 优先级高于 pom_prof......

xingyu4j
43分钟前
2
0
改变maven项目的名称

pom.xml <groupId>com.soft.xxx</groupId><artifactId>xxx</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>xxx Maven Webapp</name><build>......

1713716445
44分钟前
2
0
windows下按照RabbitMQ

rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平...

zhaochaochao
44分钟前
2
0
10个PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的10个开源的Php比特币项目,将有助于你了解在自己的应用中如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方法...

笔阁
52分钟前
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部