%20mit%20den%20SSH-Schl%C3%BCsseln%20eines%20normalen%20Benutzers%2C%20aber%20mit%20Sudo-Dateiberechtigungen.png)
Ich kann ein Projekt wie folgt klonen:
$ git clone [email protected]:root/myproject.git ~/bla
Aber jetzt möchte ich es klonen /var/www
. Also versuche ich
$ git clone [email protected]:root/myproject.git ~/var/www
Aber leider habe ich keine Schreibberechtigung /var/www
. Sudo kommt zur Rettung!
$ sudo git clone [email protected]:root/myproject.git ~/var/www
Cloning into 'www'...
[email protected]'s password:
Was soll das? Ich werde nach einem Passwort gefragt? Wir sollten keine beschissenen Passwörter brauchen!
Ich sende offensichtlich die SSH-Schlüssel des Root-Benutzers mit der Anfrage, und da sie nicht in das Git-Repository importiert wurden, wird mir die Anfrage verweigert. In der Vergangenheit bestand meine Lösung darin, die Berechtigungen des Ordners vorübergehend zu ändern oder ihn zuerst an einen Ort zu klonen, an dem ich Zugriff habe, und ihn dann mit sudo zu verschieben, aber ich möchte lernen, wie das richtig geht.
Also ... wie verwende ich Git mit den SSH-Schlüsseln meines normalen Benutzers, aber mit Sudo-Dateiberechtigungen?
Antwort1
Wenn Sie einen ssh
Agenten ausführen, gehen Sie wie folgt vor:
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" git clone...
Dies weist den git
von root
(oder dem ssh
von diesem Befehl gestarteten Befehl git
) grundsätzlich an, Ihren Agenten zu verwenden ssh
(wie eine Verbindung zu ihm hergestellt werden kann, was root
möglich sein sollte, da er dazu alle Rechte hat).
Wenn Sie keinen laufenden SSH-Agenten haben, können Sie vorab einen mit folgendem Befehl starten:
eval "$(ssh-agent)"
(und fügen Sie bei Bedarf mit Schlüssel hinzu ssh-add
).
Alternativ können Sie
sudo -E git clone...
BestehenjedenUmgebungsvariable über sudo
, nicht nur $SSH_AUTH_SOCK
.
Ich würdenichthabe @NgOon-Ees Vorschlag im Kommentar $SSH_AUTH_SOCK
zur env_keep
Liste hinzugefügt. Im Allgemeinen möchten Sie root
die Umgebung von nicht verunreinigen, da dies der Benutzer ist, als der Sie Dienste starten. Wenn Sie beispielsweise sudo sshd
einen Dienst starten, würden sshd
alle ssh
über diesen Dienst gestarteten Sitzungen Ihre erben $SSH_AUTH_SOCK
und die Umgebung der Benutzer mit etwas verunreinigen, das sie nicht verwenden können und sollten. Selbst für andere Zielbenutzer als root
wäre die Weitergabe dieser Variable nicht sinnvoll, da der Zielbenutzer diesen Authentifizierungsagenten nicht verwenden könnte.
Damit ist nur die Schlüsselauthentifizierung angesprochen. Wenn Sie root
Ihre Einstellungen auch in Ihrem übernehmen möchten, können Sie das nicht mit Umgebungsvariablen ~/.ssh/config
tun , aber Sie können das mit Umgebungsvariablen tun. Zum Beispiel können Sie eine Funktion wie folgt definieren:ssh
git
sugit
sugit() {
sudo "GIT_SSH_COMMAND=
exec ssh -o IdentityAgent='$SSH_AUTH_SOCK' \
-o User=$LOGNAME \
-F ~$LOGNAME/.ssh/config" git "$@"
}
Das heißt, weisen Sie an, git
einen ssh
Befehl zu verwenden, der Ihre SSH-Konfigurationsdatei, Ihren Agenten und Ihren Benutzernamen anstelle von Root verwendet.
Oder noch besser: Geben Sie an, git
dass die Ausführung ssh
als ursprünglicher Benutzer erfolgen soll:
sugit() {
sudo "GIT_SSH_COMMAND=
exec sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}
Antwort2
Datei- (oder Socket-)Berechtigungen können kompliziert sein, wenn die Schlüsseldateien (oder der Socket) vom Benutzer, der sie sudo
ausführt, nicht gelesen werden können. Dies gilt insbesondere, root
wenn sich die Dateien auf einer Netzwerkfreigabe befinden, root
für die keine Berechtigung vorliegt, oder wenn das Home-Verzeichnis verschlüsselt ist, was root
den Zugriff ebenfalls verweigern kann.
Auf Unix-Systemen, die erweiterte ACLs unterstützen, können Sie diese auch verwenden. In diesem Fall können Sie zusätzlich zu den üblichen Basisberechtigungen weiteren Schreibzugriff gewähren:
$ sudo chown apache:www /var/www/html
$ sudo chmod g+s /var/www/html
$ sudo setfacl -m g:webedit:rwx /var/www/html
$ groups
jdoe webedit
$ ls -ld /var/www/html
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 /var/www/html
$
aber die webedit
Gruppe hat Berechtigungen dank dersetfacl
$ git clone ~/repo /var/www/html
Cloning into '/var/www/html'...
done.
$ ls -al /var/www/html
total 0
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 .
drwxr-xr-x 4 root root 31 Oct 19 20:39 ..
drwxrwsr-x 3 jdoe www 14 Nov 21 19:42 a
drwxrwsr-x 8 jdoe www 152 Nov 21 19:42 .git
$
Es gibt jedoch verschiedene Fallstricke bei erweiterten ACLs. Überprüfen Sie beispielsweise, wie Ihre Backup-Software damit umgeht usw.