Eu tenho o seguinte caso de uso: Eu gostaria de poder [email protected]:gitolite-admin
usar a chave privada do usuário gitolite-admin
, enquanto desejo usar a chave privada [email protected]:some_repo
'minha própria'. AFAIK, não consigo resolver isso usando ~/.ssh/config
, porque o nome de usuário e o nome do servidor são idênticos nos dois casos. Como Eu use a própria chave privada, eu tenho que definiu no ~/.ssh/config
para [email protected]
. Alguém sabe uma maneira de substituir a chave usada para uma única git
invocação?
(Além disso: gitolite distingue quem está fazendo o push com base na chave, portanto, não é um problema, em termos de acesso, propriedade e auditoria, que a sequência user @ server seja idêntica para usuários diferentes.)
Respostas:
Mesmo se o usuário e o host forem iguais, eles ainda poderão ser distinguidos
~/.ssh/config
. Por exemplo, se sua configuração estiver assim:Então você apenas usa
gitolite-as-alice
e, emgitolite-as-bob
vez do nome do host no seu URL:Nota
Você deseja incluir a opção
IdentitiesOnly yes
para impedir o uso de IDs padrão. Caso contrário, se você também tiver arquivos de identificação que correspondam aos nomes padrão, eles serão tentados primeiro porque, diferentemente de outras opções de configuração (que atendem ao "primeiro ganho"), aIdentityFile
opção anexa à lista de identidades a serem tentadas. Consulte: /server/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807fonte
git@
parte no controle remoto não é necessária, pois é fornecida naUser
linha da configuração.IdentitiesOnly yes
imediatamente após a linhaIdentityFile
para o host. Parece que estava passando várias identidades e uma delas foi impedida de acessar o host.Uma abordagem alternativa à oferecida acima por Mark Longair é usar um alias que execute qualquer comando git, em qualquer controle remoto, com uma chave SSH alternativa. A idéia é basicamente mudar sua identidade SSH ao executar os comandos git.
Vantagens em relação à abordagem do alias do host na outra resposta:
remote
explicitamente.Eu uso alguns scripts pequenos e um alias do git
admin
. Dessa forma, eu posso fazer, por exemplo:Para enviar para o controle remoto padrão usando a chave SSH alternativa ("admin"). Novamente, você pode usar qualquer comando (não apenas
push
) com esse alias. Você pode fazer o mesmogit admin clone ...
para clonar um repositório ao qual você só teria acesso usando sua chave "admin".Etapa 1: crie as chaves SSH alternativas e, opcionalmente, defina uma senha, caso esteja fazendo isso na máquina de outra pessoa.
Etapa 2: Crie um script chamado “ssh-as.sh” que execute coisas que usem SSH, mas use uma determinada chave SSH em vez da padrão:
Etapa 3: Crie um script chamado "git-as.sh" que execute os comandos git usando a chave SSH fornecida.
Etapa 4: adicione um alias (usando algo apropriado para "PATH_TO_SCRIPTS_DIR" abaixo):
Mais detalhes em: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/
fonte
$@
->"$@"
para ser seguro.Você pode utilizar a variável de ambiente git
GIT_SSH_COMMAND
. Execute isso no seu terminal no seu repositório git:Substitua
~/.ssh/your_private_key
pelo caminho da chave privada ssh que você deseja usar. E você pode mudar o comando posterior git (no exemplo, égit submodule update --init
) a outros comogit pull
,git fetch
, etc.fonte
Em sistemas baseados em Unix (Linux, BSD, Mac OS X), a identidade padrão é armazenada no diretório $ HOME / .ssh , em 2 arquivos:
private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub
Quando você usassh
sem opção-i
, ele usa a chave privada padrão para autenticar no sistema remoto.Se você tiver outra chave privada que deseja usar, por exemplo $ HOME / .ssh / deploy_key , precisará usar
ssh -i ~/.ssh/deploy_key ...
É irritante. Você pode adicionar as seguintes linhas ao seu $ HOME / .bash_profile :
ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa
Portanto, toda vez que você usa
ssh
ougit
ouscp
(basicamentessh
também), não precisa-i
mais usar a opçãoVocê pode adicionar quantas chaves quiser no arquivo $ HOME / .bash_profile .
fonte
Outra alternativa é usar o ssh-ident, para gerenciar suas identidades ssh .
Ele carrega e usa automaticamente chaves diferentes com base no seu diretório de trabalho atual, nas opções ssh e assim por diante ... o que significa que você pode facilmente ter um diretório de trabalho / privado e diretório / privado que acabem de forma transparente usando diferentes chaves e identidades com o ssh.
fonte
Estou usando o Git Bash no Win7. O seguinte funcionou para mim.
Crie um arquivo de configuração em ~ / .ssh / config ou c: / users / [your_user_name] /. Ssh / config. No arquivo, digite:
Eu acho que o host deve ser um URL e não apenas um "nome" ou referência para o seu host. Por exemplo,
O caminho também pode ser gravado no formato / c / users / [nome_do_usuário] / ....
A solução fornecida por Giordano Scalzo também é ótima. https://stackoverflow.com/a/9149518/1738546
fonte
A partir do git 2.10, também é possível usar a configuração gitconfig sshCommand. Documentos :
Um exemplo de uso seria:
git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]
Em alguns casos, isso não funciona porque o ssh_config substitui o comando; nesse caso, tente
ssh -i ~/.ssh/[insert_your_keyname] -F /dev/null
não usar o ssh_config.fonte
Criei e testei com o github a seguinte abordagem, com base na leitura de outras respostas, que combina algumas técnicas:
A vantagem dessa abordagem é que, uma vez configurada, ela não requer nenhum trabalho adicional para corrigi-la - por exemplo, você não precisa alterar URLs remotas ou lembre-se de clonar as coisas de maneira diferente - a reescrita da URL faz com que tudo funcione .
~/.ssh/config
~/.gitconfig
~/dev/work/.gitconfig
Contanto que você mantenha todos os seus repositórios de trabalho em ~ / dev / work e coisas pessoais em outro lugar, o git usará a chave SSH correta ao executar pull / clones / push no servidor e também anexará o endereço de email correto a todos os seus commits.
Referências:
1 1
2
fonte
includeIf
só deve funcionar se houver um.git
diretório presente, pensei?Se estiver usando a versão do ssh do Git no Windows, a linha do arquivo de identidade na configuração do ssh será semelhante a
onde
/c
é parac:
Para verificar, no git's bash, faça
fonte
Pode ser necessário remover (ou comentar) a configuração padrão do host
fonte
você mais especificou na chave de configuração do arquivo ssh:
fonte
Como outra pessoa mencionou, a
core.sshCommand
configuração pode ser usada para substituir a chave SSH e outros parâmetros.Aqui está um exemplo em que você tem uma chave alternativa nomeada
~/.ssh/workrsa
e deseja usá-la para todos os repositórios clonados em~/work
..gitconfig
arquivo em~/work
:~/.gitconfig
, adicione:fonte
Uma possibilidade de usar
~/.ssh/config
é usar aMatch
restrição em vez daHost
restrição. Em particular,Match Exec
chama um comando shell para decidir se deve aplicar as declarações ou não. No bash, você pode usar o seguinte comando:Isso usa o
[
comando bash para verificar se duas cadeias são iguais. Nesse caso, ele está testando se a sequência[email protected]:gitolite-admin
corresponde à saída obtida do$(git config --get remote.origin.url)''
comando.Você pode usar qualquer outro comando que identifique o repositório no qual o shell está. Para que isso funcione, é importante ter a
$SHELL
variável definida para o seu shell, no meu caso/bin/bash
. O exemplo completo seria o seguinte~/.ssh/config
:Neste exemplo, presumi que
~/.ssh/yourOwnPrivateKey
contenha sua própria chave privada e que~/.ssh/gitolite-admin
contenha a chave privada do usuáriogitolite-admin
. Incluí aIdentitiesOnly yes
declaração para garantir que apenas uma chave seja oferecida ao servidor git, mencionada por Mark Longair . As outras declarações são apenas opções ssh padrão para o git.Você pode adicionar essa configuração se tiver várias
some_repo
que deseja usar com chaves diferentes. Se você possui vários repositórios[email protected]
e a maioria deles usa~/.ssh/yourOwnPrivateKey
, faz mais sentido incluir essa chave como padrão para o host. Nesse caso,~/.ssh/config
seria:Observe que o pedido é importante e a
Host git.company.com
restrição deve aparecer após o pedidoMatch Exec
.fonte
Configure seu repositório usando
git config
. Por exemplo:fonte