我可以通过管道将参数导入使用 curl 下载的脚本,并让脚本接受它们为 $1、$2 等。试图让这个说 Hello world
$ curl mysite.com
echo hello $1
$ echo world | curl mysite.com
echo hello $1
$ echo world | $(curl mysite.com)
hello $1
您可以通过管道将文本从curl
传输到sh
。
curl http://example.com/ | sh /dev/stdin world
显然,/dev/stdin
脚本名称不能移植到没有 的平台上/dev/stdin
。你可以用类似的东西来解决这个问题
sh -c "$(curl http://example.com/)" _ world
之后的第一个参数sh -c '...'
进入,因此为此提供$0
了虚拟参数。_
无论哪种方式,除非您对 URL 完全有信心,否则这是非常不安全的。参见例如http://blog.classicalcode.com/2012/11/curl-pipe-sh-exploit-proof-of-concept/
对于没有 的测试curl
,您可以简单地替换curl http://example.com/
为echo 'echo "hello $1"'
,或者只是在标准输入上提供一个静态字符串。
sh /dev/stdin world <<<'echo "hello $1"'
(如果你的 shell 不是 Bash,或者你被困在 1990 年代中期并且 Bash 2.x 和 Debian Potato 是热门新闻,你可以用<<<'here string'
常规的here 文档替换。)