it-swarm-pt.tech

Execute um script do Shell como um usuário diferente

Qual é uma boa maneira de executar um script do Shell como um usuário diferente. Estou usando o Debian etch e sei qual usuário quero personificar.

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 o backup_db.sh como postgres (herdando o ambiente, etc.)

Obrigado!

44
Wadih M.

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 o uso de caminhos completos em scripts como este - você nem sempre pode garantir que estará no diretório certo quando usar o su (talvez alguém tenha alterado o nome de usuário, quem sabe). 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.

69
baumgart

Se o usuário de destino a executar 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 o shell nologin

23
Basil A

Para automatizar isso em uma programação, você pode colocá-lo no crontab do usuário. Porém, os trabalhos do Cron não terão o ambiente completo, mas pode ser melhor colocar todas as variáveis ​​de env que você precisa no próprio script.

Para editar o crontab do usuário:

Sudo crontab -u postgres -e
9
Kyle Brandt

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

Se você executar su com um "- username ", ele criará um Shell de login para o usuário fornecer o mesmo ambiente que o usuário. Geralmente, é usado para executar rapidamente seu script com o ambiente doméstico a partir de um login diferente.

3
nik

Experimente a página de manual su:

su -c script_run_as_postgres.sh - postgres

Por alguma razão, você pode usar o Sudo para permitir que você execute exatamente esse comando como postgres sem uma senha. Porém, é preciso alguma configuração no seu/etc/sudoers.

2
pjz

O método "su -c ..." publicado por outras pessoas é bom. Para automação, você pode adicionar o script ao crontab do usuário para o qual precisa executar.

2
Geoff Fritz

Se o usuário já tiver uma entrada no Sudo e você não souber a senha do superusuário, tente o seguinte: Este reinicia os postgres inicializados 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"
1
smishra

Você também pode usar:

Sudo -u postgres script_run_as_postgres.sh

0
Xandersoft