【问题标题】:What is the difference between these two Bash commands?这两个 Bash 命令有什么区别?
【发布时间】:2017-03-25 20:44:54
【问题描述】:

这两个 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) ?

但第二个没有。

【问题讨论】:

    标签: bash


    【解决方案1】:

    在第一个命令中,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
    

    “看”是指目视检查输出,或者至少将本地计算的校验和与源提供的校验和进行比较,以确保您收到的字节是您应该获得的字节。 (这可以防止网络损坏、中间人攻击等)

    【讨论】:

    • +1。请注意,可以通过使用&lt; &lt;(...)(扩展为例如&lt; /dev/fd/63)而不是仅使用&lt;(...)(扩展为例如/dev/fd/63)来调整第一个命令以匹配第二个命令。 &lt;(...) 符号的 &lt; 有点误导。
    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 2011-11-12
    • 2018-11-19
    • 2016-07-13
    • 2012-06-12
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多