2009-12-23 6 views
9

Ich versuche einen git post-receive-Hook einzurichten, so dass, wenn ein Commit empfangen wird, ein weiterer Klon des Repository auf dem Rechner aktualisiert wird (dh tut eine git pull origin master). Ich verwende Gitosis, um das Repository zu bedienen, und als solches glaube ich, dass ein Post-Receive-Hook als gitosis Benutzer ausgeführt wird, während das Repository, das ich auf einem Empfang aktualisieren möchte, im Besitz von www-data ist. Wie soll ich das machen?Git Post-Receive-Hook, um einen lokalen Klon zu aktualisieren, der einem anderen Benutzer gehört

Ich habe von setuid Skripten gehört, aber ich bin mir nicht sicher, ob dies ein Sicherheitsrisiko sein könnte? Und wenn es kein Sicherheitsrisiko ist, wie würde ich das tun? Ich vermute, ich würde etwas tun, wie das Skript von www-data Besitz machen und es World-Executable machen und das setuid Bit aktivieren? Ich denke, dieses Skript wäre ziemlich harmlos, da es nur das Repository aktualisiert, aber ich will sicher sein. Vielen Dank!

Edit: Gibt es eine Möglichkeit, dies mit sudo zu tun? Wäre das sicherer als setuid? Ich meine, ich glaube nicht, dass es viel Problem mit setuid gibt, wenn der Benutzer nicht root ist, aber trotzdem scheint es, als müsste ich durch ein paar Ringe springen, um ein setuid Skript zu bekommen.

Zweite Bearbeitung: Es scheint wie ich könnte in der Lage sein, dies mit einigen /etc/sudoers Magie und sudo -u zu tun. Vielleicht hätte ich das stattdessen auf ServerFault veröffentlichen sollen, aber zumindest habe ich etwas von diesem Unterfangen gelernt.

Antwort

14

IMHO Dies sollte auf Serverfault sein, aber hier ist die Antwort trotzdem;

Anzahl:

gitosis ALL=(www-data) NOPASSWD: /path/to/git 

/etc/sudoers

und den Befehl als sudo -u www-data <whatever the command is>

+0

Ja, ich irgendwie dachte, es war besser geeignet für ServerFault nach der Einlieferung, aber ich sah in der Regel git Sachen hier. Sind Sie sicher, dass diese Zeile Gitosis als www-Daten ausführen lässt? Ich bin mir nicht sicher, ob es so ist.Im Moment versuche ich etwas in/etc/suiders zu tun: gitosis ALL = (www-data)/Pfad/zu/Skript und das Skript macht den Befehl git pull. – Ibrahim

+0

Übrigens, wie bewegt man eine Frage wie diese zu serverfault? – Ibrahim

+0

Die Züge werden von Moderatoren durchgeführt. – Kimvais

3

Hinweis ausführen, die ich git Benutzername sind mit, so, wenn Sie mit gitosis oder irgendein anderer Benutzername, füllen Sie einfach Ihre!

in der Konsole mit root Benutzer diesen Befehl ausführen:

visudo 

Die "vi" Editor geöffnet wird. Fügen Sie diese Zeilen:

Defaults:git !authenticate 
git ALL=(www-data) ALL 

In Folge die Datei (die in "vi" Editor geöffnet durch den Aufruf "visudo") sollte wie folgt aussehen:

# /etc/sudoers 
# 
# This file MUST be edited with the 'visudo' command as root. 
# 
# See the man page for details on how to write a sudoers file. 
# 

Defaults env_reset 
Defaults:git !authenticate 

# Host alias specification 

# User alias specification 

# Cmnd alias specification 

# User privilege specification 
root ALL=(ALL) ALL 
git ALL=(www-data) ALL 


# Allow members of group sudo to execute any command 
# (Note that later entries override this, so you might need to move 
# it further down) 
%sudo ALL=(ALL) ALL 
# 
#includedir /etc/sudoers.d 

Dann STRG + O die sparen Datei, drücken Sie dann die Eingabetaste, um den Dateinamen zu akzeptieren (bla bla bla), und drücken Sie dann STRG + X, um den "vi" -Editor zu schließen.

Voila! Jetzt git Benutzer kann Befehle als www-data Benutzer ausführen:

sudo -u www-data git pull origin master