在某些情况下,我们可能需要实现与其他程序(如 FTP、Telnet 服务器等)的交互功能。这时,使用 Shell 的自动交互功能可以帮助我们完成这些任务。下面介绍三种常用的自动交互方法。
1. 重定向
自动交互的关键在于自动输入交互信息。在 Shell 编程中,有一种用法是 `command << delimiter`,它表示从标准输入读取数据,直到遇到指定的分界符(delimiter)。
重定向操作符 `command << delimiter` 是一个非常实用的命令。Shell 会将分界符 delimiter 之后的内容,直到下一个相同分界符之间的所有内容作为输入。当遇到下一个分界符时,Shell 就知道输入已经结束了。最常用的分界符是 `EOF`,当然,你也可以自定义其他字符作为分界符。
例如,我们可以通过一台 Linux 机器的 FTP 登录到另一台 Linux 机器,进行一系列操作后再关闭连接。代码如下:
在上面的代码中,使用了账号 `mrkj` 和密码 `123456` 成功登录到 192.168.1.1 服务器后,首先打印当前目录,然后进入 `test` 目录,再次打印当前目录,最后关闭连接并退出。
2. 管道
如果采用非交互的方式来更改登录用户的密码,那么使用重定向的方法可能无法实现。这时,可以使用另一种自动输入交互信息的方法——管道。通过组合 `echo`、`sleep` 和 `|` 命令,可以达到非交互的效果。代码如下:
通过这个脚本,可以将当前用户的密码 `curpassword` 直接更改为新密码 `newpassword`。需要注意的是,将 `curpassword` 和 `newpassword` 替换为实际对应的真实密码。
3. Expect
Expect 是一个基于 TCL 语言的工具,通常用于自动化控制和测试,它能够解决 Shell 脚本中的交互问题。使用 Expect 之前需要先进行安装,安装代码如下:
安装完成后,可以结合例子进行使用。
例如,编写一个 Shell 脚本,实现从普通用户切换到超级用户 `root`。如果使用重定向或管道的方法可能无法实现这一功能,但使用 Expect 可以轻松实现。代码如下:
代码说明如下:
①首行指定脚本使用的解释器。
②`spawn` 用于启动一个新的进程,通常跟随一个 Linux 命令,用来表示开启一个会话、启动进程,并监控后续的交互信息。
③`expect` 用于接收命令执行后的输出,并与期望的字符串进行匹配。如果匹配成功,立即返回;否则等待超时时间后返回。
④`send` 用于向进程发送字符串,模拟用户的输入。注意该命令不会自动回车换行,因此通常需要加上 `\r` 或 `\n`。
⑤`expect eof` 表示交互结束,等待命令执行完毕,返回到原用户状态。这与 `spawn` 相对应。例如,当切换到 `root` 用户时,Expect 脚本默认等待 10 秒,命令执行完后停留 10 秒,然后自动切换回原用户。