在从curl到sh的管道传输之前,请阅读并确认Shell脚本(curl -s [url] | sh)


11

每当需要从Web执行shell脚本时curl -s [url] | sh,我都会先url在Web浏览器中打开以确保该脚本不是恶意的并且可以安全运行。

我记得曾经看到过一个命令行技巧,可以从命令行读取脚本,然后在读取脚本后确认执行。如果我没记错的话,它看起来像curl -s [url] | something...here | sh,不需要任何软件。

有人知道这个把戏吗?

Answers:


5

有一个moreutils名为的实用程序,vipe用于在编辑器中显示stdin,您可以在其中修改和修改文件,然后再将其传递给stdout。

如果您不想安装moreutils,则可以完成类似的操作:

file=$(mktemp); curl -s "$url" > $file; $EDITOR $file; sh $file; rm $file

mktempcoreutils并极有可能已经安装在系统上。


2

我想不出一个可以完成您所描述的功能的实用程序,但是创建外壳程序片段很容易。

script=$(curl -s "$url")
printf "%s\nDo you want to run this script? [yN]" "$script"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh -c "$script";;
esac

假设脚本是文本文件。不支持空字节:根据外壳,它们可能会被删除,或者可能导致一行或整个文件被截断。同样,文件末尾的所有换行符也将被删除(heredoc结构向后添加一个)。对于脚本来说,这通常不是问题,但是,例如,如果脚本以提取的二进制格式的存档结尾,则可能是问题。这不是一种非常可靠的分发文件的方式,因为这种二进制脚本在某些时候可能会被错误编码。尽管如此,您仍可以通过将脚本写入临时文件来处理它。

script_file=$(mktemp)
curl -s "$url" | tee "$script_file"
printf "Do you want to run this script? [yN]"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh "$script_file";;
esac
rm "$script_file"

$()应该在第一行引用。同样,这将删除输入中的NUL字符,这可能是致命的(例如,在自解压脚本的情况下)。
l0b0 2013年

1
@ l0b0 尽管可以说是很好的风格,但您无需在作业中加引号。空字节确实丢失了,最后的换行符也是如此;如果要在shell脚本中包含档案,我建议使用诸如base64之类的文本编码。
吉尔斯(Gilles)“所以,别再邪恶了”

所有有效点,照常。+1
l0b0 2013年

@ l0b0仔细考虑一下,尽管它有些容易出错,但这是一个有效的用例。我已经更新了答案。我还纠正了原始答案中的一个缺陷,该缺陷不允许脚本使用其stdin(因为该脚本是在stdin上传递的,没有充分的理由)。
吉尔斯(Gillles)“所以别再作恶了”

1

很难想象您为什么还要这么做,更不用说在哪里可以找到脚本源(一个或多个)来下载和运行这样的脚本了,以至于它需要一个专用工具。

为什么不只是使用curl(或wgetsnarf其他方式)下载脚本,对其进行检查和编辑(这是一种罕见的脚本,不需要为您的特定系统进行一些自定义),然后运行该脚本-通过使其与chmod或一起执行即可sh scriptname


我不需要专用工具。我记得有一种简单的方法可以使用标准工具来执行此操作。
奥利维尔·拉隆德

2
编写一个小的shell脚本(大概只有5行左右)来下载一个脚本,呈现它以供查看less或其他操作,然后询问您是否要运行它并不难。我看不到有什么比仅下载脚本,查看脚本然后运行它(如果看起来还可以)更好的方法。IMO会更糟,它不会提供任何优势,但是会消除仅在Shell中工作所带来的灵活性。
2012年

0

使用以下命令行:

curl URL | ( cat > /tmp/file; read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) | sh

您可以为此使用一个小函数:

curlsh()
{
    curl "$1" \
    | ( cat > /tmp/file;read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) \
    | sh
}

而不是这样使用它:

curlsh http://site.in.net/path/to/script

0

假设您的读取知道-p(提示),并且不需要使用由shebang指定的解释器执行脚本:

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.