Qual é uma boa maneira de executar um script de shell como um usuário diferente. Estou usando o Debian etch e sei qual usuário quero representar.
Se eu estivesse fazendo isso manualmente, eu faria:
su postgres
./backup_db.sh /tmp/test
exit
Como quero automatizar o processo, preciso de uma maneira de executar backup_db.sh como postgres (herdando o ambiente etc.)
Obrigado!
Para executar seu script como outro usuário como um comando, execute:
Eu recomendo sempre usar caminhos completos em scripts como este - você nem sempre pode garantir que estará no diretório certo quando su (talvez alguém tenha alterado o homedir em você, quem sabe). Eu também sempre uso o caminho completo para su (/bin/su) porque sou paranóico. É possível que alguém possa editar seu caminho e fazer com que você use uma versão comprometida do su.
Se o usuário de destino a ser executado tiver shelll nologin definido, você poderá usar a opção -s para especificar o shell:
Veja a seguinte pergunta: execute o script como usuário que possui shell nologin
Para automatizar isso em um agendamento, você pode colocá-lo no crontab do usuário. Os trabalhos Cron não obterão o ambiente completo, mas pode ser melhor colocar todas as variáveis de ambiente necessárias no próprio script de qualquer maneira.
Para editar o crontab do usuário:
Esta deve ser uma leitura informativa - setuid em scripts de shell
Se você executar su com uma
- username
seqüência de argumentos " ", ele criará um shell de login para o usuário fornecer o mesmo ambiente que o usuário. Normalmente, usado para executar rapidamente seu script com seu ambiente doméstico a partir de um login diferente.Experimente a página de manual su:
su -c script_run_as_postgres.sh - postgres
Alternativamente, você pode usar o sudo para permitir que você execute apenas esse comando como postgres sem uma senha. No entanto, é preciso alguma configuração em seu /etc/sudoers.
O método "su -c ..." postado por outros é bom. Para automação, você pode adicionar o script ao crontab do usuário que você precisa executar.
Você também pode usar:
Se o usuário já tiver uma entrada para sudo e você não souber a senha do superusuário, tente o seguinte: Este reinicia o postgres inicializado em /data/my-db/pgsql/9.6/data