如何在bash中提供输入[通过网络执行]

时间:2018-08-17 05:50:39

标签: linux bash input debian

正如标题所述,在Linux中,当我执行sudo bash时,如何将输入提供给bash?

让我们说我有一个bash脚本来读取名称。

我执行脚本的方式是通过sudo使用: cat read-my-name-script.sh | sudo bash

让我们说这就是我通过网络执行脚本的方式。

现在,我想自动填写名称,有没有一种方法可以输入内容。我尝试这样做:cat read-my-name-script.sh < name-input-file | sudo bash,其中name-input-file是用户将用来提供脚本的输入文件。

我是Linux的新手,正在学习使输入自动化,并希望创建一个供输入的文件,用户可以在其中填充该文件并将其输入到我的脚本中。

2 个答案:

答案 0 :(得分:2)

这令人费解,但可能会做您想做的事。

sudo bash -c "$(cat read-my-name.sh)" <name-input-file

-c说,下一个引号是要运行的命令(因此,请在命令行上以字符串形式而不是从文件中读取脚本),并且调用Shell会内插文件的内容在sudo命令被求值之前,双引号内。因此,如果read-my-name.sh包含

#!/bin/bash
read -p "I want your name please"

然后将命令扩展为

sudo bash -c '#!/bin/bash
read -p "I want your name please"' <name-input-file

(当然,这时外壳实际上已经完全删除了外部双引号;我改用单引号代替了它们,以显示它看起来像是实际可执行的,在语法上有效的代码)。

答案 1 :(得分:0)

我认为您需要:

while read -r arg; do sudo bash read-my-name-script.sh "$arg";done <name-input-file  

因此name-input-file的每一行都将作为参数传递给sudo bash read-my-name-script.sh

如果您的argslist位于http服务器上,则可以执行以下操作:

while read -r arg; do sudo bash read-my-name-script.sh "$arg";done < <(wget -q -O- http://some/address/in/internet/name-input-file)  

UPD

添加[[ -f name-input-file ]] && readarray -t args <name-input-file
read-my-name-script.sh
并在脚本中使用"${args[@]}"作为命令的参数。
例如,echo "${args[@]}"cmd "${args[0]}" "${args[1]}" ... "${args[100]}"以任何顺序排列。

在这种情况下,您可以使用
wget -q -O- http://some/address/in/internet/read-my-name-script.sh | bash
使用name-input-file中的参数运行脚本,然后将脚本保存到本地计算机