这两个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) ?
但第二次没有。
答案 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”,我的意思是要么直观地检查输出,要么至少将本地计算的校验和与源提供的校验和进行比较,以确保您收到的字节是您应该得到的字节。 (这可以再次防范网络腐败,中间人攻击等)。