这两个Bash命令有什么区别?

时间:2017-03-25 20:44:54

标签: bash

这两个Bash命令的区别是什么? :

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered | bash

第一个命令给了我这个提示:

Are you really sure you want to do this ? (y/N) ?

但第二次没有。

1 个答案:

答案 0 :(得分:6)

在第一个命令中,bash从其父级继承其标准输入。假设您在提示符下键入命令,则父级将是您的交互式shell,其标准输入是(在没有任何其他更改的情况下)您的终端模拟器。

在第二个命令中,bash的标准输入是curl的输出,而不是终端,这意味着bash执行的脚本的标准输入是 curl的输出。

如果要求确认的任何命令,只有在检测到标准输入是终端时才会这样做。更糟糕的是,如果脚本试图从标准输入读取,它实际上可能会消耗其自身的一部分,如果它赢得了bash用于从管道读取的竞争条件。

正确的做法(以及安全的事情)是首先将curl的输出保存到文件中,然后验证在实际执行之前运行的是什么。

curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered > update-script
# look at update-script
bash update-script

通过“look”,我的意思是要么直观地检查输出,要么至少将本地计算的校验和与源提供的校验和进行比较,以确保您收到的字节是您应该得到的字节。 (这可以再次防范网络腐败,中间人攻击等)。