从 URL 执行 bash 脚本

新手上路,请多包涵

假设我在 URL http://mywebsite.example/myscript.txt 有一个文件,其中包含一个脚本:

 #!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"

而且我想在不先将其保存到文件的情况下运行此脚本。我该怎么做呢?

现在,我已经看到了语法:

 bash < <(curl -s http://mywebsite.example/myscript.txt)

但这似乎不像我保存到文件然后执行那样工作。例如 readline 不起作用,输出只是:

 $ bash < <(curl -s http://mywebsite.example/myscript.txt)
Hello, world!

同样,我尝试过:

 curl -s http://mywebsite.example/myscript.txt | bash -s --

结果相同。

最初我有一个解决方案,例如:

 timestamp=`date +%Y%m%d%H%M%S`
curl -s http://mywebsite.example/myscript.txt -o /tmp/.myscript.${timestamp}.tmp
bash /tmp/.myscript.${timestamp}.tmp
rm -f /tmp/.myscript.${timestamp}.tmp

但这似乎很草率,我想要一个更优雅的解决方案。

我知道有关从 URL 运行 shell 脚本的安全问题,但现在让我们忽略所有这些。

原文由 Tristan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 992
2 个回答
source <(curl -s http://mywebsite.example/myscript.txt)

应该这样做。或者,不要对您的初始重定向进行重定向,即重定向标准输入; bash 需要一个文件名,无需重定向即可正常执行,而 <(command) 语法提供了一个路径。

 bash <(curl -s http://mywebsite.example/myscript.txt)

如果你看一下 echo <(cat /dev/null) 的输出可能会更清楚

原文由 geekosaur 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是通过传递一些参数(arg1 arg2)来执行远程脚本的方法:

 curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2

原文由 Anandi Das 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题