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'
ousudo command
são melhores. -
Antes de tentar
echo password | sudo
: não perca tempo. A maioria dos programas, incluindosudo
esu
, 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.