管道参与脚本

时间:2013-09-05 04:19:52

标签: bash pipe sh

我可以将参数传递到使用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

1 个答案:

答案 0 :(得分: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,或者你被困在20世纪90年代中期,而Bash 2.x和Debian Potato是热门新闻,你可以用常规here document替换<<<'here string'。 )