以root身份从curl到bash的进程替换

以root身份从curl到bash的进程替换

我正在尝试使用以下命令以 root 身份从 URL 运行脚本:

sudo bash <(curl -s http://copy.com/gLVZIqUubzcS/popcorn)

但我收到这个错误:

bash: /dev/fd/63: Aucun fichier ou dossier de ce type

法语“未找到”。有什么想法吗?

PS:我运行的是Ubuntu 12.04

答案1

sudo关闭除 stdin、stdout 和 stderr 之外的所有打开的文件描述符(请参阅 参考资料man sudo),因此进程替换在 OOTB 中不起作用sudo

比较

$ sudo bash <(echo echo foo)
bash: /dev/fd/63: No such file or directory

$ bash <(echo echo foo)
foo

您可以解决此问题(或使用-C标志 to sudo),但无论如何,做您想做的事情是不好的 - 尽管很常见 - 做法。如果您真的只想运行安装程序,请获取root-shell第一的然后运行其余部分而不使用sudo.

答案2

不要使用这样的进程替换。实际上,无论如何,它几乎就是这样:

sudo sh <<CURL_SCRIPT
    $(curl -s http://copy.com/gLVZIqUubzcS/popcorn)
CURL_SCRIPT

或者:

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo sh

除非您尝试运行的脚本使用bashisms上述内容才能工作。如果它确实使用bash-only 语法,你应该这样做:

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo . /dev/stdin

虽然上面的方法似乎不起作用,但我预计这是由于sudo不喜欢 shell 的内置.dot.

所以这样做:

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo ${0#-} /dev/stdin

您也可以简单地执行以下操作:

sudo sh -c "$(curl -s http://copy.com/gLVZIqUubzcS/popcorn)"

bash当您可以使用 shell 的内置函数时,您不需要再次调用可执行文件。

相关内容