【发布时间】:2014-10-06 20:36:46
【问题描述】:
这个问题与这个问题类似:https://serverfault.com/questions/342697/prevent-sudo-apt-get-etc-from-swallowing-pasted-input-to-stdin 但答案并不令人满意(将&& 附加到bash 脚本的每一行并不优雅)并且没有解释为什么有些用户可以粘贴/执行多个后续@987654323 @ 命令和其他命令不能,因为 stdout 被下一个命令膨胀了。
我有一个脚本my_script.sh:
sudo apt-get install -y graphicsmagick
sudo apt-get install -y libgraphicsmagick++1-dev
...
它只能有两行或更多的sudo apt-get install 内容。库(graphicsmagick 等)无关紧要,可以是任何库。
当我复制这个脚本并将其内容粘贴到 bash 或像这样执行它时:
cat my_script.sh | sudo -i bash
然后由于某种原因,只有第一行(graphicsmagick)被执行,其余的只是打印到控制台。仅在sudo apt-get install -y 发生,其他不包含此命令的脚本正常运行。
如果我将bash 更改为sh(即dash),我会得到预期的行为:
cat my_script.sh | sudo -i sh
您能解释一下为什么会发生这种情况吗?
在回答的时候,请你避开这个问题/cmets:
- 你为什么要这样做?
- 通过管道连接到 bash 并不安全
- 其他一些方面不安全或不安全
我只是想知道为什么bash 不能像我预期的那样工作,而sh 却可以。
附言。我使用的是 Ubuntu 14.04,sh 是破折号,你可以在这里看到:
vagrant@vagrant-ubuntu-trusty-64:/tmp$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 19 2014 /bin/sh -> dash
【问题讨论】:
-
你怎么知道
sh是dash?ls -l /bin/sh应该告诉你。您使用的是什么操作系统? -
@KeithThompson - 是的,它是 dash,ubuntu 14.04,quiestion 已编辑。
-
可能与您的问题无关,但您不需要在脚本中和调用
bash或sh时都使用sudo。 -
@KeithThompson - 同意,但它会导致任何问题吗?
-
这可以被简化为一个脚本文件
sudo apt-get -y install graphicsmagick<NEWLINE>sudo apt-get -y install libgraphicsmagick++1-dev,由cat tmp.sh | bash和cat tmp.sh | dash以不同的方式执行。这就是 minimal 示例的意义所在,并且不需要人们通过 sudo 执行下载的脚本或自己减少问题。在 Mint 17 上验证了这一点;似乎bash以某种方式将stdin的其余部分提供给apt-get之前-y选项启动。奇怪...