Executar parte de um script bash como um usuário diferente

Respostas:

42

Use o comando sudo no script.

Na forma:

sudo -u username command

o comando sudo executa o comando como o usuário nome de usuário .

Se o script estiver sendo executado como root, não acho que ele solicitará uma senha. Caso contrário, este artigo discute como usar o sudo com senha em uma linha de comando? , e este artigo descreve como usar o sudo sem senha?

pcapademic
fonte
5
Isso é fácil e agradável, mas existe uma maneira de fazer isso para um grupo de comandos em vez de um de cada vez?
Andrew
escrever um script bash, torná-lo executável chmod +x script.she depois é sósudo -u username script.sh
Nicu
@ Andrew Eu estava pensando isso mesmo e o seguinte trabalhou para mim: sudo-u ic sh -c 'cmd1 && cmd2'
Karussell
Também incluem a iopção se você deseja adquirir o ambiente do usuário
NeoDev
6

Esta resposta é boa, mas o aviso de falha no servidor é um pouco perigoso - permitiria que qualquer um executasse algo como root! Estou postando aqui porque não consigo formatar o comentário.

Eu recomendaria o uso do visudo para fornecer as permissões necessárias da maneira mais precisa possível. Digite visudoe adicione uma linha como:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

Se você precisar executar a mesma coisa em muitos hosts, poderá abri-lo com:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

Mas eu ** não * usaria:

username ALL=(ALL) NOPASSWD: ALL

ou nome de usuário hostname = ALL

A página de manual do sudoer tem muitos detalhes sangrentos

DaveParillo
fonte
Funcionaria para um comando disponível apenas para um usuário específico?
Manish Mathai
Você pode especificar que apenas usuários específicos possam executar o comando (nos exemplos acima, substitua usernamepelo nome de usuário que deve poder executar o comando). Se o executável que você deseja executar for executável apenas por um usuário em particular, tudo bem - basta passar esse nome de usuário na sudo -u username commandlinelinha do script.
quer
@Manish. Sim. O que o arquivo sudoers diz que é "Permitir que este nome de usuário neste host para command1 prazo sem ter que fornecer uma senha.
DaveParillo
6

# I = gosto:

#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# ./corre

1: root
2: nobody
3: root
AX Labs
fonte
10
Você poderia adicionar algum texto explicativo?
Kazark 28/03
4

Para sonarqube:

sudo -u sonar /usr/bin/sonar start

onde sonaré o nome do usuário usado para executar o comando/usr/bin/sonar start

burtsevyg
fonte
2

não tem tanta certeza disso, mas se você deseja que APENAS o final desse script seja executado como um usuário diferente, você pode adicionar su someuserantes do final do script.

Estou esquecendo de algo?

Espero que ajude,

Saudações

dag729
fonte
11
Eu acho que essa é a resposta mais apropriada, com todas as outras respostas sugerindo o sudo, que geralmente não é instalado por padrão em algumas instalações mínimas do Linux.
Tim
1

Dessa forma, o final de um script será executado por um usuário diferente (root). Observe as chamadas $[LINENO+2]e exit $?. Isso é necessário para que o final do script seja executado apenas uma vez e para preservar o código de saída da sudochamada.

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
dparalen
fonte