Ich verwende git pull
(ohne sudo) jeden Tag auf meiner Maschine, ich habe einen Schlüssel im SSH-Ordner ( cat ~/.ssh/id_rsa.pub
)
Das Problem ist, dass ich nicht anrufen kann sudo git pull
, weil ich eine Fehlermeldung bekomme:
sudo git pull
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Wahrscheinlich liegt ein Problem mit meinem Schlüssel vor.
Ich muss es in meinem externen Skript aufrufen (mit sudo).
Wie kann ich anrufen sudo git pull
? Wie kann ich einen Schlüssel für sudo hinzufügen?
Kurz gesagt: Warum pull
klappt das nicht sudo
?
Antwort1
Wenn Sie etwas ausführen, sudo
ohne einen bestimmten Benutzer anzugeben, führen Sie es als root
Benutzer aus.
Da es so aussieht, als hätten Sie Ihr Repository über SSH geklont git
(eigentlich SSH, nehme ich an), wird nach dem privaten SSH-Schlüssel für den root
Benutzer und nicht nach dem Ihres Benutzers gesucht: /root/.ssh/
vs. /home/your-user/.ssh/
.
Sie können Folgendes versuchen:
Führen Sie Ihr Skript mit folgendem Befehl aus
sudo -E
: Dadurch-E
bleiben Ihre Benutzerumgebungsvariablen erhalten, die bei der Ausführung unter sudo definiert werden (einige SSH-Variablen werden meiner Meinung nach erforderlichSSH_AUTH_SOCK
sein und/oderSSH_AGENT_LAUNCHER
werden benötigt, aber ich weiß nicht viel über die Details).Führen Sie in Ihrem Skript den Git-Befehl „als Benutzer“ statt „als Root“ aus. Um dies zu erreichen, können Sie sich
sudo
wieder auf verlassen :)sudo -E -u $(logname) git pull
Beachten Sie, dass Sie es zweimal verwenden sudo -E
: Einmal, um das Skript aufzurufen, und einmal, um git
innerhalb des Skripts aufzurufen.
Das sollte funktionieren :)
PS: Falls Sie eine feinere Kontrolle darüber benötigen, welche Umgebungsvariablen nach sudo exportiert werden, verwenden Sie --preserve-env=list
die Option statt -E
.
Antwort2
Wenn Sie git mit sudo verwenden, sucht es nach dem Schlüssel in /root/.ssh/
und nicht in /home/yourusername/.ssh/
. Sie müssen ihn nur in ersteres kopieren und es sollte funktionieren.