Linux Shell自动交互的三种方法

来源:互联网 发布:拉圈圈软件免费 编辑:程序博客网 时间:2024/05/16 01:01

 

四、自动交互方法一

自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7):"command << delimiter  从标准输入中读入,直至遇到delimiter分界符。"

重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。

对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:

  1. #!/bin/bash  
  2. ftp -i -n 192.168.167.187 << EOF 
  3. user hzc 123456  
  4. pwd  
  5. cd test  
  6. pwd  
  7. close  
  8. bye  
  9. EOF 

测试可以发现,如上代码使用帐号名hzc,密码123456成功登陆了ftp服务器,并进入目录,打印出了pwd。

五、自动交互方法二

需求2中要求采用非交互的方式改变登录用户密码,尝试用方法1,无法实现。

这时候联想到交互信息的另一个自动输入方法,管道,通过echo + sleep + | 可以实现这个需求。

  1. #!/bin/bash  
  2. (echo "curpassword"  
  3. sleep 1  
  4. echo "newpassword"   
  5. sleep 1  
  6. echo "newpassword")|passwd 

测试通过,运行这个脚本,直接把当前用户的curpassword改成newpassword。

六、自动交互方法三

需求3中要求自动登录root账号,尝试方法1和方法2,都出现错误提示standard in must be a tty。

这时候尝试寻找外部帮助,一个shell工具expect可以实现这个功能,其实expect就是一个专门用来实现自动交互功能的工具,expect的语法可以参考相关资料,代码如下:

  1. #!/usr/bin/expect  
  2. spawn su root  
  3. expect "password: "  
  4. send "123456/r"  
  5. expect eof  
  6. exit 

测试通过,运行这个脚本,直接从当前用户登录到root用户。

七、方法总结

方法一(重定向)简单直观,也经常有实际应用,但是在自动交互领域功能有限。

方法二(管道)也很简单直观,有时甚至不用sleep配合就能展现强大的自动交互实力,但是在某些时候也束手无策。

方法三(expect)在功能上是最为强大的,expect本来就是为实现自动交互功能而生,但是缺点是需要安装expect包,在嵌入式等环境下难以安装。

三个方法各有优劣,应用的好,都可以完成Linux Shell自动交互。

 

 

========================================================

 

 

#!/usr/bin/expect -f

set password 密码

spawn scp 用户名@目标机器ip:拷贝文件的路径 存放本地文件的路径
set timeout 300
expect "用户名@目标机器ip's password:" #注意:这里的“用户名@目标机器ip” 跟上面的一致
set timeout 300
send "$password/r"
set timeout 300
send "exit/r"

expect eof

 

 

========================

linux下安装expect解决方法

 

需要两个安装程序
tcl8.4.13-src.tar.gz  下载:http://download.chinaunix.net/do ... rceID=22&site=1
expect-5.43.0.tar.gz    下载:http://download.chinaunix.net/do ... eID=2845&site=1

首先安装tcl8.4.13
Tcl 的 configure 脚本有一个语法错误,下面的命令可以纠正它:
sed -i "s/relid'/relid/" configure
编译tcl
cd unix
./configure --prefix=/ixdba.net
make
make install
需要的内容都拷贝到/tools目录,

安装完毕完先不要删除源码,以会安装expect还要用到

将/ixdba.net目录export到环境变量,

接着,就是编译expect了,解压gz包就不说了

./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no

如果报
checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can't find Tcl private headers

就再添加一个头文件目录参数
--with-tclinclude=../tcl8.4.11/generic
./configure --prefix=/etc/expect --with-tcl=/etc/lib --with-x=no --with-tclinclude=/usr/local/src/tcl8.4.13/generic
generic在tcl源码里

脚本运行正常,进行执行make进行编译
make
编译过程中未出现错误,执行安装:
make install

编译完成后会生在刚才tcl编译时生成的目录/ixdba.net生成expect命令,
此时在命令行执行expect应该可以执行了!

下面就可以做expect的工作了!

==========================================

Expect [is a] software suite for automating interactive tools。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。

检查系统,发现tcl已经安装了。

[root@rhel ~]# rpm -qa|grep tcl
tcl-8.4.13-3.fc6
tclx-8.4.0-5.fc6

后来才发现,因为expect需要重新编译后安装,那么就需要tcl的开发包。

rpm -ivh --force tcl-devel-8.4.13-3.fc6.i386.rpm

然后将expect-5.43包解开,开始读INSTALL文档,系统管理员告诉我,不用读,直接运行 ./configure --help开参数。确实好使,又土了一次 :-( 。

1.首先确定tcl开发包安装的位置
rpm -qpl tcl-devel-8.4.13-3.fc6.i386.rpm|more

2.然后根据参数,运行./configure
./configure --with-tcl=/usr/lib --with-tclinclude=/usr/include/tcl-private/generic

3.执行
make

4.执行
make install

完成第四步后,expect顺利安装成功。

 

================================

linux安装expect终极解决方法

 

安装总结
需要两个安装程序
tcl8.4.11
expect-5.43
首先安装tcl8.4.11
Tcl 的 configure 脚本有一个语法错误,下面的命令可以纠正它:
sed -i "s/relid'/relid/" configure
编译tcl
cd unix
./configure --prefix=/tools
make
make install
需要的内容都拷贝到/tools目录,
!!!!安装完毕完先不要删除源码,以后还要用到
将头文件目录export到环境变量,
cd ..
export TCLPATH='pwd'
不晓得为什么我在configure时还是报找不到头文件的错误
建一个必须的符号链接
ln -sv tclsh8.4 /tools/bin/tclsh

好了,下面就是编译expect了
我用的是
./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no
如果报
checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can't find Tcl private headers
再添加一个头文件目录参数
 --with-tclinclude=../tcl8.4.11/generic
脚本运行正常,进行执行make进行编译
make
编译过程中未出现错误,执行安装:
make install

 

 

 

 

 

 

========================================================

原创粉丝点击