Übergabe von ssh-Optionen an git clone

103

Ich versuche auszuführen, git cloneohne dass ssh den Schlüssel des Repository-Hosts überprüft. Ich kann es von ssh so machen:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@host

Gibt es eine Möglichkeit, die gleichen ssh-Optionen an den Befehl git clone zu übergeben?

Bearbeiten: Es gibt eine Einschränkung, die ich nicht ändern kann, ~/.ssh/configoder andere Dateien auf diesem Computer.

Daniel
quelle
2
Was Sie versuchen, ist sehr riskant und Sie sollten es wahrscheinlich nicht tun. Das Deaktivieren der Überprüfung, ob die Identität des Remote-SSH-Servers in den meisten Situationen eine schlechte Idee ist. Sie deaktivieren effektiv alle durch die Verwendung von SSH gewonnenen Sicherheitsvorkehrungen und öffnen sich für Man-in-the-Middle-Angriffe.
Aef
1
Eigentlich ist dies oft genau das, was Sie tun möchten. Sie haben ein internes Repo. Wenn es jemandem gelungen ist, das zu fälschen, dann sind Sie in Schwierigkeiten. Es ist überhaupt nicht "sehr riskant". Wie oft überprüfen Sie den Host-Schlüssel außerhalb des Bandes? (Sie sollten).
Graham Nicholls

Antworten:

46

Fügen Sie sie Ihrem hinzu ~/.ssh/config:

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

Der HostEintrag ist das, was Sie in der Befehlszeile angeben, und der HostNameist der wahre Hostname. Sie können identisch sein oder der HostEintrag kann ein Alias ​​sein. Der UserEintrag wird verwendet, wenn Sie ihn nicht user@in der Befehlszeile angeben .

Wenn Sie dies in der Befehlszeile konfigurieren müssen, legen Sie die GIT_SSHUmgebungsvariable so fest, dass sie auf ein Skript mit Ihren Optionen verweist.

Josh Lee
quelle
4
Ich habe vergessen zu sagen, dass ich keine Dateien auf diesem Computer ändern kann. Andernfalls würde Ihre Lösung funktionieren.
Daniel
28
Verwenden Sie die GIT_SSHUmgebungsvariable.
Josh Lee
150

Das kürzlich veröffentlichte Git 2.3 unterstützt eine neue Variable "GIT_SSH_COMMAND", mit der ein Befehl WITH-Parameter definiert werden kann.

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@host

$GIT_SSH_COMMANDhat Vorrang vor $GIT_SSHund wird von der Shell interpretiert, wodurch zusätzliche Argumente aufgenommen werden können.

Boris
quelle
Sollte es vorher eine neue Zeile geben git cloneoder ist der Code korrekt?
Tomáš Zato - Wiedereinsetzung Monica
7
Dies sollte korrekt sein. Ohne den Zeilenumbruch sollte die Variable für den folgenden Befehl festgelegt werden. Wenn Sie eine neue Zeile hinzufügen, müssten Sie die Variable exportieren, dann sollte es auch funktionieren.
Boris
Danke, ich bin seit 2 Tagen dabei!
James Gentes
Booya! Danke dir.
Jasper Blues
Es wird nicht mit Git 1.9 Version funktionieren. Ich glaube, gibt es eine alternative Lösung für Git 1.9
Lazarus
33

Eine weitere Option zur Angabe verschiedener Schlüssel ist git config core.sshCommandgit 2.10 + (Q3 2016).

Dies ist eine Alternative zu der in beschriebenen Umgebungsvariablen Boris ‚s Antwort )

Siehe Commit 3c8ede3 (26. Juni 2016) von Nguyễn Thái Ngọc Duy ( pclouds) .
(Zusammengeführt von Junio ​​C Hamano -gitster - in Commit dc21164 , 19. Juli 2016)

Eine neue Konfigurationsvariable core.sshCommandwurde hinzugefügt, um anzugeben, welchen Wert GIT_SSH_COMMAND pro Repository verwenden soll.

Ähnlich zu $GIT_ASKPASS oder $GIT_PROXY_COMMANDlesen wir auch zuerst aus der Konfigurationsdatei und greifen dann auf zurück $GIT_SSH_COMMAND.

Dies ist nützlich, um verschiedene private Schlüssel auszuwählen, die auf denselben Host abzielen (z. B. Github).

core.sshCommand:

Wenn diese Variable festgelegt ist git fetchund git pushden angegebenen Befehl verwendet, anstatt ssheine Verbindung zu einem Remote-System herzustellen.
Der Befehl hat dieselbe Form wie die GIT_SSH_COMMANDUmgebungsvariable und wird überschrieben, wenn die Umgebungsvariable festgelegt wird.

Es bedeutet das git clone kann:

cd /path/to/my/repo
git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' 
# later on
git clone host:repo.git

Wenn Sie dies für alle Repos anwenden möchten , wie user1300959 in den Kommentaren hinzufügt , würden Sie eine globale Konfiguration verwenden.

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
VonC
quelle
2
Wahrscheinlicher ist, dass Sie noch kein Repo haben, da Sie dies tun git clone- in diesem Fall möchten Sie möglicherweise den Befehl git ssh global konfigurieren:git config --global core.sshCommand ...
iurii
@ user1300959 Guter Punkt, danke. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
Dies ist die beste Antwort.
MikeSchinkel
Im letzten Teil fehlt Ihnen der Apostroph
Luigi Lopez
@LuigiLopez Kannst du die Antwort bearbeiten? Ich werde Ihre Bearbeitung überprüfen.
VonC
21

Hier ist ein kniffliges Beispiel für die Übergabe der ssh-Argumente mithilfe der Variablen GIT_SSH:

$ echo 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH="$PWD/ssh" git clone user@host

Hinweis: Über den Zeilen befinden sich Terminalbefehlszeilen, die Sie in Ihr Terminal einfügen sollten. Es wird eine Datei ssh erstellt , sie ausführbar machen und ausführen.

Wenn Sie die Option für den privaten Schlüssel übergeben möchten, überprüfen Sie bitte, wie Sie git mitteilen, welcher private Schlüssel verwendet werden soll. .

Kenorb
quelle
Nett! Frage: Beides $*und "$@"scheinen zu funktionieren. Normalerweise benutze ich "$@", da der andere veraltet zu sein scheint. Gibt es einen Grund, $*in diesem Fall zu bevorzugen ?
mh8020
16

Konfiguration auf Repository-Ebene, ohne die Einstellungen auf Systemebene zu beeinflussen

Ich konsolidiere die bereits verfügbaren Antworten und wähle die folgenden Schritte. Dadurch wird sichergestellt, dass sich die Konfigurationsänderungen nicht auf Computerebene auswirken, sondern nur auf das Repository, an dem gearbeitet wird. Dies ist in meinem Fall erforderlich, da mein Skript auf einem gemeinsam genutzten Bamboo-Agenten ausgeführt werden muss.

1.Klonen Sie das Repository nach dem GIT_SSH_COMMANDAnsatz.

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone ssh://url

2. Navigieren Sie nach dem Klonen in das Repository-Verzeichnis.

cd repo-dir

3.Stellen Sie die core.sshCommandKonfiguration so ein, dass alle zukünftigen Aufrufe wie gewohnt nur mit Git-Befehlen ausgeführt werden können, wobei jedoch die bereitgestellten Git-Optionen intern verwendet werden.

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
Pavan Kumar
quelle
1
Gute Verwendung von core.sshCommand, die ich oben erwähnt habe. Upvoted.
VonC
5

Ich denke, dass Update git auf eine Version> = 2.3 und Verwendung GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@hostdie Wettoption ist, aber wenn es nicht möglich ist, gab @ josh-lee eine gute Option, aber bitte aktualisieren Sie Ihre Antwort, indem Sie die ssh-Konfigurationsdatei einrücken.

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
Jonathan Beber
quelle
0

Dieses Problem wurde behoben, indem die folgenden Schritte in der Fenstermaschine ausgeführt wurden: -

  • Erstellen Sie die Konfigurationsdatei im Ordner C: \ Users \ username.ssh.

  • Fügen Sie die folgende Zeile zu einer Konfigurationsdatei hinzu.

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • dann versuchen Sie es erneut.

Ajay Kumar
quelle