Como executo um script de pós-confirmação do SVN como root?

2

Eu tenho um servidor de repositório SVN que é executado sob o usuário repository e quero executar um script após cada ação de pós-confirmação.

Eu, portanto, escrevi um script de shell que é executado a partir do hook após cada commit, e ele precisa ser executado sob root . É por isso que usei sudo no script, mas não funcionou.

Existe alguma maneira de executar o script como root ?

sudo su
echo "password"
svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/
chmod -R 777 /home/memarexweb/public_html/devel/
    
por Loqman 21.09.2011 / 13:58

1 resposta

3

Edite seu arquivo sudoers para permitir a execução de determinados comandos sem uma senha.

É melhor dividir seu script de pós-commit em duas partes, uma das quais será executada em sudo .

  • /etc/sudoers :

    loqman    ALL=(root) NOPASSWD: /usr/local/bin/svn-postcommit-export
    
  • Seu gancho de post-commit:

    #!/bin/sh
    sudo /usr/local/bin/svn-postcommit-export
    
  • /usr/local/bin/svn-postcommit-export :

    #!/bin/sh
    svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/
    chmod -R 777 /home/memarexweb/public_html/devel/
    

    (Você pode escolher qualquer nome e colocar o script em qualquer lugar; eu apenas sugeri svn-postcommit-export como exemplo e /usr/local/bin como um local comum.)

Agora, por que diabos isso não funcionou

Você pode estar pensando que tudo em um script está sendo executado exatamente como se inserido por você com o teclado. Este não é o caso. O interpretador ( sh ) executa cada comando separadamente, espera que ele termine e execute o próximo.

Também existem regras sobre como a entrada e a saída são tratadas - os programas lêem suas entradas de 'stdin' - não do seu script - e escrevem a saída para 'stdout' 0 . Quando você executar seu script em uma janela de terminal 1 , seu 'stdin' e 'stdout' serão anexados ao seu teclado e à janela do terminal, e isso será herdado por todos os comandos: su < sup> 2 não sabe como é o resto do seu script; em vez disso, espera que os comandos sejam inseridos a partir de 'stdin' - neste caso, o seu teclado. Da mesma forma, echo "password" produzirá a senha para 'stdout' (sua janela de terminal), não para sudo .

Você pode anexar uma saída do processo à entrada de outra pessoa usando pipes; por exemplo:

echo "svn export ..." | su
  • Esta é uma maneira ruim de executar comandos por su ; usado aqui apenas como um exemplo. Para uso normal, su -c 'command' ou sudo command são melhores.

  • Antes de tentar echo password | sudo : não perca tempo. A maioria dos programas, incluindo sudo e su , lerá explicitamente as senhas do seu terminal, não de stdin. No caso de sudo , você pode desativar o requisito de senha editando / etc / sudoers como acima.

0 'stderr' omitido por simplicidade, pois funciona da mesma forma que 'stdout' na maioria dos casos.

1 Quando o script é executado por post-commit de svn , ele receberá /dev/null como stdin (e provavelmente stdout).

2 Simplificado. Na realidade, su em si não lê comandos, ele inicia um processo de shell (por exemplo, sh ou bash ) que faz o trabalho.

    
por 21.09.2011 / 14:23