ssh
tem a -i
opção de informar qual arquivo de chave privada usar ao autenticar:
-i identity_file
Seleciona um arquivo a partir do qual a identidade (chave privada) para autenticação RSA ou DSA é lida. O padrão é
~/.ssh/identity
para a versão 1 do protocolo~/.ssh/id_rsa
e~/.ssh/id_dsa
para a versão 2. do protocolo. Os arquivos de identidade também podem ser especificados por host no arquivo de configuração. É possível ter várias-i
opções (e várias identidades especificadas nos arquivos de configuração).
Existe uma maneira semelhante de saber git
qual arquivo de chave privada usar em um sistema com várias chaves privadas no ~/.ssh
diretório?
ssh
git
authentication
private-key
jrdioko
fonte
fonte
Respostas:
Em
~/.ssh/config
, adicione:Agora você pode fazer
git clone [email protected]:username/repo.git
.NOTA: Verifique se as permissões no IdentityFile são 400. O SSH rejeitará, de maneira não claramente explícita, as chaves SSH que são legíveis demais. Será apenas uma rejeição de credencial. A solução, neste caso, é:
fonte
HostName
: Especifica o nome real do host no qual efetuar login. Isso pode ser usado para especificar apelidos ou abreviações para hosts." Minha versão do ssh é openssh-6.7p1.chmod 600 ~/.ssh/config
core.sshCommand
configuração do git. superuser.com/a/912281/162466Variável de ambiente
GIT_SSH_COMMAND
:No Git versão 2.3.0, você pode usar a variável de ambiente
GIT_SSH_COMMAND
assim:Observe que
-i
às vezes pode ser substituído pelo seu arquivo de configuração; nesse caso, você deve fornecer ao SSH um arquivo de configuração vazio, como este:Configuração
core.sshCommand
:Na versão 2.10.0 do Git, você pode configurar isso por repo ou globalmente, para não precisar mais definir a variável de ambiente!
fonte
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example"
, em seguida,git clone example
example=hello /usr/bin/env | grep example
./dev/null
é apenas um nome de arquivo válido em sistemas operacionais semelhantes ao UNIX, não funciona no Windows.GIT_SSH_COMMAND
não funcionou até que eu useiIdentitiesOnly
, como este comando:GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push
.Não há uma maneira direta de saber
git
qual chave privada usar, porque ela dependessh
da autenticação do repositório. No entanto, ainda existem algumas maneiras de atingir seu objetivo:Opção 1:
ssh-agent
Você pode usar
ssh-agent
para autorizar temporariamente sua chave privada.Por exemplo:
Opção 2:
GIT_SSH_COMMAND
Passe os argumentos ssh usando a
GIT_SSH_COMMAND
variável de ambiente (Git 2.3.0+).Por exemplo:
Você pode digitar tudo isso em uma linha - ignore
$
e deixe de fora o\
.Opção 3:
GIT_SSH
Passe os argumentos ssh usando a
GIT_SSH
variável de ambiente para especificar ossh
binário alternativo .Por exemplo:
Nota: As linhas acima são linhas de comando shell (terminal) que você deve colar no seu terminal. Eles criarão um arquivo chamado
ssh
, o tornarão executável e (indiretamente) o executarão.Nota:
GIT_SSH
está disponível desde a v0.99.4 (2005).Opção 4:
~/.ssh/config
Use o
~/.ssh/config
arquivo conforme sugerido em outras respostas para especificar o local da sua chave privada, por exemplofonte
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
trabalhou para mim quando nada mais faria. Parabéns.~/.ssh/config
método, env vars não funcionou para mim ...GIT_SSH
está disponível desde a v0.99.4 (agosto de 2005) , então basicamente desde que o Git existe (abril de 2005).Escreva um script que chame
ssh
com os argumentos desejados e insira o nome do arquivo do script$GIT_SSH
. Ou apenas coloque sua configuração~/.ssh/config
.fonte
~/.ssh/config
É o caminho a percorrer.$GIT_SSH
e um script resolveu esse problema. Obrigado!Se você não deseja especificar variáveis de ambiente sempre que executar o git, não deseja outro script de wrapper, não pode / não pode executar o ssh-agent (1) nem deseja fazer o download de outro pacote apenas para isso, use o git -remote-ext (1) transporte externo:
Considero esta solução superior porque:
fonte
git
recurso do Chef a usar chaves de implantação específicas do repositório para clonar / buscar em repositórios particulares do Github. A vantagem adicional desse método sobre o ambiente / script é que, como o caminho da chave é codificado na configuração do repositório de trabalho, ele usará a mesma chave no clone inicial e nas buscas / empurrões subsequentes..ssh/config
etc. +1!ext
transporte em cada submódulo para que a recursão no pai funcione.fatal: transport 'ext' not allowed
, precisará colocar o protocolo ext na lista de permissões viaexport GIT_ALLOW_PROTOCOL=ext
. Basicamente, o auxiliar remoto do git-remote-ext (que suporta URLs "ext :: ssh example.com% S foo / repo") permite a execução arbitrária de comandos. Isso normalmente nem sempre é uma preocupação, porque o usuário sempre vê e confia no URL que passa para o git. No entanto, os submodules git, por meio do arquivo .gitmodules, permitem que um invasor solicite ao cliente que busque URLs git arbitrários. hackerone.com/reports/104465Use a configuração personalizada do host
~/.ssh/config
, desta forma:use seu nome de host personalizado assim:
fonte
Host work.github.com
HostName github.com
IdentityFile ~/.ssh/work
e substituir "github.com" por "work.github.com" sempre que clonar um repositório de trabalho. Ele ainda se conecta ao "github.com", mas usando um par de chaves não padrão.~/.ssh/config
arquivo. Todas as outras respostas perdem como você pode definir o host ao adicionar a origem, o que automaticamente permite que o git use o arquivo de chave correto. OBRIGADO!!Depois da minha luta,
$GIT_SSH
eu gostaria de compartilhar o que funcionou para mim.Pelos meus exemplos, assumirei que você tem sua chave privada localizada em
/home/user/.ssh/jenkins
Erro a evitar: o valor GIT_SSH inclui opções
ou qualquer falha semelhante, pois o git tentará executar o valor como um arquivo . Por esse motivo, você deve criar um script.
Exemplo de trabalho do script $ GIT_SSH
/home/user/gssh.sh
O script será chamado da seguinte maneira:
Um exemplo de trabalho de script pode ter a seguinte aparência:
Observe o
$*
no final, é parte importante disso.Uma alternativa ainda mais segura, que impediria qualquer possível conflito com qualquer coisa no seu arquivo de configuração padrão (além de mencionar explicitamente a porta a ser usada) seria:
Assumindo que o script esteja
/home/user/gssh.sh
, você deve:e tudo deve funcionar.
fonte
Você pode apenas usar ssh-ident em vez de criar seu próprio wrapper.
Você pode ler mais em: https://github.com/ccontavalli/ssh-ident
Carrega chaves ssh sob demanda quando necessário, uma vez, mesmo com várias sessões de login, xterms ou casas compartilhadas NFS.
Com um pequeno arquivo de configuração, ele pode carregar automaticamente chaves diferentes e mantê-las separadas em agentes diferentes (para encaminhamento de agente), dependendo do que você precisa fazer.
fonte
Eu tinha um cliente que precisava de uma conta separada no github. Então, eu precisava usar uma chave separada apenas para este projeto.
Minha solução foi adicionar isso ao meu .zshrc / .bashrc:
Sempre que eu quero usar o git para esse projeto, substituo "infogit" por git:
Para mim, é mais fácil lembrar.
fonte
Então, defino a variável env GIT_SSH como
$HOME/bin/git-ssh
.Para que a minha configuração de repositório determine que identidade ssh usar, meu
~/bin/git-ssh
arquivo é o seguinte:Então eu tenho uma configuração global de configuração do git:
E dentro de qualquer repositório git, posso apenas definir um
ssh.identity
valor de configuração local do git:Voila!
Se você pode ter um endereço de email diferente para cada identidade, fica ainda mais simples, porque você pode apenas nomear suas chaves após seus endereços de email e solicitar ao user.e do git config. Email conduz a seleção de chaves da
~/bin/git-ssh
seguinte maneira:fonte
Minha solução foi esta:
crie um script:
quando você precisar alterar a execução var:
Não esqueça o ponto extra !! isso faz o script definir os ambientes variados !! --key e --port são opcionais.
fonte
Geralmente, você deseja usar
~/.ssh/config
para isso. Simplesmente emparelhe os endereços do servidor com as chaves que você deseja usar para eles da seguinte maneira:Host *
denota qualquer servidor, então eu o uso para definir~/.ssh/id_rsa
como a chave padrão a ser usada.fonte
Eu desenvolvo o @shellholic e esse tópico SO com algumas dicas. Eu uso o GitHub como exemplo e suponho que você tenha uma chave privada
~/.ssh/github
(caso contrário, consulte este tópico do SO ) e que você adicionou a chave pública ao seu perfil do GitHub (caso contrário, consulte a ajuda do GitHub ).Se necessário, crie um novo arquivo de configuração SSH em
~/.ssh/config
e altere as permissões para 400Adicione isso ao
~/.ssh/config
arquivo:Se você já possui uma configuração remota, convém excluí-la, caso contrário, você ainda poderá solicitar o nome de usuário e a senha:
Em seguida, adicione um controle remoto ao repositório git e observe os dois pontos antes do nome do usuário:
E então os comandos git funcionam normalmente, por exemplo:
@HeyWatchThis neste encadeamento SO sugeriu a adição
IdentitiesOnly yes
para impedir o comportamento padrão do SSH de enviar o arquivo de identidade correspondente ao nome do arquivo padrão para cada protocolo. Veja esse tópico para mais informações e referências.fonte
Basta usar
ssh-agent
essh-add
comandos.Depois de executar os comandos acima, você pode usar as duas teclas ao mesmo tempo. Apenas digite
clonar seu repositório.
Você precisa executar o comando acima depois de reiniciar sua máquina.
fonte
Estou usando o git versão 2.16 e não preciso de um único pedaço de script, nem mesmo de um comando config ou modificado.
E o git lê a chave automaticamente. Eu não pergunto nada e não gera um erro. Apenas funciona bem.
fonte
~/.ssh
diretório"?Embora a pergunta não solicite, estou incluindo esta resposta para qualquer pessoa que esteja procurando resolver o mesmo problema especificamente para o gitlab .
A solução gitlab
Tentei usar a abordagem de variáveis de ambiente , mas mesmo a documentação do git recomenda usar
~/.ssh/config
algo além do simples caso. No meu caso, estou enviando para um servidor gitlab - e queria fazê-lo como um usuário específico - que é definido pela chave privada durante a autenticação e não pelo nome de usuáriogit
. Uma vez implementado, basta executar o seguinte:Configuração
Lembre-se da localização da sua chave privada
/myfolder/.ssh/my_gitlab_id_rsa
no meu caso.Adicione uma entrada em
~/.ssh/config
:Adicione o git-alias em
~/.gitconfig
:Como bônus, eu realizo meus commits neste mesmo host que um usuário específico com este git-alias :
Explicação
Todas as opções acima assumem que o controle remoto é
origin
relevante e que o ramo relevante está atualmente com check-out. Para referência, encontrei vários itens que precisavam ser abordados:gitlab_as_me
, e eu não gostei de ver o controle remoto extra pendurado na minha árvore de logs, então removo-o quando terminargitlab_as_me
você precisa ser específico sobre qual ramo você está empurrandoorigin
ponteiro local precisa ser "atualizado" para correspondergitlab_as_me
(o quegit pull origin $branch
faz isso)fonte
Digite o caminho que você deseja salvar (por exemplo: my-pc / Desktop / .ssh / ed25519)
Adicione a chave pública ao seu gitlab ( Como adicionar a chave ssh ao gitlab )
fonte
fonte