Die einfachste Lösung ist, etwas wie gitlab einzurichten, die eine Webschnittstelle, verschiedene Arten von Zugriffskontrolle und alle Arten von anderen Schnickschnack bietet.
Wenn Sie wirklich Ihren eigenen Rolle wollen: mit directions in the Git book
Start für die Einrichtung Ihres Servers Zugriff auf einen gemeinsamen Benutzer über ssh zu ermöglichen.
Diese Anweisungen erhalten Sie ein gemeinsames git
-Konto, auf das jeder Zugriff hat, und würde jemand aus jedem Repository Push/Pull. Wir können eine einfache Autorisierungsschicht implementieren, die Benutzer auf Repositories in bestimmten Verzeichnissen beschränkt.
Beginnen Sie mit einem kleinen Wrapper-Skript:
#!/bin/sh
repo_prefix=$1
eval set -- $SSH_ORIGINAL_COMMAND
case "$1" in
(git-receive-pack|git-upload-pack|git-upload-archive)
# prevent attempts at using dir/../path to escape
# repository directory
case "$2" in
(*..*) echo "Invalid repository name." >&2
exit 1
;;
esac
repo_path="$repo_prefix/$2"
eval exec $1 $repo_path
;;
(*) echo "Unsupported command" >&2
exit 1
;;
esac
Dies wird ein Präfix Pfad, sofern als Befehlszeilenargument, um alle Repository-Pfaden voranstellen. Jetzt müssen wir dafür sorgen, dass dieser Wrapper Git-Operationen abfängt.
Um dies zu verwenden, müssen Sie die öffentlichen Schlüssel ändern, die Sie der git
Benutzer authorized_keys
Datei hinzufügen. Wenn Sie die Anweisungen in dem Git Buch gefolgt, die authorized_keys
Datei eine oder mehrere öffentliche Schlüssel darin haben, wie folgt aus:
ssh-rsa AAAA...== some comment
Für jeden öffentlichen Schlüssel, müssen Sie eine Konfigurationsoption hinzufügen, dass die verursachen Wrapper-Skript, das anstelle des ursprünglichen Befehls aufgerufen wird. Von der sshd
Manpage:
Jede Zeile der Datei enthält einen Schlüssel (Leerzeilen und Zeilen mit einem ‚#‘ beginnen, werden als Kommentare ignoriert). Öffentliche Schlüssel für Protokoll 1 bestehen aus der folgenden durch Leerzeichen getrennten Felder: Optionen, Bits, Exponent, Modul, Kommentar. Der öffentliche Schlüssel des Protokolls 2 besteht aus: Optionen, Schlüsseltyp, base64-codierter Schlüssel, Kommentar. Das Optionsfeld ist optional ...
Und etwas weiter unten:
Die folgende Option Spezifikationen unterstützt werden (beachten Sie, dass Option Schlüsselwörter Groß- und Kleinschreibung): [...]
command = "command"
Gibt an, dass der Befehl ausgeführt wird, wenn dieser Schlüssel für die Authentifizierung verwendet wird. Der vom Benutzer angegebene Befehl (falls vorhanden) wird ignoriert ... Der ursprünglich vom Client bereitgestellte Befehl ist in der Umgebungsvariablen SSH_ORIGINAL_COMMAND verfügbar.
Vor diesem Hintergrund haben wir unsere authorized_keys
Datei ändern etwas wie folgt aussehen:
command="/usr/bin/git-wrapper.sh username" ssh-rsa AAAA...===
Das bedeutet, dass, wenn jemand mit dem entsprechenden privaten Schlüssel verbindet, sshd
git-wrapper.sh username
laufen wird, unser git-wrapper.sh
Skript verursacht Repository-Pfaden mit der Zeichenfolge username
voranzustellen, um sicherzustellen, dass git
nur Repositorys im angegebenen Verzeichnis anzeigt.Genauer gesagt, wenn Sie laufen:
git push origin master
Und unter der Annahme, dass origin
Punkte project.git
auf dem git-Server, dann git
den Befehl auf dem Remote-Server ausgeführt wird versuchen:
git-receive-pack project.git
Unser Wrapper-Skript wird abfangen, dass und verwandeln es in:
git-receive-pack $1/project.git
So zum Beispiel, wenn unsere git git
Benutzer zu Hause d irectory hat keine Repositories:
git$ ls
Und unsere authorized_keys
Datei wie folgt aussieht:
git$ cat .ssh/authorized_keys
command="/usr/bin/git-wrapper.sh alice" ssh-rsa ... [email protected]
command="/usr/bin/git-wrapper.sh bob" ssh-rsa ... [email protected]
Dann, wenn alice
dies tut:
alice$ git remote add origin [email protected]:project.git
git push origin master
Sie sehen:
fatal: 'alice/project.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Wenn wir die Ziel-Repository zu erstellen:
git$ mkdir alice
git$ git init --bare alice/project.git
Dann kann sie drücken:
alice$ git push origin master
[...]
To [email protected]:project.git
* [new branch] master -> master
Aber wenn Bob versuchen ist, dass Repository zu klonen:
bob$ git clone [email protected]:project.git
Es wäre fehl:
fatal: 'bob/project.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Ev en, wenn er etwas versucht, hinterhältig:
bob$ git clone [email protected]:../alice/project.git
Invalid repository name
fatal: Could not read from remote repository.
Und das in einem etwas ausführlichen Kurz gesagt, ist, wie Sie die Berechtigung für Ihre Git Repository-Server zugreifen können. Beachten Sie, dass dies alles nur zu Demonstrationszwecken getan wurde; Sie möchten ein wesentlich robusteres Skript in einer Produktionsumgebung.
Ihr aktuelles Szenario verwendet integrierte Unix-Funktionen, um Benutzer zu isolieren, die Sie nicht verwenden möchten. Dies bedeutet, dass Sie ähnliche Funktionen zum Isolieren von Benutzern und Hinzufügen des Codes zu dem, was Sie jetzt haben, benötigen. Dies könnte komplexer als erwartet sein. Was ist der Grund, warum Sie keine Unix-Benutzer Logins wollen? –
Der Hauptgrund für dieses Setup ist, dass ich sehen möchte, wie es geht, um mehr über Git und UNIX zu erfahren. Z.B. Github und Bitbucket verwenden diesen Ansatz, also wollte ich nur verstehen, wie das eigentlich funktioniert und wenn es nett scheint, dachte ich, ich könnte es benutzen. – lklun