Estou tentando criar um script como este:
#!/bin/bash
sudo -s
something...
Quando o executo, recebo um novo shell, mas something
é executado apenas quando saio do shell criado por sudo -s
, e não dentro dele.
Qualquer ajuda?
shell-script
sudo
Matteo
fonte
fonte
sudo -s
apenas no caso de oroot
usuário ter a idéia (bastante ruim) de alterar seu shell. Deve ser realmente osudo sh
que afirma explicitamente qual shell deve ser usado.Outra maneira seria passar um comando bash completo para
sudo
:No entanto, a melhor maneira seria a de lançar o roteiro com
sudo
seu lugar. Não é uma boa idéia tersudo
dentro do script. Muito melhor executar o script inteiro com privilégios de root (sudo script.sh
). Se necessário, você pode usarsudo
para eliminar privilégios para comandos específicos. Por exemplo:A execução do script acima retorna:
fonte
O shell Bourne tem uma
-c
bandeira que você pode usar para passar um script arbitrário para o shell, para que você possa escrever algo comoNo entanto, isso é útil apenas para os comandos mais simples, porque é muito complicado citar o script corretamente e o inconveniente é ainda maior se você enviar o comando para um servidor remoto através do ssh porque o script de argumento será analisado duas vezes, uma vez ao lado enviando o script e uma vez do lado executando o script.
Se
something
é um script complexo ou precisa ser passado por uma linha ssh , é prática comum escrever uma funçãoprepare_something_script
cujo trabalho é escrever o script 'algo' no stdout . Na sua forma mais simples, esta função pode usar um documento aqui para gerar sua saída:O script produzido por
prepare_something_script
pode então ser executado localmente com os privilégios concedidos pelo sudo da seguinte maneira:No cenário em que o script deve ser executado remotamente com privilégios concedidos pelo sudo , é habitual codificar o script na base 64 para evitar o redirecionamento da entrada padrão do ssh , assim:
Se você usar esse código em uma função, não esqueça de marcar a variável something64 como local . Algumas implementações da base64 oferecem um
-d
sinalizador para decodificar, que é menos bem suportado que a--decode
variante detalhada . Algumas implementações requerem adicionar um-w 0
ao comando de codificação para evitar quebras de linha falsas.fonte
Você precisa adicionar o comando antes do sudo -s, em vez de na próxima linha.
fonte