关于linux:Linux-Shell-自动交互人机交互的-3-种方法

3次阅读

共计 1636 个字符,预计需要花费 5 分钟才能阅读完成。

如果你要学习 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/bash
ftp -i -n 192.168.167.187 << EOF
user hzc 123456
Pwd
cd test
Pwd
Close
Bye
EOF

五、主动交互办法二

需要 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
expect eof

测试通过,运行这个脚本,间接从以后用户登录到 root 用户。

七、办法总结

办法一 (重定向) 简略直观,也常常有理论利用,然而在主动交互畛域性能无限。
办法二 (管道) 也很简略直观,有时甚至不必 sleep 配合就能展示弱小的主动交互实力,然而在某些时候也大刀阔斧。
办法三 (expect) 在性能上是最为弱小的,expect 原本就是为实现主动交互性能而生,然而毛病是须要装置 expect 包,在嵌入式等环境下难以装置。
三个办法各有优劣,利用的好,都能够实现 Linux Shell 主动交互。

‘小神’为大家筹备了以下资源, 扫描下方二维码和我一起摸索 Linux 的世界


正文完
 0