Como habilitar o `sudo` com funções personalizadas?

Como habilitar o `sudo` com funções personalizadas?

Recentemente, aprendi que você pode ativar sudoaliases personalizados da seguinte maneira:

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

A razão pela qual isso funcionaé o seguinte:

Se o último caractere do valor do alias for um espaço ou tabulação, a próxima palavra de comando após o alias também será verificada quanto à expansão do alias.

Minha pergunta é: existe alguma maneira de habilitar sudofunções personalizadas também?

Responder1

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

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

Então, por exemplo, se você tiver

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

então quando você entra sudo foona linha de comando é reescrito sudo bar bazequeé então o que é executado. Esta é uma simples reescrita de 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 fazemqualquer coisao shell pode fazer. E, o mais importante, eles são executados no contexto do shell atual. Quando você corre sudo myfunction, nada disso é possível; em particular, sudoos comandos são executados como um subprocesso e, portanto, não podem afetar o shell atual.

A solução alternativa usada para coisas como as sudowrapmencionadas acima é tentar resolver automaticamente sudo bash -c 'myfunction() {...} ; myfunction'. Isso chama explicitamente um novo bashsubshell e, em seguida, executa a função nesse subshell. A chamada explícita deixa claro que coisas como definir variáveis ​​e coisas do gênero 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 de shell em vez de funções; então sudopode ligar para eles diretamente. O exemplo dado emhttp://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlseria mais fácil convertendo dukpara um executável

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

Isso funcionará conforme o esperado!

informação relacionada