Executar parte de um script bash como um usuário diferente
33
Existe uma maneira de fazer parte de um script ser executado como um usuário diferente (não raiz)? Se ajudar, a parte a ser executada como um usuário diferente ocorre no final do script
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?
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:
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
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.
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
Respostas:
Use o comando sudo no script.
Na forma:
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?
fonte
chmod +x script.sh
e depois é sósudo -u username script.sh
i
opção se você deseja adquirir o ambiente do usuárioEsta 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
visudo
e adicione uma linha como:Se você precisar executar a mesma coisa em muitos hosts, poderá abri-lo com:
Mas eu ** não * usaria:
ou nome de usuário hostname = ALL
A página de manual do sudoer tem muitos detalhes sangrentos
fonte
username
pelo 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 nasudo -u username commandline
linha do script.# I = gosto:
# ./corre
fonte
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
fonte
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 someuser
antes do final do script.Estou esquecendo de algo?
Espero que ajude,
Saudações
fonte
Dessa forma, o final de um script será executado por um usuário diferente (root). Observe as chamadas
$[LINENO+2]
eexit $?
. Isso é necessário para que o final do script seja executado apenas uma vez e para preservar o código de saída dasudo
chamada.fonte