Como ativar o 'sudo' com funções personalizadas?

5

Recentemente, descobri que você pode ativar sudo para aliases personalizados da seguinte forma:

alias sudo='sudo ' # note: the space is required!

O motivo pelo qual isso funciona é o seguinte:

If the last character of the alias value is a space or tab character, then the next command word following the alias is also checked for alias expansion.

Minha pergunta é: existe alguma maneira de ativar sudo com funções personalizadas também?

    
por Mathias Bynens 26.03.2012 / 08:44

1 resposta

0

No caso geral, o que você está tentando fazer não funciona realmente.

Com aliases, há praticamente apenas uma reconfiguração de string antes que a linha seja passada para execução.

Então, por exemplo, se você tiver

alias sudo='sudo '
alias foo='bar baz'

quando você digita sudo foo , a linha de comando é reescrita em sudo bar baz e é o que é executado. Isso é simples de reescrever a linha de comando.

Agora as funções são mais difíceis. Não são simples reescritas, mas uma avaliação completa; eles podem definir variáveis, alterar diretórios, abrir arquivos ... praticamente qualquer qualquer coisa que o shell possa fazer. E, mais importante, eles são executados no contexto do shell atual. Quando você executa sudo myfunction , nada disso é possível; em particular, os comandos sudo são executados como um subprocesso e, portanto, não podem afetar o shell atual.

A solução alternativa usada para itens como sudowrap mencionado acima é tentar trabalhar automaticamente em sudo bash -c 'myfunction() {...} ; myfunction' . Isso chama explicitamente uma nova subcamada bash e, em seguida, executa a função nessa subcamada. A chamada explícita deixa claro que coisas como configurar variáveis e afins não funcionarão :-) Ela permite um subconjunto limitado de funcionalidades.

O tipo de funções que você pode chamar dessa maneira pode ser melhor reescrito como scripts shell em vez de funções; então sudo pode chamá-los diretamente. O exemplo dado no link seria mais fácil se você tivesse duk convertido para um executável

#!/bin/bash
exec du -k "$@" | sort -n

Isso funcionará como esperado!

    
por 10.07.2016 / 17:17