Passando opções ssh para clone git

103

Estou tentando executar git clonesem ssh verificar a chave do host do repositório. Eu posso fazer isso do ssh assim:

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

Existe alguma maneira de passar as mesmas opções de ssh para o comando git clone?

Editar: Há uma restrição que não posso modificar ~/.ssh/configou quaisquer outros arquivos nessa máquina.

Daniel
fonte
2
O que você tenta fazer é muito arriscado e provavelmente não deveria fazê-lo. Desativar a verificação se a identidade do servidor SSH remoto é uma má ideia na maioria das situações. Você efetivamente desativa toda a segurança obtida com o uso de SSH e se abre para ataques man-in-the-middle.
aef
1
Na verdade, geralmente é exatamente isso que você deseja fazer. Você tem um repositório interno. Se alguém conseguiu falsificar isso, você está em apuros. Não é "muito arriscado" de forma alguma. Na verdade, com que frequência você faz uma verificação fora da banda da chave do host? (Você deveria).
Graham Nicholls,

Respostas:

47

Adicione-os ao seu ~/.ssh/config:

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

A Hostentrada é o que você especificará na linha de comando e HostNameé o verdadeiro nome do host. Eles podem ser iguais ou a Hostentrada pode ser um alias. oUser entrada é usada se você não especificar user@na linha de comando.

Se você deve configurar isso na linha de comando, defina a GIT_SSHvariável de ambiente para apontar para um script com suas opções nele.

Josh Lee
fonte
4
Esqueci de dizer que não posso modificar nenhum arquivo dessa máquina. Caso contrário, sim, sua solução funcionaria.
Daniel
28
Use a GIT_SSHvariável de ambiente.
Josh Lee,
152

O git 2.3 lançado recentemente suporta uma nova variável "GIT_SSH_COMMAND" que pode ser usada para definir um comando COM parâmetros.

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

$GIT_SSH_COMMANDtem precedência $GIT_SSHe é interpretado pelo shell, o que permite que argumentos adicionais sejam incluídos.

Boris
fonte
Deve haver uma nova linha antes git cloneou o código está correto?
Tomáš Zato - Reintegrar Monica em
7
Isso deve estar correto, sem a nova linha, a variável deve ser definida para o comando a seguir. Se você adicionar uma nova linha, precisará exportar a variável e, então, também deverá funcionar.
Boris
Obrigado, estou preso nisso há 2 dias!
James Gentes
Booya! Obrigado.
Jasper Blues
não funcionará com a versão do git 1.9, acredito, existe alguma solução alternativa para o git 1.9
lazarus
33

Outra opção feita para especificar chaves diferentes é git config core.sshCommandcom git 2.10 + (Q3 2016).

Isto é uma alternativa para a variável ambiente descrito em Boris de resposta )

Consulte o commit 3c8ede3 (26 de junho de 2016) de Nguyễn Thái Ngọc Duy ( pclouds) .
(Fundido por Junio ​​C Hamano - gitster- no commit dc21164 , 19 de julho de 2016)

Uma nova variável de configuração core.sshCommandfoi adicionada para especificar qual valor para GIT_SSH_COMMAND usar por repositório.

Semelhante a $GIT_ASKPASSou $GIT_PROXY_COMMAND, também lemos do arquivo de configuração primeiro e depois voltamos para $GIT_SSH_COMMAND.

Isso é útil para selecionar diferentes chaves privadas destinadas ao mesmo host (por exemplo, github)

core.sshCommand:

Se esta variável for definida, git fetche git pushusará o comando especificado em vez de sshquando precisar se conectar a um sistema remoto.
O comando está no mesmo formato da GIT_SSH_COMMANDvariável de ambiente e é substituído quando a variável de ambiente é definida.

Isso significa que git clonepode ser:

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 você quiser aplicar isso a todos os repos, conforme user1300959 adiciona nos comentários , você usaria uma configuração global.

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
VonC
fonte
2
É mais provável que você ainda não tenha um repositório, já que tem git clone- neste caso, você pode querer configurar o comando git ssh globalmente:git config --global core.sshCommand ...
iurii
@ user1300959 Bom argumento, obrigado. Eu incluí seu comentário na resposta para mais visibilidade.
VonC de
Esta é a melhor resposta.
MikeSchinkel
Na última parte faltou apóstrofo
Luigi Lopez
@LuigiLopez Você pode editar a resposta? Vou revisar sua edição.
VonC
21

Aqui está um exemplo complicado de como passar os argumentos ssh usando a variável 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: As linhas acima são as linhas de comando do terminal que você deve colar em seu terminal. Ele irá criar um arquivo ssh , torná-lo executável e executá-lo.

Se você gostaria de passar a opção de chave privada, verifique Como informar ao git qual chave privada usar? .

Kenorb
fonte
Agradável! Pergunta: Ambos $*e "$@"parecem funcionar. Normalmente eu uso "$@", já que o outro parece obsoleto. Existe uma razão para preferir $*neste caso?
mh8020
16

Configuração de nível de repositório sem afetar as configurações de nível de sistema

Consolidando as respostas já disponíveis, estou escolhendo as etapas abaixo. Isso garante que as mudanças na configuração não afetem no nível da máquina, mas apenas no repositório que está sendo trabalhado. Isso é necessário no meu caso, pois meu script precisa ser executado em um agente Bamboo compartilhado.

1.Clone o repositório seguindo a GIT_SSH_COMMANDabordagem.

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

2. Uma vez clonado, navegue até o diretório do repositório.

cd repo-dir

3. Defina a core.sshCommandconfiguração de forma que todas as chamadas futuras possam ser executadas apenas com comandos git como de costume, mas consumindo internamente as opções git fornecidas.

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
Pavan Kumar
fonte
1
Bom uso do core.sshCommandque mencionei acima. Votado.
VonC
5

Acho que atualizar git para uma versão> = 2.3 e usar GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@hosté a opção de aposta, mas se não for possível, @ josh-lee deu uma boa opção, mas por favor, atualize sua resposta recuando o arquivo de configuração ssh.

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

Esse problema foi corrigido seguindo as etapas da máquina Windows: -

  • Crie o arquivo de configuração na pasta C: \ Users \ username.ssh.

  • adicione a seguinte linha a um arquivo de configuração.

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • em seguida, tente novamente.

Ajay Kumar
fonte