O shell Bourne tem um sinal -c
que você pode usar para passar um script arbitrário para o shell, para que você possa escrever algo como
sudo sh -c 'something'
No entanto, isso é útil apenas para os comandos mais simples, porque é muito complicado citar o script corretamente e a inconveniência é ainda maior se você enviar o comando para um servidor remoto por ssh porque o argumento o script será analisado duas vezes, uma vez no lado enviando o script e uma vez no lado executando o script.
Se something
for um script complexo ou precisar ser passado por uma linha ssh , é uma prática comum escrever uma função prepare_something_script
cujo trabalho é escrever o script 'algo' em stdout . Em sua forma mais simples, essa função pode usar um documento here para gerar sua saída:
prepare_something_script()
{
cat <<EOF
something
EOF
}
O script produzido por prepare_something_script
pode então ser executado localmente com os privilégios concedidos pelo sudo da seguinte forma:
prepare_something_script | sudo sh
No cenário em que o script deve ser executado remotamente com privilégios concedidos pelo sudo , é costume codificar o script na base 64 para evitar redirecionar a entrada padrão de ssh assim:
something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"
Se você usar esse código em uma função, não se esqueça de marcar a variável algo64 como local . Algumas implementações de base64 oferecem um sinalizador -d
para decodificar, o que é menos bem suportado do que a variante --decode
detalhada. Algumas implementações exigem a adição de um -w 0
ao comando de codificação para evitar quebras de linha falsas.