Processe a substituição de curl para bash como root

5

Estou tentando executar um script de URL como root com este comando:

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

Mas estou recebendo este erro:

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

Francês para "não encontrado". Alguma idéia do que poderia ser?

P.S: estou executando o Ubuntu 12.04

    
por pr.nizar 15.04.2014 / 08:53

2 respostas

3

Não use substituição de processo assim. Na prática, é praticamente isso mesmo:

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

Ou:

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

A menos que o script que você está tentando executar use bashisms , o acima funcionará. Se usar a sintaxe bash -only você deve fazer:

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

Embora o acima não pareça funcionar, o que eu espero é que sudo não goste do .dot.

interno do shell

Então faça isso:

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

Você também pode simplesmente fazer:

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

Você não precisa invocar o executável bash novamente quando puder usar os recursos internos do shell.

    
por 15.04.2014 / 09:26
6

sudo fecha todos os descritores de arquivos abertos diferentes de stdin, stdout e stderr (consulte man sudo ) para que a substituição do processo não funcione com OOTB com sudo .

Compare

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

e

$ bash <(echo echo foo)
foo

Você pode contornar isso (ou usar o -C flag para sudo ), mas fazer o que você está tentando fazer é uma prática ruim - embora comum - de qualquer maneira. Se você realmente quer apenas executar o instalador, obtenha um root -shell primeiro e depois execute o resto sem sudo .

    
por 15.04.2014 / 09:16