每当我必须从网络执行 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