如何填写命令行界面?

5

我要自动化一个遗留系统的安装阶段,因为我不想每次安装时都再次付出更多努力。在Linux终端上进行安装过程时,我必须回答一些关于基本配置的问题。实际上,通过将所有Shell命令放入批处理文件中,可以很容易地自动化Shell命令,如下所示:

bin/startServer destination/sub_v1
bin/startAdminInterface
....

然而,我不知道如何自动化回答以下特定问题:
Enter the server's IP address: 
Enter the email of the contact person:
Would you like to disable UDP services?(y/n) [n]:
....

有没有任何工具或编程语言可以处理这种情况?或者有没有办法将答案作为参数在批处理文件中传递?

先感谢你的帮助。


1
尝试在网络上搜索安装过程中遇到的问题,因为输入 yn 实际上会改变程序的行为。在 Linux 中,尽可能让一切都按照您的意愿进行。如果您不确定如何回答此类问题,请查找大写字母或 [ ] 中的字母,它们实际上是默认选项,如果您按下回车键而没有输入 yn,则将使用这些选项。 - Rakholiya Jenish
1
实际上,我不是那个应用程序的开发者,我只是一个尝试自动化安装阶段的用户,因为每次安装时我都不想再次付出更多的努力! - Kh.Taheri
1
我曾经尝试过做同样的事情,但在bash脚本中,我无法解决这个问题。我认为你必须自己费心去输入y或n。 - shivams
2
“expect” 是这项工作的工具,我认为。假设您不能在此处提供答案。 - Toby Speight
1
你期望这个自动化程序从哪里获取服务器的IP地址?你期望它如何知道联系人?我的意思是它应该在哪里查找? - Mark Setchell
显示剩余3条评论
2个回答

4
这项工作的经典Linux工具是expect

使用expect,可以预期不同的问题和问题变体,并且问题不必完全输入。 expect不会盲目回答每个提示,而是提供实际问到的答案。

这里是一个简短的例子:

#!/usr/bin/expect -f
spawn someScript.sh
expect "Enter the server's IP address:"
send "10.0.0.4\r"
expect "Enter the email of the contact person:"
send "foo@bar.com\r"
expect "Would you like to disable UDP services?(y/n) [n]:"
send "y\r"

非常感谢 @dotancohen,这个答案看起来简单多了 :) - Kh.Taheri
我感到困惑!为什么要将整个问题都打出来,完美地每一个字母都正确,还要同时打出答案,这看起来比仅仅打出答案更简单? - Mark Setchell
1
@MarkSetchell:我相信使用expect可以期望不同的问题和问题的变化。实际上,问题不必完全打出来,请参阅相关手册。如果在使用expect时出现了意外的问题,则expect 不会将其答案提供给另一个问题。简而言之,expect不会盲目地回答每个提示,而是提供对实际提问的答案。肯定一个老的Unix黑客会欣赏这一点! - dotancohen
1
当然,我可以欣赏 expect 提供的灵活性,但由于它是一个 遗留 系统,我不认为问题会经常变化,因此我无法理解如何通过 a) 学习一种新语言,b) 要求在每个目标系统上安装该语言,c) 手动输入每个问题和 d) 输入答案来使其更加 简单,而不是直接输入答案。 - Mark Setchell
1
@Mark - 首先,通常可以使用剪切+粘贴功能,因此无需键入问题。其次,OP 暗示需要多次安装。expect 语言简单且小巧,因此学习起来并不困难 - 而且可能是值得的,特别是如果此安装是较长自动化任务的一部分(每隔一段时间回答问题可能很麻烦,而你可以继续进行其他工作)。最后,它使安装可重复 - 这是我喜欢能够预置 Debian 安装的原因之一。 - Toby Speight
显示剩余2条评论

1

所以,想象一下这是一个简化版本的脚本:

#!/bin/bash
read -p "Enter something:" thing
read -p "Enter server IP:" ip
read -p "Enter Email:" email
echo Received $thing, $ip, $email

这是一个名为answers的文件。
thingywhatnot
11.12.33.240
bozo@brains.com

你需要运行

installationScript < answers

而且它将打印出这个。
Received thingywhatnot, 11.12.33.240, bozo@brains.com

但是要做到这一点,用户需要运行程序,如果他不知道程序期望的输入的顺序和类型。 - Rakholiya Jenish
1
非常感谢@Mark Setchell,我很快会实现它,然后在这里告诉您进展情况。 - Kh.Taheri
1
我猜他知道问题是什么,以及它们的顺序,因为他在他的问题中展示了它们。 - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接