语境
我已经设置了一个站点来发布脚本,然后可以使用以下命令执行该脚本:
curl -so /tmp/script http://scripts.programster.org/scripts/1?output=raw && . /tmp/script
此示例脚本将“hello world”输出到终端。
正如您所看到的,这相当长且混乱,并且如果用户碰巧有一个名为/tmp/script
.我以前只是像这样通过管道进行 bash:
curl -s http://scripts.programster.org/scripts/1?output=raw | bash
但是,我希望该命令能够与用其他语言(例如 PHP)编写的脚本一起使用(#!/usr/bin/php
在脚本顶部使用),因此对第一个命令进行了更改。
问题
有没有一种方法可以让我执行在线脚本而不必将其保存到本地文件系统,同时也不知道事先在哪个程序中执行它?也许有一种方法可以像处理文件一样处理 url,它允许我执行以下操作:
. http://scripts.programster.org/scripts/1?output=raw
答案1
除了安全问题之外,我希望您确实意识到运行外部脚本的风险,这可以通过wget
与source
(点)命令的组合来完成
. <(wget -q -O- http://scripts.programster.org/scripts/1?output=raw)
这意味着将脚本文本获取到当前 shell 中
wget -O-
使下载到 STDOUT,-q
使其安静(不含消息)
<(any command)
是允许将输出解释为文件的进程替换
PS 卷曲 - 相当于wget -q -O-
is curl -s -o-
更新
上面的示例不会使用外部脚本的 she-bang,但会在调用 shell 的上下文中运行。为了利用 she-bang 线,一必须保存文件,使其可执行,然后才运行。
您可以使用mktemp
它来保证唯一的名称,然后您将需要负责删除临时文件。这可以组合在一个包装器中,该包装器将外部 url 作为参数
这是此类包装器的工作示例代码
#/bin/bash
exturl=${1?"No external url specified"}
tmpexe=$(mktemp)
trap 'rm $tmpexe' EXIT
curl -s $exturl -o $tmpexe
chmod 0755 $tmpexe
$tmpexe