Script BASH, su para www-data para comando único

26

Estou trabalhando para automatizar a criação de repositórios do subversion e sites associados, conforme descrito nesta postagem de blog que escrevi . Estou enfrentando problemas ao redor da parte em que su para o usuário www-data para executar o seguinte comando:

svnadmin create /svn/repository

Há uma verificação no início do script que garante que ele esteja sendo executado como root ou sudo, e tudo depois desse comando precisa ser executado como root. Existe uma boa maneira de executar esse comando como www-data e depois voltar para o root para finalizar?

Brendon Dugan
fonte

Respostas:

24

Basta usar su - www-data -c 'svnadmin create /svn/repository'no seu script executado pela raiz. Para que apenas este comando seja executado pelo usuário www-data.


Atualização para futuros espectadores :

Caso receba um "This account is currently not available"erro, considere usar:

su - www-data -s /bin/bash -c 'svnadmin create /svn/repository'

(A valiosa menção do @Petr sobre a -ssinalização para acomodar www-dataa política de não login do usuário)

johnshen64
fonte
1
Sim, parece que eu esqueci uma regra básica de script ... RTFM. Obrigado!
Brendon Dugan
15
Ao tentar isso, recebo o erro #This account is currently not available.
rubo77 21/11
Também recebo esse erro, mas a resposta do futbolsalas15 abaixo funciona bem.
Andrew
18
Use su - www-data -s /bin/bash -c 'your_command'para fazer isso funcionar. O usuário www-data possui shell, /usr/sbin/nologinportanto, sem o -sparâmetro, ele leva à mensagem de erro.
Petr
63

Com 'su' é provável que solicite uma senha, e www-data não tem senha. Eu recomendo o comando sudo:

 sudo -u www-data command

A condição é que seu usuário deve ser root ou configurado no arquivo sudoers

futbolsalas15
fonte
4
Uau, por que essa não é a resposta selecionada? Levei muito tempo para encontrar isso.
Captain Hypertext
3

Use su:

   su [options] [username]

   The options which apply to the su command are:

   -c, --command COMMAND
       Specify a command that will be invoked by the shell using its -c.
MikeyB
fonte
2
Deve-se observar que os comandos su não funcionam com contas que desativaram logons (como www-data). Você terá que usar o sudo.
Frantumn
2

2 Abordagens possíveis :


1) sudocomando:

Na maioria dos casos, você terá acesso ao sudocomando e, portanto, a solução é simplesmente:

sudo -u target_user target_command


2) sucomando (se o sudo não estiver instalado. Ex. alpine-linux images):

su - target_user -c 'target_command'

Caso você receba um erro "Esta conta não está disponível no momento" , o usuário terá uma política de não login (acesso ao shell) em vigor. Se sim, considere usar:

su - target_user -s /bin/bash -c 'target_command'

(Com base no comentário valioso do @Petr sobre a -ssinalização para acomodar www-dataa política de não login do usuário)

Iceman
fonte