正如标题所述,在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的新手,正在学习使输入自动化,并希望创建一个供输入的文件,用户可以在其中填充该文件并将其输入到我的脚本中。
答案 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
中的参数运行脚本,然后将脚本保存到本地计算机