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-exportcomo exemplo e/usr/local/bincomo 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'ousudo commandsão melhores. -
Antes de tentar
echo password | sudo: não perca tempo. A maioria dos programas, incluindosudoesu, lerá explicitamente as senhas do seu terminal, não de stdin. No caso desudo, 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.