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

Hao*_*ang 2 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
Run Code Online (Sandbox Code Playgroud)

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

Are you really sure you want to do this ? (y/N) ?
Run Code Online (Sandbox Code Playgroud)

但第二个没有.

che*_*ner 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
Run Code Online (Sandbox Code Playgroud)

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