2011-09-21 41 views
5

Ho un server repository SVN che gira sotto l'utente del repository. Voglio eseguire uno script dopo ogni azione post-commit. Ho scritto uno script di shell che viene eseguito da un hook dopo ogni commit. Deve essere eseguito come root. Questo è il motivo per cui ho usato sudo nella sceneggiatura, ma non ha funzionato. Esiste un modo per eseguire lo script come root?Come si esegue uno script di shell come root (sudo)?

sudo su 
echo "password" 
svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/ 
chmod -R 777 /home/memarexweb/public_html/devel/ 
+0

meglio per spostare la domanda a superuser.com – Yousf

+0

una possibilità potrebbe essere quella di disabilitare la password, ma non è realmente una buona soluzione. Http: // maestric .com/doc/unix/ubuntu_sudo_without_password – FUD

+0

Potrebbe non essere una buona idea creare i file in modalità 777, che saranno scrivibili in tutto il mondo. – eckes

risposta

6

ero alla ricerca intorno e pensa che questa soluzione utile:

Modificare il file sudoers per consentire l'esecuzione di alcuni comandi senza una password.

È meglio dividere lo script post-commit in due parti, una delle quali verrà eseguita tramite sudo.

  • voce nel /etc/sudoers:

    loqman ALL=(root) NOPASSWD: /usr/local/bin/svn-postcommit-export 
    
  • Il tuo post-commit hook:

    #!/bin/sh 
    sudo /usr/local/bin/svn-postcommit-export 
    
  • Script /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/ 
    

    (Yo puoi scegliere qualsiasi nome e mettere lo script ovunque; Ho solo suggerito svn-postcommit-export come un esempio, e /usr/local/bin come un luogo comune)

0

Questo non funziona, la cosa migliore è quello di mettere solo la richiede comandi nella shell script. E poi setuid script stesso, in questo modo (usando root):

chmod u+s myscript.sh 

In questo modo, l'esecuzione di questo script vi darà i permessi del proprietario dello script (root).

MODIFICA: come accennato nei commenti, stuid non è consentito per lo script di shell. Questa soluzione funziona solo per i file eseguibili.

+0

L'impostazione dei flag 'suid' sullo script di shell è ** DANGEROUS ** all'estensione, che Linux lo ignorerà. Vedi l'articolo di Wikipedia collegato nella risposta per i dettagli. –

+0

scusa A.H., non ti ho capito appieno. Vuoi dire che Linux ignorerà setuid? E perché è PERICOLOSO? – Yousf

+2

Linux ignorerà 'suid' ** sugli script **, gli eseguibili sono ok. Molti derivati ​​UNIX lo fanno in questi giorni. Alcuni motivi sono [spiegati qui] (http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html) –

1

Nell'ultima riga del tuo script, stai cambiando la modalità di /home/memarexweb/public_html/devel/ in 777, quindi il "repository" utente dovrebbe essere in grado di copiare i file in quella directory senza privilegi di root. In tal caso, non è necessario utilizzare sudo o su.

Tuttavia, la modifica delle autorizzazioni della directory su 777 è pericolosa, in quanto consente a chiunque di scrivere in quella directory e di creare o eliminare file. Sarebbe meglio cambiare la proprietà della directory nel "repository" dell'utente e cambiare la modalità in 755. Se ciò non è fattibile, potresti essere in grado di aggiungere un ACL POSIX che permetta a "repository" di scrivere nella directory. Puoi Google "POSIX ACL" per ulteriori informazioni o leggere le pagine man per getfacl e setfacl.

3
sudo su 

avvia un nuovo processo, di proprietà dell'utente root. Dopo che il processo è terminato o interrotto, viene eseguita la riga successiva, nuovamente come utente che esegue lo script.

Una possibile soluzione è eseguire l'intero script usando sudo, e dare a tale uso i diritti sudo per eseguire gli script. Per fare ciò, è necessario modificare il file /etc/sudoers usando il comando visudo.

Problemi correlati