四、自动交互方法一
自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7):"command << delimiter 从标准输入中读入,直至遇到delimiter分界符。"
重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。
对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:
- #!/bin/bash
- ftp -i -n 192.168.167.187 << EOF
- user hzc 123456
- pwd
- cd test
- pwd
- close
- bye
- EOF
测试可以发现,如上代码使用帐号名hzc,密码123456成功登陆了ftp服务器,并进入目录,打印出了pwd。
五、自动交互方法二
需求2中要求采用非交互的方式改变登录用户密码,尝试用方法1,无法实现。
这时候联想到交互信息的另一个自动输入方法,管道,通过echo + sleep + | 可以实现这个需求。
- #!/bin/bash
- (echo "curpassword"
- sleep 1
- echo "newpassword"
- sleep 1
- echo "newpassword")|passwd
测试通过,运行这个脚本,直接把当前用户的curpassword改成newpassword。
六、自动交互方法三
需求3中要求自动登录root账号,尝试方法1和方法2,都出现错误提示standard in must be a tty。
这时候尝试寻找外部帮助,一个shell工具expect可以实现这个功能,其实expect就是一个专门用来实现自动交互功能的工具,expect的语法可以参考相关资料,代码如下:
- #!/usr/bin/expect
- spawn su root
- expect "password: "
- send "123456/r"
- expect eof
- 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的工作了!
==========================================
检查系统,发现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
========================================================