以 root 身份处理从 curl 到 bash 的替换

pr.*_*zar 6 bash sudo file-descriptors process-substitution

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

sudo bash <(curl -s http://copy.com/gLVZIqUubzcS/popcorn)
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

bash: /dev/fd/63: Aucun fichier ou dossier de ce type
Run Code Online (Sandbox Code Playgroud)

法语为“未找到”。任何想法可能是什么?

PS:我正在运行 Ubuntu 12.04

Adr*_*rth 6

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

相比

$ sudo bash <(echo echo foo)
bash: /dev/fd/63: No such file or directory
Run Code Online (Sandbox Code Playgroud)

$ bash <(echo echo foo)
foo
Run Code Online (Sandbox Code Playgroud)

您可以解决这个问题(或使用-C标志 to sudo),但是做您想做的事情是不好的 - 尽管很常见 - 无论如何都要练习。如果你真的只是想运行安装程序,得到一个root-shell第一,然后运行没有休息sudo


mik*_*erv 3

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

sudo sh <<CURL_SCRIPT
    $(curl -s http://copy.com/gLVZIqUubzcS/popcorn)
CURL_SCRIPT
Run Code Online (Sandbox Code Playgroud)

或者:

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo sh
Run Code Online (Sandbox Code Playgroud)

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

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo . /dev/stdin
Run Code Online (Sandbox Code Playgroud)

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

所以这样做:

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo ${0#-} /dev/stdin
Run Code Online (Sandbox Code Playgroud)

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

sudo sh -c "$(curl -s http://copy.com/gLVZIqUubzcS/popcorn)"
Run Code Online (Sandbox Code Playgroud)

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