在从curl 传输到sh 之前读取并确认shell 脚本(curl -s [url] | sh)

在从curl 传输到sh 之前读取并确认shell 脚本(curl -s [url] | sh)

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

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

有谁知道这个技巧吗?

答案1

moreutils调用中有一个实用程序vipe,可以在编辑器中显示标准输入,您可以在文件传递到标准输出之前在其中查看和修改文件。

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

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

mktemp已经存在coreutils并且很可能已经安装在您的系统上。

答案2

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

curl为什么不直接使用(或wget或或其他)下载脚本snarf,检查并编辑它(这是一个罕见的脚本,不需要针对您的特定系统进行一些自定义),然后运行它 - 通过使用chmod或使用使其可执行sh scriptname

答案3

我想不出有哪个实用程序可以执行您所描述的操作,但将其制作为 shell 片段很容易。

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

这假设脚本是一个文本文件。不支持空字节:根据 shell,它们可能会被删除,或者可能导致一行或整个文件被截断。此外,文件末尾的所有换行符都将被删除(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"

答案4

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

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x

相关内容