Aproveitando a resposta de @ Lekensteyn ...
Se você usar declare -pf
, todas as funções definidas anteriormente no shell atual serão enviadas para STDOUT.
Nesse ponto, você pode redirecionar o STDOUT para onde você quiser e, com efeito, colocar as funções definidas anteriormente onde você quiser.
A resposta a seguir irá preenchê-los em uma variável. Em seguida, fazemos eco dessa variável mais a invocação da função que queremos executar no novo shell que é gerado como um novo usuário. Fazemos isso usando sudo
com a opção -u
(também conhecido como user
) e simplesmente executando o Bash (que receberá o STDOUT canalizado como a entrada a ser executada).
Como sabemos que estamos indo de um shell Bash para um shell Bash, sabemos que o Bash interpretará corretamente as funções definidas anteriormente. A sintaxe deve estar bem, desde que nos movamos entre um shell Bash da mesma versão para um novo shell Bash da mesma versão.
YMMV se você estiver se movendo entre diferentes shells ou entre sistemas que possam ter diferentes versões do Bash.
#!/bin/bash
foo() {
echo "hello from 'whoami'"
}
FUNCTIONS='declare -pf'; echo "$FUNCTIONS ; foo" | sudo -u otheruser bash
# $./test.sh
# hello from otheruser