Executa um script de shell como um usuário diferente

32

O que é uma boa maneira de executar um script de shell como um usuário diferente. Estou usando o Debian etch e sei qual usuário eu quero passar.

Se eu estivesse fazendo isso manualmente, faria:

su postgres
./backup_db.sh /tmp/test
exit

Como eu quero automatizar o processo, preciso de uma maneira de executar backup_db.sh como postgres (herdando o ambiente, etc)

Obrigado!

    
por Wadih M. 23.07.2009 / 04:43

8 respostas

54

Para executar seu script como outro usuário como um comando, execute:

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

Eu recomendo sempre usar caminhos completos em scripts como este - você não pode garantir sempre que você estará no diretório correto quando você su (talvez alguém tenha mudado 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.

    
por 23.07.2009 / 05:00
15

Se o usuário alvo a ser executado tiver nologin shelll definido, você poderá usar a opção -s para especificar o shell:

/bin/su -s /bin/bash -c '/path/to/your/script' testuser

Veja a seguinte pergunta: execute o script como usuário que possui shell nologin

    
por 13.04.2017 / 14:14
8

Para automatizar isso em um agendamento, você pode colocá-lo no crontab do usuário. As tarefas do Cron não obterão o ambiente completo, mas talvez seja melhor colocar todas as variáveis env necessárias no próprio script.

Para editar o crontab do usuário:

sudo crontab -u postgres -e
    
por 23.07.2009 / 12:46
2

Esta deve ser uma leitura informativa - setuid em scripts de shell

Se você executar su com uma sequência de argumentos " - username ", ele fará 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.

    
por 23.07.2009 / 04:47
1

Experimente a su manpage:

su -c script_run_as_postgres.sh - postgres

Alernately, você poderia usar o sudo para permitir que você execute apenas esse comman como postgres sem uma senha. É preciso alguma configuração em seu / etc / sudoers, no entanto.

    
por 23.07.2009 / 04:58
1

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 para executar como.

    
por 23.07.2009 / 05:19
0

Se o usuário já possui uma entrada para o sudo e você não sabe a senha do superusuário, então você pode tentar o seguinte: Este reinicia o postgres inicializado em /data/my-db/pgsql/9.6/data

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"
    
por 01.05.2017 / 19:36
-1

Você também pode usar:

sudo -u postgres script_run_as_postgres.sh

    
por 15.04.2017 / 01:30