Entrando em forma
Para gerenciar um repositório git em uma conta github / bitbucket / qualquer outra conta separada, basta gerar uma nova chave SSH.
Porém, antes que possamos começar a enviar / reposicionar repos com sua segunda identidade, precisamos colocar você em forma - vamos assumir que seu sistema está configurado com um par típico id_rsa
e de id_rsa.pub
chaves. Agora, sua tree ~/.ssh
aparência se parece com isso
$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── id_rsa
└── id_rsa.pub
Primeiro, nomeie esse par de chaves - adicionar um nome descritivo ajudará a lembrar qual chave é usada para qual usuário / usuário remoto
# change to your ~/.ssh directory
$ cd ~/.ssh
# rename the private key
$ mv id_rsa github-mainuser
# rename the public key
$ mv id_rsa.pub github-mainuser.pub
Em seguida, vamos gerar um novo par de chaves - aqui vou nomear a nova chavegithub-otheruser
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-otheruser
Agora, quando olhamos tree ~/.ssh
, vemos
$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── github-mainuser
├── github-mainuser.pub
├── github-otheruser
└── github-otheruser.pub
Em seguida, precisamos definir um ~/.ssh/config
arquivo que definirá nossas configurações principais. Vamos criá-lo com as permissões apropriadas de leitura / gravação do proprietário
$ (umask 077; touch ~/.ssh/config)
Abra isso com seu editor favorito e adicione o seguinte conteúdo
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Presumivelmente, você terá alguns repositórios existentes associados à sua identidade principal do github. Por esse motivo, o github.com "padrão" Host
está configurado para usar sua mainuser
chave. Se você não deseja favorecer uma conta em detrimento de outra, mostrarei como atualizar os repositórios existentes no seu sistema para usar uma configuração ssh atualizada.
Adicione sua nova chave SSH ao github
Cabeça sobre a github.com/settings/keys para adicionar o seu novo público -chave
Você pode obter o conteúdo da chave pública usando: copie / cole no github
$ cat ~/.ssh/github-otheruser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBVvWNQ2nO5...
Agora sua nova identidade de usuário está configurada. Abaixo, mostraremos como usá-la.
Como fazer coisas: clonar um repositório
Então, como isso se junta para trabalhar com o git e o github? Bem, como você não pode ter uma galinha sem ovo, veremos a clonagem de um repositório existente. Essa situação pode se aplicar a você se você tiver uma nova conta do github para o seu local de trabalho e tiver sido adicionado a um projeto da empresa.
Digamos que github.com/someorg/somerepo
já exista e você foi adicionado a ela - a clonagem é tão fácil quanto
$ git clone github.com-otheruser:someorg/somerepo.git
Essa parte em negrito deve corresponder ao Host
nome que configuramos no seu ~/.ssh/config
arquivo. Que conecta corretamente o git ao correspondente IdentityFile
e o autentica corretamente com o github
Como fazer: criando um novo repositório
Bem, como você não pode ter uma galinha sem ovo, analisaremos a publicação de um novo repositório em sua conta secundária. Essa situação se aplica aos usuários que criam novo conteúdo usando sua conta secundária do github.
Vamos supor que você já tenha trabalhado um pouco localmente e agora esteja pronto para ir ao github. Você pode acompanhar-me se quiser
$ cd ~
$ mkdir somerepo
$ cd somerepo
$ git init
Agora configure este repositório para usar sua identidade
$ git config user.name "Mister Manager"
$ git config user.email "someuser@some.org"
Agora faça seu primeiro commit
$ echo "hello world" > readme
$ git add .
$ git commit -m "first commit"
Verifique o commit para ver se sua nova identidade foi usada usando o git log
$ git log --pretty="%H %an <%ae>"
f397a7cfbf55d44ffdf87aa24974f0a5001e1921 Mister Manager <someuser@some.org>
Tudo bem, hora de empurrar para o github! Como o github ainda não conhece nosso novo repositório , primeiro vá para github.com/new e crie seu novo repositório - nomeie-o somerepo
Agora, para configurar seu repositório para "conversar" com o github usando a identidade / credenciais corretas, adicionamos um controle remoto. Supondo que seu nome de usuário no github para sua nova conta seja someuser
...
$ git remote add origin github.com-otheruser:someuser/somerepo.git
Essa parte em negrito é absolutamente crítica e deve corresponder à Host
que definimos em seu ~/.ssh/config
arquivo
Por fim, empurre o repositório
$ git push origin master
Atualize um repositório existente para usar uma nova configuração SSH
Digamos que você já tenha alguns repositórios clonados, mas agora você deseja usar uma nova configuração SSH. No exemplo acima, mantivemos seus repositórios existentes intactos, atribuindo seu par anterior id_rsa
/ id_rsa.pub
chave ao Host github.com
seu arquivo de configuração SSH. Não há nada de errado nisso, mas agora tenho pelo menos 5 configurações do github e não gosto de pensar em uma delas como a configuração "padrão" - prefiro ser explícito sobre cada uma.
Antes de termos isso
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Então, agora vamos atualizar isso para isso (alterações em negrito )
Host github.com-mainuser
HostName github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Mas isso significa que agora qualquer repo existente com um github.com
controle remoto não funcionará mais com esse arquivo de identidade. Mas não se preocupe, é uma solução simples.
Para atualizar qualquer repositório existente para usar sua nova configuração SSH, basta abrir o arquivo de configuração git do repositório e atualizar o URL!
$ cd existingrepo
$ nano .git/config
Atualize o campo de origem remota (alterações em negrito )
[remote "origin"]
url = github.com-mainuser:someuser/existingrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
É isso aí. Agora você pode push
/ pull
para o conteúdo do seu coração
Permissões de arquivo de chave SSH
Se você estiver tendo problemas com as chaves públicas que não estão funcionando corretamente, o SSH é bastante rigoroso nas permissões de arquivo permitidas no ~/.ssh
diretório e nos arquivos de chave correspondentes
Como regra geral, qualquer diretório deve ser 700
e qualquer arquivo deve 600
- isso significa que eles são de leitura / gravação somente pelo proprietário - nenhum outro grupo / usuário pode lê-los / gravá-los
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/github-mainuser
$ chmod 600 ~/.ssh/github-mainuser.pub
$ chmod 600 ~/.ssh/github-otheruser
$ chmod 600 ~/.ssh/github-otheruser.pub
Como gerencio minhas chaves SSH
Eu gerencio chaves SSH separadas para todos os hosts aos quais me conecto, para que, se alguma chave for comprometida, não seja necessário atualizá-las em todos os outros locais em que as usei. É como quando você recebe a notificação da Adobe de que 150 milhões das informações de seus usuários foram roubadas - agora é necessário cancelar o cartão de crédito e atualizar todos os serviços que dependem dele - que incômodo.
Aqui está a ~/.ssh
aparência do meu diretório: Eu tenho uma .pem
chave para cada usuário, em uma pasta para cada domínio ao qual me conecto. Eu uso .pem
chaves para que eu só precise de um arquivo por chave.
$ tree ~/.ssh
/Users/naomik/.ssh
├── config
├── github.com
│ ├── naomik.pem
│ ├── someusername.pem
├── known_hosts
├── naomi.makes.software
│ ├── naomi.pem
├── somedomain.com
│ ├── someuser.pem
└── someotherdomain.org
└── someuser.pem
E aqui está o meu /.ssh/config
arquivo correspondente - obviamente o material do github é relevante para responder a essa pergunta sobre o github, mas essa resposta tem como objetivo fornecer a você o conhecimento necessário para gerenciar suas identidades ssh em qualquer número de serviços / máquinas.
Host github.com-naomik
HostName github.com
User git
IdentityFile ~/.ssh/github.com/naomik.pem
Host github.com-someuser
HostName github.com
User git
IdentityFile ~/.ssh/github.com/someusername.pem
Host naomi.makes.software
User naomi
IdentityFile ~/.ssh/naomi.makes.software/naomi.pem
Host somedomain.com
HostName 162.10.20.30
User someuser
IdentityFile ~/.ssh/somedomain.com/someuser.pem
Host someotherdomain.org
User someuser
IdentityFile ~/.ssh/someotherdomain.org/someuser.pem
Obtendo sua chave pública SSH de uma chave PEM
Acima, você notou que só tenho um arquivo para cada chave. Quando preciso fornecer uma chave pública, simplesmente a gero conforme necessário.
Portanto, quando o github solicitar sua chave pública ssh, execute este comando para gerar a chave pública para stdout - copie / cole onde necessário
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAA...
Observe que este também é o mesmo processo usado para adicionar minha chave a qualquer máquina remota. O ssh-rsa AAAA...
valor é copiado para o ~/.ssh/authorized_keys
arquivo do controle remoto
Convertendo seus pares de chaves id_rsa
/ id_rsa.pub
no formato PEM
Então, você quer domar seus arquivos-chave e reduzir alguns problemas do sistema de arquivos? É fácil converter seu par de chaves em um único PEM
$ cd ~/.ssh
$ openssl rsa -in id_rsa -outform pem > id_rsa.pem
Ou, seguindo os exemplos acima, renomeamos id_rsa -> github-mainuser
e id_rsa.pub -> github-mainuser.pub
- então
$ cd ~/.ssh
$ openssl rsa -in github-mainuser -outform pem > github-mainuser.pem
Agora, apenas para garantir que convertemos isso corretamente, verifique se a chave pública gerada corresponde à sua chave pública antiga
# display the public key
$ cat github-mainuser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
# generate public key from your new PEM
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
Agora que você possui o seu github-mainuser.pem
arquivo, é possível excluir com segurança os arquivos github-mainuser
e os github-mainuser.pub
arquivos antigos - apenas o arquivo PEM é necessário; basta gerar a chave pública sempre que precisar ^ _ ^
Criando chaves PEM do zero
Você não precisa criar o par de chaves públicas / privadas e depois converter em uma única chave PEM. Você pode criar a chave PEM diretamente.
Vamos criar um newuser.pem
$ openssl genrsa -out ~/.ssh/newuser.pem 4096
Obter a chave pública SSH é o mesmo
$ ssh-keygen -y -f ~/.ssh/newuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACA ... FUNZvoKPRQ==
ssh-add ~/.ssh/id_rsa_COMPANY
<br/> para dizer ao ssh-agent para incluí-lo para uso. <hr /> Rest funciona bem para mim com o tutorial acima mencionado.