Uma situação bastante incomum, talvez, mas quero especificar uma chave SSH privada para usar ao executar um comando shell (git) no computador local.
Basicamente assim:
git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"
Ou ainda melhor (em Ruby):
with_key("/home/christoffer/ssh_keys/theuser") do
sh("git clone [email protected]:TheUser/TheProject.git")
end
Eu já vi exemplos de conexão com um servidor remoto com o Net :: SSH que usa uma chave privada especificada, mas este é um comando local. É possível?
-i
opção comossh
a.git config core.sshCommand 'ssh -i private_key_file'
. Veja minha resposta abaixoRespostas:
Algo assim deve funcionar (sugerido pelo orip):
se você preferir sub-conchas, tente o seguinte (embora seja mais frágil):
O Git invocará o SSH, que encontrará seu agente pela variável de ambiente; por sua vez, a chave será carregada.
Como alternativa, a configuração
HOME
também pode funcionar, desde que você esteja disposto a configurar um diretório que contenha apenas um.ssh
diretório comoHOME
; isso pode conter um identity.pub ou uma configuração de arquivo de configuração IdentityFile.fonte
ssh-agent bash -c 'ssh-add sshkey; git clone url'
ssh-agent $(..)
sintaxe não está funcionando para mim e não tenho certeza de como isso deve funcionar: (ba) sh deve executar os comandos dentro$(..)
primeiro e depois executar o ssh-agent com a saída como parâmetro.Nenhuma dessas soluções funcionou para mim.
Em vez disso, elaborei a menção de @Martin v. Löwis em definir um
config
arquivo para SSH.O SSH procurará o
~/.ssh/config
arquivo do usuário . Eu tenho a minha configuração como:E eu adiciono um repositório remoto do git:
E então os comandos git funcionam normalmente para mim.
NOTAS
IdentitiesOnly yes
é necessário para evitar o comportamento padrão SSH de enviar o arquivo de identidade combinando o nome de arquivo padrão para cada protocolo. Se você tiver um arquivo nomeado~/.ssh/id_rsa
que será tentado ANTES de você~/.ssh/id_rsa.github
sem essa opção.Referências
fonte
Host remote.server.com
e continuar usando o URL originalchmod 600 ~/.ssh/config
(veja aqui ). E se você estiver usando o GitHub, substituaHost gitserv
porHost github.com
, omitaHostname remote.server.com
e adicione remoto porgit remote add origin [email protected]:user_name/repo_name.git
.A partir do Git 2.3.0, também temos o comando simples (nenhum arquivo de configuração é necessário):
fonte
cannot run ssh -i /home/vagrant/.ssh/git: No such file or directory
acho que existe a444 Nov 16 18:12 /home/vagrant/.ssh/git
partir dels -l /home/vagrant/.ssh/git
chmod 400 <path-to-private-key-file>
. Caso contrário, o comando git pode falhar sem nenhuma mensagem de erro especial ...-o IdentitiesOnly=yes
para garantir que a chave especificada com-i
seja usada (em oposição a uma chave do agente SSH).As sugestões de outras pessoas
~/.ssh/config
são extremamente complicadas. Pode ser tão simples quanto:fonte
IdentitiesOnly
opção também.git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git
. Então você config pareceHost personal HostName github.com ... Host corporate HostName github.com
Conteúdo de my_git_ssh_wrapper:
Então você pode usar a chave fazendo:
fonte
GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
Com git 2.10+ (Q3 2016: lançado setembro 2d, 2016), você tem a possibilidade de definir uma configuração para
GIT_SSH_COMMAND
(e não apenas uma variável de ambiente como descrito na Rober Jack Will 's resposta )Ver commit 3c8ede3 (26 de junho de 2016) por Nguyễn Thái Ngọc Duy (
pclouds
) .(Mesclado por Junio C Hamano -
gitster
- na confirmação dc21164 , 19 de julho de 2016)Isso significa que
git clone
pode ser:Você pode configurá-lo para apenas um comando:
Isso é mais fácil do que definir uma
GIT_SSH_COMMAND
variável de ambiente que, no Windows, conforme observado por Mátyás Kuti-Kreszács , seriafonte
git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git
seguido pelo conjunto de configuraçõesgit config core.sshCommand 'ssh -i private_key_file'
Para resumir respostas e comentários , a melhor maneira de configurar o git para usar arquivos-chave diferentes e depois esquecê-lo, que também suporta usuários diferentes para o mesmo host (por exemplo, uma conta pessoal do GitHub e outra funcional), que funciona no Windows também é editar
~/.ssh/config
(ouc:\Users\<your user>\.ssh\config
) e especificar várias identidades:Em seguida, para clonar um projeto como seu usuário pessoal, basta executar o
git clone
comando regular .Para clonar o repositório como o
workuser
, executegit clone git@github-work:company/project.git
.fonte
dandv
eworkuser
para apoiar o meu exemplo ", por exemplo, uma conta pessoal do GitHub e uma conta de trabalho".dandv
é o meu nome de usuário do GitHub.IdentitiesOnly yes
ao meu arquivo de configuração ssh.Como indicado aqui: https://superuser.com/a/912281/607049
Você pode configurá-lo por repo:
fonte
-F /dev/null
faz? Tanto quanto posso ver, isso mudará o configFile do~/.ssh/config
padrão, mas por que isso é desejado? Para garantir um comando em área restrita?O problema é quando você tem repositórios remotos diferentes no mesmo host (por exemplo, github.com) e deseja interagir com eles usando diferentes chaves ssh (por exemplo, contas diferentes do GitHub).
A fim de fazer isso:
Primeiro você deve declarar suas diferentes chaves no
~/.ssh/config
arquivo.Ao fazer isso, você associa a segunda chave a um novo nome amigável "XXX" para o github.com.
Então você deve alterar a origem remota do seu repositório específico, para que ele use o nome amigável que você acabou de definir.
Vá para a pasta do repositório local em um prompt de comando e exiba a origem remota atual:
Altere a origem com:
Agora você pode pressionar, buscar ... com a tecla certa automaticamente.
fonte
ou
fonte
Muito melhor ideia de adicionar esse host ou ip ao
.ssh/config
arquivo da seguinte maneira:fonte
git clone git@gh-work:repo/project.git
em ~ / .ssh / config, tenho duas seções que usam github.com para HostName. Eles apenas têm IdentityFile e Host diferentes~/.ssh/config
pastebin.com/8rYn7yCiEu fui com a variável de ambiente GIT_SSH. Aqui está meu invólucro, semelhante ao de Joe Block acima, mas lida com qualquer quantidade de argumentos.
Arquivo ~ / gitwrap.sh
Em seguida, no meu .bashrc, adicione o seguinte:
fonte
gitwrap.sh
, por exemplo/home/ubuntu/gitwrap.sh
-o StrictHostKeyChecking=no
ao comando sshSe nenhuma das outras soluções aqui funcionar para você e você criou várias chaves ssh, mas ainda não pode fazer coisas simples, como
supondo que você tenha dois arquivos de chave ssh como
depois, dentro do repositório git, tente:
e também verifique se o nome de usuário e o ID do usuário padrão do github estão corretos:
Consulte https://gist.github.com/jexchan/2351996 para obter mais informações.
fonte
Could not open a connection to your authentication agent.
, tenta$ eval `ssh-agent -s`
e tenta novamente.ssh-add
truque de comando funcionou para mim. Add é a chave de identidade na lista daqueles que são tentados quando o ssh se autentica. Isso funcionou para mim também!ssh-add
?.git
dentro do repositório, não o programa git globalmente. Você pode usar--global
para definir o nome de usuário e o email globais.Quando você precisa se conectar a github com um pedido normal (
git pull origin master
), dando o anfitrião como*
no~/.ssh/config
funcionou para mim, qualquer outro anfitrião (digamos, "github" ou "gb") não estava funcionando.fonte
Host my-host-alias
, você deve definirremote.origin.url=git@my-host-alias:[username]/[repo].git
.Muitas dessas soluções pareciam atraentes. No entanto, achei a abordagem genérica do git-wrapping-script no seguinte link a mais útil:
Como especificar um arquivo de chave ssh com o
git
comandoO ponto é que não há
git
comando como o seguinte:A solução da Alvin é usar um script bem definido de wrapper que preencha esta lacuna:
Onde
git.sh
fica:Posso verificar se isso resolveu um problema que eu estava tendo com o usuário reconhecimento / chave para um repo bitbucket remoto com
git remote update
,git pull
egit clone
; agora tudo funciona bem em umcron
script de trabalho que estava tendo problemas para navegar no shell limitado. Também pude chamar esse script no R e ainda resolver exatamente o mesmocron
problema de execução (por exemplo,system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
).Não que R seja o mesmo que Ruby, mas se R puder fazê-lo ... O :-)
fonte
GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone [email protected]:/git/repo.git
de acordo com a resposta de Robert Jack Will ?se você tiver um diretório no caminho em que deseja assinar com um determinado arquivo de identificação, poderá especificar o uso de um arquivo de identificação específico por meio do arquivo .ssh / config, definindo o
ControlPath
exemplo:Em seguida
ssh
, usará o arquivo de identidade especificado ao executar comandos git no caminho de trabalho especificado.fonte
ControlMaster auto
eControlPersist yes
, para não precisar redigitar a senha todas as vezes. Encontrou a informação neste artigoVocê precisa criar um ~ / .ssh / config como abaixo
permissão como abaixo
Adicione sua chave pública ao seu git (cat ~ / .ssh / id_rsa_pub [ou nome similar])
e depois git clone como abaixo
fonte
Muitas respostas boas, mas algumas delas assumem conhecimento prévio em administração.
Eu acho que é importante enfatizar explicitamente que, se você iniciou o projeto clonando a URL da Web -
https://github.com/<user-name>/<project-name>.git
precisará garantir que o
url
valor abaixo[remote "origin"]
do.git/config
foi alterado para a URL SSH (consulte o bloco de código abaixo).Além disso, certifique-se de adicionar o
sshCommmand
mencionado abaixo:Leia mais sobre isso aqui .
fonte
No Windows com Git Bash, você pode usar o seguinte para adicionar um repositório,
ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"'
por exemplo:ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin [email protected]:test/test.git'
Qual chave privada está na unidade D, teste de pasta do computador. Além disso, se você deseja clonar um repositório, pode alterargit remote add origin
comgit clone
.Depois de inserir isso no Git Bash, ele solicitará uma senha.
Esteja ciente de que a chave privada openssh e a putty private key são diferentes.
Se você criou suas chaves com puttygen, deve converter sua chave privada em openssh!
fonte
Você pode usar a variável de ambiente GIT_SSH. Mas você precisará agrupar ssh e opções em um script de shell.
Veja o manual do git:
man git
no seu shell de comando.fonte
Eu uso
zsh
e chaves diferentes são carregadas no meu shell zshssh-agent
automaticamente para outros fins (ou seja, acesso a servidores remotos) no meu laptop. Modifiquei a resposta de @ Nick e a uso em um dos meus repositórios que precisam ser atualizados com frequência. (Nesse caso, é meudotfiles
que eu quero a mesma e a versão mais recente em todas as minhas máquinas, onde quer que esteja trabalhando.)cd
repo dir tiver êxito, puxe do repo remotofonte
para o gitlab
RSAAuthentication yes
doc está aqui
fonte
Para que a variável de ambiente GIT_SSH_COMMAND funcione no Windows, em vez de:
Usar:
A citação deve ser como
Algum backgorund: https://stackoverflow.com/a/34402887/10671021
fonte
Se o número da porta SSH não é 22 (padrão), adicione
Port xx
em~/.ssh/config
No meu caso (sinologia),
Em seguida, clone usando o título Host na configuração. ("my_synology". para evitar @chopstik 's "*")
fonte
Se você é como eu, pode:
Mantenha suas chaves ssh organizadas
Mantenha seus comandos git clone simples
Manipule qualquer número de chaves para qualquer número de repositórios.
Reduza sua manutenção de chave ssh.
Eu mantenho minhas chaves na minha
~/.ssh/keys
diretório.Eu prefiro convenção do que configuração.
Eu acho que código é lei; quanto mais simples, melhor.
PASSO 1 - Criar alias
Adicione este alias ao seu shell:
alias git-clone='GIT_SSH=ssh_wrapper git clone'
PASSO 2 - Criar Script
Adicione este script ssh_wrapper ao seu PATH:
EXEMPLOS
Use a chave github.com/l3x:
O exemplo a seguir também usa a chave github.com/l3x (por padrão):
Use a chave bitbucket.org/lsheehan:
NOTAS
Altere o SSH_KEY padrão no script ssh_wrapper para o que você usa na maioria das vezes. Dessa forma, você não precisa usar a variável KEY na maioria das vezes.
Você pode pensar: "Ei! Isso está acontecendo muito com um apelido, um script e um diretório de chaves", mas para mim é uma convenção. Quase todas as minhas estações de trabalho (e servidores) estão configuradas da mesma forma.
Meu objetivo aqui é simplificar os comandos que executo regularmente.
Minhas convenções, por exemplo, scripts Bash, aliases etc., criam um ambiente consistente e me ajudam a manter as coisas simples.
BEIJO e nomes importam.
Para obter mais dicas de design, consulte o Capítulo 4 do SOLID Design no Go do meu livro: https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW
Espero que ajude. - Lex
fonte
Você pode tentar o pacote sshmulti npm para manter várias chaves ssh.
fonte
O problema com esse método é que, pelo menos ao executar o bash.exe no Windows, ele cria um novo processo sempre que permanecer inativo.
Se você quiser usá-lo para sincronizar o repositório na programação, precisará adicionar "&& ssh-agent -k" no final.
Algo como:
O ssh-agent -k matará o processo quando terminar.
fonte
Eu só precisava adicionar a chave e executar o clone git novamente.
fonte
Aqui está o hack da chave ssh que encontrei ao encontrar a solução para esse problema:
Por exemplo, você tem 2 conjuntos diferentes de chaves:
key1, key1.pub, key2, key2.pub
Mantenha essas chaves em seu
.ssh
diretórioAgora no seu arquivo
.bashrc
ou.bash_profile
alias, adicione estes comandosalias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'
alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'
Voila! Você tem um atalho para alternar as teclas quando quiser!
Espero que funcione para voce.
fonte