Como usar o sudo -i em um shell script

2

É possível usar sudo -i em um script de shell? Eu acho que o comando exit vai ter problemas ...

#!/bin/bash

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-'uname -s'-'uname -m' > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
exit
    
por user3142695 18.01.2017 / 18:43

2 respostas

2

Foi testado! ... Verifique como o comando curl foi modificado ...

#!/bin/bash

sudo -u root curl -L "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo -u root chmod +x /usr/local/bin/docker-compose
exit
    
por 18.01.2017 / 18:49
2

Você não pode usar sudo dessa maneira. O script lhe daria um shell root interativo e pausaria até você sair do shell. Em seguida, ele executaria os comandos restantes no script sem root privileges.

Se o seu script somente fizer coisas que requeiram root privileges, execute o script inteiro com sudo :

$ sudo ./myscript.sh

O script seria parecido com

#!/bin/bash
curl -L https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-'uname -s'-'uname -m' > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

(Nota: na verdade, eu não olhei para ver o que esses comandos realmente fazem)

Caso contrário, e esta é apenas uma opinião pessoal, pode ser uma boa ideia dividir os root bits do script e colocá-los em scripts próprios, pelo menos se forem tarefas comuns.

#!/bin/bash

# script that does things as an ordinary user
# ...

sudo "$HOME/admin_tasks/do_docker_stuff.sudo"

# rest of script
# ...

Ou você pode fazer o que todo mundo parece estar fazendo e prefixar todas as linhas do script com sudo . Nesse caso, ele falharia, já que há um redirecionamento na primeira linha que precisa de root privileges, então você "conserta" usando sudo bash -c " ... > ... " , transformando o script legível e agradável em uma bagunça de confusão (novamente, apenas uma opinião pessoal).

Depois de pensar um pouco: Esse não é um script longo, portanto, fazer várias chamadas sudo no script pode não ser uma ideia tão ruim, mas podemos deixar a invocação de curl fora de sudo :

#!/bin/bash

curl -L -o ./docker-compose "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)"

chmod a+x ./docker-compose

sudo mv ./docker-compose /usr/local/bin/docker-compose
sudo chown root:root /usr/local/bin/docker-compose

Esses três últimos comandos poderiam ser colocados em um script do_local-bin_install.sudo (para reutilização por outros scripts):

#!/bin/bash

binary="$1"

chmod a+x "$binary"
chown root:root "$binary"
mv -i "$binary" /usr/local/bin/

que poderíamos chamar do nosso script:

#!/bin/bash
curl -L -o ./docker-compose "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)"

sudo ./do_local-bin_install.sudo ./docker-compose

Desculpe, este foi um tipo de fluxo de resposta da consciência. Espero que alguém considere compreensível.

    
por 18.01.2017 / 19:06