如果你要学习linux,你可能会遇到Linux Shell主动交互问题,这里将介绍Linux Shell主动交互的解决办法,在这里拿进去和大家分享一下。
一、背景
shell脚本在解决主动循环或大的工作方面可节俭大量的工夫,通过创立一个解决工作的命令清单,应用变量、条件、算术和循环等办法疾速创立脚本以实现相应工作,这比在命令行下一个个敲入命令要省时省力得多。
然而有时候咱们可能会须要实现和交互程序如ftp,telnet服务器等进行交互的性能,这时候咱们须要用到shell的主动交互性能,本文收集了较罕用的三种主动交互办法,并进行了比拟和总结。
二、需要
需要1:
从一台Linux机器ftp登陆到另一台Linux机器,进行系列操作后敞开,懒得每次都手动输出明码。
需要2:
扭转登录用户明码,懒得每次都输出新旧明码。
需要3:
心愿su主动登录到root账户,懒得每次都输出root明码。
三、调试环境
终端:SecureCRT
零碎:WinXP, CentOS 4.4(VmWare)
Shell: bash
注:shell有很多种,B类SHELL(sh, bash, ksh)之间行为相近;C类SHELL(csh, tcsh)之间行为相近,还有zsh和rc等shell,本文的调试环境是bash。
四、主动交互办法一
主动交互最要害的就是交互信息的主动输出,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7):"command << delimiter 从规范输出中读入,直至遇到delimiter分界符。"
重定向操作符command << delimiter是一种十分有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输出,遇到下一个分界符, shell就晓得输出完结了。最常见的delimiter分界符是EOF,当然齐全能够自定为其余字符。
对于需要1 要求的主动登陆ftp,并作系列操作,则能够用这种办法进行主动交互。代码如下:
#!/bin/bashftp -i -n 192.168.167.187 << EOFuser hzc 123456Pwdcd testPwdCloseByeEOF
五、主动交互办法二
需要2中要求采纳非交互的形式扭转登录用户明码,尝试用办法1,无奈实现。
这时候联想到交互信息的另一个主动输出办法,管道,通过echo + sleep + | 能够实现这个需要。
#!/bin/bash(echo "curpassword"sleep 1echo "newpassword"sleep 1echo "newpassword")|passwd
测试通过,运行这个脚本,间接把以后用户的 curpassword 改成 newpassword。
六、主动交互办法三
需要3中要求主动登录root账号,尝试办法1和办法2,都呈现谬误提醒standard in must be a tty。
这时候尝试寻找内部帮忙,一个shell工具expect能够实现这个性能,其实expect就是一个专门用来实现主动交互性能的工具,expect的语法能够参考相干材料,代码如下:
#!/usr/bin/expectspawn su rootexpect "password: "send "123456\r"expect eofexpect eof
测试通过,运行这个脚本,间接从以后用户登录到root用户。
七、办法总结
办法一(重定向)简略直观,也常常有理论利用,然而在主动交互畛域性能无限。
办法二(管道)也很简略直观,有时甚至不必sleep配合就能展示弱小的主动交互实力,然而在某些时候也大刀阔斧。
办法三(expect)在性能上是最为弱小的,expect原本就是为实现主动交互性能而生,然而毛病是须要装置expect包,在嵌入式等环境下难以装置。
三个办法各有优劣,利用的好,都能够实现Linux Shell主动交互。
‘小神’为大家筹备了以下资源,扫描下方二维码和我一起摸索Linux的世界