每当需要从Web执行shell脚本时curl -s [url] | sh
,我都会先url
在Web浏览器中打开以确保该脚本不是恶意的并且可以安全运行。
我记得曾经看到过一个命令行技巧,可以从命令行读取脚本,然后在读取脚本后确认执行。如果我没记错的话,它看起来像curl -s [url] | something...here | sh
,不需要任何软件。
有人知道这个把戏吗?
每当需要从Web执行shell脚本时curl -s [url] | sh
,我都会先url
在Web浏览器中打开以确保该脚本不是恶意的并且可以安全运行。
我记得曾经看到过一个命令行技巧,可以从命令行读取脚本,然后在读取脚本后确认执行。如果我没记错的话,它看起来像curl -s [url] | something...here | sh
,不需要任何软件。
有人知道这个把戏吗?
Answers:
我想不出一个可以完成您所描述的功能的实用程序,但是创建外壳程序片段很容易。
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"
很难想象您为什么还要这么做,更不用说在哪里可以找到脚本源(一个或多个)来下载和运行这样的脚本了,以至于它需要一个专用工具。
为什么不只是使用curl
(或wget
或snarf
其他方式)下载脚本,对其进行检查和编辑(这是一种罕见的脚本,不需要为您的特定系统进行一些自定义),然后运行该脚本-通过使其与chmod
或一起执行即可sh scriptname
?
less
或其他操作,然后询问您是否要运行它并不难。我看不到有什么比仅下载脚本,查看脚本然后运行它(如果看起来还可以)更好的方法。IMO会更糟,它不会提供任何优势,但是会消除仅在Shell中工作所带来的灵活性。
使用以下命令行:
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
$()
应该在第一行引用。同样,这将删除输入中的NUL字符,这可能是致命的(例如,在自解压脚本的情况下)。