【问题标题】:How to write shell script which handles interactive inputs?如何编写处理交互式输入的shell脚本?
【发布时间】:2015-02-04 21:05:10
【问题描述】:

我有一个带有 2 个参数的命令。

当我手动运行命令时,我是这样做的:

cmd -i xyz.dat  
hit enter 
enter password in the prompt 
hit enter
confirm password

我的脚本需要在不期望用户输入密码的情况下进行上述操作。我可以硬编码文件中的密码,但需要一种方法来在我执行 shell 脚本时成功运行此命令。

截至 2 月 7 日, 我期望安装在我的 AIX 上。当我在命令提示符下键入 expect 时,提示符更改为 expect 1.1> OS is 64 bit AIX

我已按照以下评论中提到的说明进行操作,但我不断收到错误 - 无法执行命令;没有这样的文件或目录”?我可以从运行脚本的同一目录手动运行此命令。除此之外,我还给出了命令的完整路径和 文件。

我正在粘贴另一个我尝试使用 root 密码 su 的程序,如下所示:我在运行测试程序时收到相同的错误消息。我怀疑这是否与引号有关。

#!/bin/bash
set timeout 20
spawn "su"
expect "Password:" { send:"temp123\r" }
interact

有人可以帮我解决这个错误吗?

【问题讨论】:

  • 如果你得到'没有这样的文件或目录'的错误,这意味着你的系统上没有安装expect。这并不完全出乎意料(如果你原谅双关语的话)。安装expect 同样,AFAICR,需要 Tcl(或者,至少,expect 是基于 Tcl/Tk,所以当你安装 expect 时你最终会使用 Tcl 技术)。但是您很可能可以使用适当的命令安装其他人的预编译版本 - 其详细信息很大程度上取决于您使用的 Unix 品牌,以及如果是 Linux,则使用哪个发行版(不同的发行版有不同的软件安装系统)。
  • 我已经安装好了。
  • 好的;最好记录下您已安装 expect 并能够运行。现在,您正在运行的cmd 安装在哪里?它在你的 PATH 上吗? (必须是直接运行它的时候,所以我不认为这是个问题。)您可能需要检查expectspawn 命令是否执行基于路径的搜索。如果没有,我会感到惊讶,但更有趣的事情已经知道(它会解释错误)。
  • 有一本expect 5.31 版的手册。 spawn 上的信息并不特定于“搜索路径”,但我认为假设它是合理的。您提供的平台信息相互矛盾。您说“我希望在我的 linux 上安装……操作系统是 64 位 AIX”。您是在 Linux 还是 AIX(或两者)上运行?您的问题在哪里?
  • 我之前引用的手册页说:spawn [args] program [args] 创建一个正在运行的新进程program args。 由此,我推断您应该使用:spawn "cmd" "-i" "xyz.dat",即使其他答案表明并非如此。我怀疑这些引号中的大多数都是可选的。

标签: shell unix expect


【解决方案1】:

听起来你想使用expect。 Here 是一个包含一些示例的页面。

所以对于你的命令,你会想要这样的东西:

#!/usr/bin/expect

set timeout 20

spawn "cmd -i xyz.dat"

expect "<your password prompt" { send "<your password>\r" }
expect "<your password confirmation prompt" { send "<your password>\r" }

interact

【讨论】:

  • 仅链接的答案在这里不受欢迎,因为它们受到链接腐烂的影响。相反,请在答案本身中包含相关信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2011-02-25
  • 1970-01-01
  • 2016-05-29
  • 2015-06-29
  • 2013-05-06
  • 1970-01-01
相关资源
最近更新 更多