1

我可以通过管道将参数导入使用 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
4

1 回答 1

0

您可以通过管道将文本从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 文档替换。)

于 2013-09-05T05:32:38.063 回答