对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:
- #!/bin/bash
- ftp -i -n 192.168.167.187 << EOF
- user hzc 123456
- pwd
- cd test
- pwd
- close
- bye
- EOF
测试可以发现&#xff0c;如上代码使用帐号名hzc&#xff0c;密码123456成功登陆了ftp服务器&#xff0c;并进入目录&#xff0c;打印出了pwd。
五、自动交互方法二
需求2中要求采用非交互的方式改变登录用户密码&#xff0c;尝试用方法1&#xff0c;无法实现。
这时候联想到交互信息的另一个自动输入方法&#xff0c;管道&#xff0c;通过echo &#43; sleep &#43; | 可以实现这个需求。
- #!/bin/bash
- (echo "curpassword"
- sleep 1
- echo "newpassword"
- sleep 1
- echo "newpassword")|passwd
测试通过&#xff0c;运行这个脚本&#xff0c;直接把当前用户的curpassword改成newpassword。
六、自动交互方法三
需求3中要求自动登录root账号&#xff0c;尝试方法1和方法2&#xff0c;都出现错误提示standard in must be a tty。
这时候尝试寻找外部帮助&#xff0c;一个shell工具expect可以实现这个功能&#xff0c;其实expect就是一个专门用来实现自动交互功能的工具&#xff0c;expect的语法可以参考相关资料&#xff0c;代码如下&#xff1a;
- #!/usr/bin/expect
- spawn su root
- expect "password: "
- send "123456/r"
- expect eof
- exit
测试通过&#xff0c;运行这个脚本&#xff0c;直接从当前用户登录到root用户。
七、方法总结
方法一(重定向)简单直观&#xff0c;也经常有实际应用&#xff0c;但是在自动交互领域功能有限。
方法二(管道)也很简单直观&#xff0c;有时甚至不用sleep配合就能展现强大的自动交互实力&#xff0c;但是在某些时候也束手无策。
方法三(expect)在功能上是最为强大的&#xff0c;expect本来就是为实现自动交互功能而生&#xff0c;但是缺点是需要安装expect包&#xff0c;在嵌入式等环境下难以安装。
三个方法各有优劣&#xff0c;应用的好&#xff0c;都可以完成Linux Shell自动交互。
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
#!/usr/bin/expect -f
set password 密码
spawn scp 用户名&#64;目标机器ip:拷贝文件的路径 存放本地文件的路径
set timeout 300
expect "用户名&#64;目标机器ip&#39;s password:" #注意&#xff1a;这里的“用户名&#64;目标机器ip” 跟上面的一致
set timeout 300
send "$password/r"
set timeout 300
send "exit/r"
expect eof
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
linux下安装expect解决方法
需要两个安装程序
tcl8.4.13-src.tar.gz 下载:http://download.chinaunix.net/do ... rceID&#61;22&site&#61;1
expect-5.43.0.tar.gz 下载:http://download.chinaunix.net/do ... eID&#61;2845&site&#61;1
首先安装tcl8.4.13
Tcl 的 configure 脚本有一个语法错误&#xff0c;下面的命令可以纠正它&#xff1a;
sed -i "s/relid&#39;/relid/" configure
编译tcl
cd unix
./configure --prefix&#61;/ixdba.net
make
make install
需要的内容都拷贝到/tools目录,
安装完毕完先不要删除源码&#xff0c;以会安装expect还要用到
将/ixdba.net目录export到环境变量&#xff0c;
接着&#xff0c;就是编译expect了,解压gz包就不说了
./configure --prefix&#61;/tools --with-tcl&#61;/tools/lib --with-x&#61;no
如果报
checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can&#39;t find Tcl private headers
就再添加一个头文件目录参数
--with-tclinclude&#61;../tcl8.4.11/generic
./configure --prefix&#61;/etc/expect --with-tcl&#61;/etc/lib --with-x&#61;no --with-tclinclude&#61;/usr/local/src/tcl8.4.13/generic
generic在tcl源码里
脚本运行正常&#xff0c;进行执行make进行编译
make
编译过程中未出现错误&#xff0c;执行安装&#xff1a;
make install
编译完成后会生在刚才tcl编译时生成的目录/ixdba.net生成expect命令,
此时在命令行执行expect应该可以执行了!
下面就可以做expect的工作了!
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
Expect [is a] software suite for automating interactive tools。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入&#xff0c;而这些命令和程序是期望从终端&#xff08;terminal&#xff09;得到输入&#xff0c;一般来说这些输入都需要手工输入进行的。
检查系统&#xff0c;发现tcl已经安装了。
[root&#64;rhel ~]# rpm -qa|grep tcl
tcl-8.4.13-3.fc6
tclx-8.4.0-5.fc6
后来才发现&#xff0c;因为expect需要重新编译后安装&#xff0c;那么就需要tcl的开发包。
rpm -ivh --force tcl-devel-8.4.13-3.fc6.i386.rpm
然后将expect-5.43包解开&#xff0c;开始读INSTALL文档&#xff0c;系统管理员告诉我&#xff0c;不用读&#xff0c;直接运行 ./configure --help开参数。确实好使&#xff0c;又土了一次 :-( 。
1.首先确定tcl开发包安装的位置
rpm -qpl tcl-devel-8.4.13-3.fc6.i386.rpm|more
2.然后根据参数&#xff0c;运行./configure
./configure --with-tcl&#61;/usr/lib --with-tclinclude&#61;/usr/include/tcl-private/generic
3.执行
make
4.执行
make install
完成第四步后&#xff0c;expect顺利安装成功。
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
linux安装expect终极解决方法
安装总结
需要两个安装程序
tcl8.4.11
expect-5.43
首先安装tcl8.4.11
Tcl 的 configure 脚本有一个语法错误&#xff0c;下面的命令可以纠正它&#xff1a;
sed -i "s/relid&#39;/relid/" configure
编译tcl
cd unix
./configure --prefix&#61;/tools
make
make install
需要的内容都拷贝到/tools目录,
&#xff01;&#xff01;&#xff01;&#xff01;安装完毕完先不要删除源码&#xff0c;以后还要用到
将头文件目录export到环境变量&#xff0c;
cd ..
export TCLPATH&#61;&#39;pwd&#39;
不晓得为什么我在configure时还是报找不到头文件的错误
建一个必须的符号链接
ln -sv tclsh8.4 /tools/bin/tclsh
好了&#xff0c;下面就是编译expect了
我用的是
./configure --prefix&#61;/tools --with-tcl&#61;/tools/lib --with-x&#61;no
如果报
checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can&#39;t find Tcl private headers
再添加一个头文件目录参数
--with-tclinclude&#61;../tcl8.4.11/generic
脚本运行正常&#xff0c;进行执行make进行编译
make
编译过程中未出现错误&#xff0c;执行安装&#xff1a;
make install
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;