Passaggio delle opzioni ssh a git clone


103

Sto provando a eseguire git clonesenza ssh che controlla la chiave dell'host del repository. Posso farlo da ssh in questo modo:

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

C'è un modo per passare le stesse opzioni ssh al comando git clone?

Modifica: c'è una restrizione che non posso modificare ~/.ssh/configo altri file su quella macchina.


2
Quello che cerchi di fare è molto rischioso e probabilmente non dovresti farlo. Disabilitare la verifica se l'identità del server SSH remoto è una cattiva idea nella maggior parte delle situazioni. Disattivi efficacemente tutta la sicurezza ottenuta utilizzando SSH e ti apri agli attacchi man-in-the-middle.
aef

1
In realtà, questo è spesso esattamente quello che vuoi fare. Hai un repo interno. Se qualcuno è riuscito a falsificarlo, allora sei nei guai. Non è affatto "molto rischioso". In effetti, quanto spesso esegui un controllo fuori banda della chiave host? (Dovresti).
Graham Nicholls

Risposte:


47

Aggiungili al tuo ~/.ssh/config:

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

La Hostvoce è ciò che specificherai sulla riga di comando e HostNameil vero nome host. Possono essere uguali o la Hostvoce può essere un alias. La Uservoce viene utilizzata se non viene specificata user@nella riga di comando.

Se è necessario configurarlo sulla riga di comando, impostare la GIT_SSHvariabile di ambiente in modo che punti a uno script con le proprie opzioni al suo interno.


4
Ho dimenticato di dire che non posso modificare alcun file su quella macchina. Altrimenti, sì, la tua soluzione funzionerebbe.
Daniel

28
Usa la GIT_SSHvariabile d'ambiente.
Josh Lee

152

Il git 2.3 rilasciato di recente supporta una nuova variabile "GIT_SSH_COMMAND" che può essere utilizzata per definire un comando CON parametri.

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

$GIT_SSH_COMMANDha la precedenza su $GIT_SSHe viene interpretato dalla shell, che consente di includere argomenti aggiuntivi.


Dovrebbe esserci una nuova riga prima git cloneo il codice è corretto?
Tomáš Zato - Ripristina Monica il

7
Questo dovrebbe essere corretto, senza la nuova riga la variabile dovrebbe essere impostata per il seguente comando. Se aggiungi una nuova riga, dovresti esportare la variabile, quindi dovrebbe funzionare anche.
Boris

Grazie, sono stato bloccato su questo per 2 giorni!
James Gentes,

Booya! Grazie.
Jasper Blues

non funzionerà con la versione git 1.9 credo, esiste una soluzione alternativa per git 1.9
lazarus

33

Un'altra opzione fatta per specificare chiavi diverse è git config core.sshCommandcon git 2.10 + (Q3 2016).

Questa è un'alternativa alla variabile ambiente descritto Boris s' risposta )

Vedere commit 3c8ede3 (26 giugno 2016) di Nguyễn Thái Ngọc Duy ( pclouds) .
(Fuso da Junio ​​C Hamano - gitster- in commit dc21164 , 19 luglio 2016)

È core.sshCommandstata aggiunta una nuova variabile di configurazione per specificare quale valore per GIT_SSH_COMMAND utilizzare per repository.

Simile a $GIT_ASKPASSo $GIT_PROXY_COMMAND, leggiamo prima dal file di configurazione e poi torniamo a $GIT_SSH_COMMAND.

Questo è utile per selezionare diverse chiavi private mirate allo stesso host (es. Github)

core.sshCommand:

Se questa variabile è impostata, git fetche git pushutilizzerà il comando specificato invece di sshquando devono connettersi a un sistema remoto.
Il comando ha la stessa forma della GIT_SSH_COMMANDvariabile di ambiente e viene sovrascritto quando la variabile di ambiente è impostata.

Significa che git clonepuò essere:

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

Se si desidera applicarlo a tutti i repository , come aggiunge user1300959 nei commenti , si utilizzerà una configurazione globale.

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

2
È più probabile che tu non abbia ancora un repository, dal momento che lo hai git clone- in questo caso potresti voler configurare il comando git ssh a livello globale:git config --global core.sshCommand ...
iurii

@ user1300959 Buon punto, grazie. Ho incluso il tuo commento nella risposta per una maggiore visibilità.
VonC

Questa è la migliore risposta.
MikeSchinkel

Nell'ultima parte manca apostrofo
Luigi Lopez

@LuigiLopez Puoi modificare la risposta? Rivedrò la tua modifica.
VonC

22

Ecco un esempio complicato su come passare gli argomenti ssh utilizzando la variabile 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

Nota: le righe sopra sono le righe di comando del terminale che dovresti incollare nel tuo terminale. Creerà un file ssh , lo renderà eseguibile e lo eseguirà.

Se desideri passare l'opzione della chiave privata, controlla Come dire a git quale chiave privata usare? .


Bello! Domanda: Entrambi $*e "$@"sembrano funzionare. Normalmente lo uso "$@", poiché l'altro sembra deprecato. C'è un motivo per preferire $*in questo caso?
mh8020

16

Configurazione a livello di repository senza influire sulle impostazioni a livello di sistema

Consolidando le risposte già disponibili, scelgo i passaggi seguenti. Ciò garantisce che le modifiche alla configurazione non influiscano a livello di macchina, ma solo per il repository su cui si sta lavorando. Questo è necessario nel mio caso poiché il mio script deve essere eseguito su un agente Bamboo condiviso.

1.Clone il repository adottando l' GIT_SSH_COMMANDapproccio.

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

2.Una volta clonato, accedere alla directory del repository.

cd repo-dir

3.Impostare la core.sshCommandconfigurazione in modo che tutte le chiamate future possano essere eseguite semplicemente con i comandi git come al solito, ma consumando internamente le opzioni git fornite.

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

1
Buon uso di core.sshCommandquello che ho menzionato sopra. Votato.
VonC

5

Penso che l'aggiornamento di git a una versione> = 2.3 e l'uso GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@hostsia l'opzione di scommessa, ma se non è possibile, @ josh-lee ha dato una buona opzione, ma per favore, aggiorna la tua risposta indentando il file di configurazione ssh.

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

0

Questo problema è stato risolto eseguendo i passaggi seguenti nella macchina Windows: -

  • Crea il file di configurazione nella cartella C: \ Users \ username.ssh.

  • aggiungere la seguente riga a un file di configurazione.

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • quindi riprova.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.