Executando comando com outro usuário dentro de um shell script
Gosto de utilizar estes comando em funções, que são necessárias para serem executadas pelo crontab do root mais por outros usuários assim mantendo as permissões nos arquivos.
Você pode utilizar o su do seguinte modo para fazer isso no shell script:
su -c "comando" -s /bin/sh nomedoUsuario
A opção -c especifica que irá passar um único comando ao shell
A opção -s é utilizado para especificar com qual shell chamaremos o comando sendo atrelado o shell à um usuário específico.
Uma outra forma para fazer isso é através do uso do sudo do seguinte modo:
sudo -h -u nomedoUsuario bash -c "comando"
A opção -h é uma política de segurança que permite definir a variável de ambiente $HOME para o usuário especificado(root é por padrão).
A opção -u especifica o usuário que irá executar o comando.
#!/bin/bash echo 'rodando com usuário A' sudo -H -u nomedoUsuario bash -c "Foo" sudo -H -u nomedoUsuario bash -c "Bar" echo 'Rodando com Usuário B' sudo -H -u nomedoUsuario bash -c "Baz"
Um outro comando que pode ser utilizado para executar essa função é o runuser. Sua sintaxe é bem prática e básica, poderemos executa-lo da seguinte forma:
runuser -l usuario -c comando
Os comandos abaixo servem de teste, mostrando qual o usuário atual e o PID do bash:
#!/bin/bash whoami && echo $ sleep 2 runuser -l usuario1 -c "whoami && echo $" sleep 2 runuser -l usuario2 -c "whoami && echo $"
No meu caso testei com o script:
#!/bin/bash whoami && echo $ sleep 2 runuser -l lucas -c "whoami && echo $" sleep 2 runuser -l root -c "whoami && echo $"
Resultado:
root 694 lucas 694 root 694
Para mais informações rode o comando man runuser.
Sistemas Operacionais
GNU/Linux, BSD, Unix-like e Software Livre