Beberapa Akun GitHub & Konfigurasi SSH

249

Saya mengalami masalah dalam mendapatkan dua kunci SSH / akun GitHub yang berbeda untuk bermain bersama dengan baik. Saya memiliki pengaturan berikut:

Repos dapat diakses dari satu akun menggunakan [email protected]:accountname

Repos dapat diakses dari akun lain menggunakan [email protected]:anotheraccount

Setiap akun memiliki kunci SSH sendiri. Kedua kunci SSH telah ditambahkan dan saya telah membuat file konfigurasi. Saya tidak percaya file konfigurasi sudah benar. Saya tidak yakin bagaimana menentukan bahwa repo yang diakses menggunakan [email protected]:accountnameharus digunakan id_rsadan [email protected]:anotheraccountharus digunakan id_rsa_anotheraccount.

radesix
sumber
Saya menemukan tautan ini bermanfaat medium.freecodecamp.org/...
jgreen
Saya memiliki 3 identitas SSH yang terpisah di ~ / .ssh / config. Server sekolah satu memiliki kode sandi; 2 untuk pekerjaan terpisah / akta GitHub pribadi tidak. Menjalankan git pullterus gagal & meminta kode sandi sekolah, meskipun file Identitas terpisah, "IdentitiesOnly = yes," domain & Hostname terpisah, semuanya ada di ssh-add -l... Kunci uni adalah 'pertama' terlepas dari pengaturan itu. Harus memindahkan bagiannya di bawah yang lain di .ssh / config, dan sekarang git pulldari kedua akta GitHub berhasil tanpa meminta kata sandi uni ssh.
mc01

Jawaban:

309

Respons Andy Lester akurat tetapi saya menemukan langkah tambahan penting yang saya perlukan untuk membuatnya bekerja. Dalam mencoba menyiapkan dua profil, satu untuk pribadi dan satu untuk pekerjaan, ~/.ssh/configkira-kira saya kira-kira sebagai berikut:

Host me.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/me_rsa

Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/work_rsa

Profil pekerjaan saya tidak mengambil sampai saya melakukan ssh-add ~/.ssh/work_rsa. Setelah itu koneksi ke github menggunakan profil yang benar. Sebelumnya mereka default ke kunci publik pertama.

Untuk Tidak dapat membuka koneksi ke agen otentikasi Anda saat menggunakan ssh-add,
periksa: https://stackoverflow.com/a/17695338/1760313

Jim Wrubel
sumber
39
Terima kasih! - ssh-addadalah apa yang saya lewatkan.
bijak
Dengan menggunakan ssh-add, saya dapat melihat bahwa saya tidak memiliki izin file untuk set kunci dengan benar. Setelah saya perbaiki semuanya bekerja. Jadi terima kasih!
phatmann
6
Lihat juga doblock.com/articles/… . Bagian penting baru dari info di sana adalah bahwa Anda mungkin perlu menambahkan nama pengguna ("work", dalam contoh ini) ke nama host di URL jarak jauh, yaitu, [email protected]: work / my_repo.git (seperti menentang "[email protected] ...")
BobS
Ini berfungsi: superuser.com/questions/232373/…
Casey
15
Untuk memperbaiki masalah yang "mereka default ke kunci publik pertama", tambahkan IdentitiesOnly yeske Host *bagian ~/.ssh/configfile Anda . Ini memberitahu ssh untuk benar-benar menggunakan IdentityFiles yang Anda tentukan, daripada mengirim spam ke server dengan semuanya.
Siput mekanik
172

Baru-baru ini saya harus melakukan ini dan harus menyaring semua jawaban ini dan komentar mereka untuk akhirnya mengumpulkan informasi, jadi saya akan meletakkan semuanya di sini, dalam satu posting, untuk kenyamanan Anda:


Langkah 1: tombol ssh
Buat keypairs yang Anda perlukan. Dalam contoh ini saya telah menamai saya default / asli 'id_rsa' (yang merupakan default) dan yang baru saya 'id_rsa-work':

ssh-keygen -t rsa -C "[email protected]"


Langkah 2: ssh config
Atur beberapa profil ssh dengan membuat / memodifikasi ~ / .ssh / config . Perhatikan nilai 'Host' yang sedikit berbeda:

# Default GitHub
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# Work GitHub
Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_work


Langkah 3: ssh-add
Anda mungkin atau mungkin tidak perlu melakukan ini. Untuk memeriksa, daftarkan sidik jari identitas dengan menjalankan:

$ ssh-add -l
2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA)
2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f [email protected] (RSA)

Jika entri Anda tidak ada maka jalankan:

ssh-add ~/.ssh/id_rsa_work


Langkah 4: uji
Untuk menguji Anda telah melakukan ini dengan benar, saya sarankan pemeriksaan cepat berikut:

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

Perhatikan bahwa Anda harus mengubah nama host (github / work.github) tergantung pada kunci / identitas apa yang ingin Anda gunakan. Tapi sekarang kamu harus baik-baik saja! :)

stefano
sumber
1
Ini respons yang bagus. Saya harus menggunakan ssh-add untuk menambahkan kedua kunci ssh untuk menggunakan file konfigurasi .. Terima kasih :)
gaurav.singharoy
Satu-satunya hal yang ingin saya tambahkan adalah ketika Anda menjalankan ssh-keygen -t rsa, itu akan memberi Anda nama file default, di situlah Anda memasukkan nama file kustom Anda.
Donato
Salah satu jawaban terbaik. Video ini juga membantu saya. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif
Posting yang bagus, akan lebih baik jika posting ini termasuk pengaturan 'email' konfigurasi git Anda: help.github.com/articles/…
Dave Engineer
43

Katakanlah aliceadalah pengguna github.com, dengan 2 atau lebih repositori pribadi repoN. Untuk contoh ini kita akan bekerja hanya dengan dua repositori bernama repo1danrepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Anda harus menarik dari repositori ini tanpa memasukkan kata sandi yang mungkin di server, atau di beberapa server. Anda ingin melakukan git pull origin mastermisalnya, dan Anda ingin ini terjadi tanpa meminta kata sandi.

Anda tidak suka berurusan dengan ssh-agent, Anda telah menemukan (atau Anda sedang menemukan sekarang) tentang ~/.ssh/configfile yang membuat klien ssh Anda tahu apa kunci pribadi untuk digunakan tergantung pada Hostname dan nama pengguna, dengan entri konfigurasi sederhana yang terlihat seperti ini:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

Jadi Anda pergi ke depan dan membuat (alice_github.id_rsa, alice_github.id_rsa.pub)keypair Anda, Anda kemudian juga pergi ke .git/configfile repositori Anda dan Anda memodifikasi url dari remote Anda originmenjadi sesuatu seperti ini:

[remote "origin"]
        url = "ssh://[email protected]/alice/repo1.git"

Dan akhirnya Anda pergi ke bagian repositori Settings > Deploy keysdan menambahkan kontenalice_github.id_rsa.pub

Pada titik ini Anda dapat melakukan git pull origin mastertanpa memasukkan kata sandi tanpa masalah.

tapi bagaimana dengan repositori kedua?

Jadi insting Anda adalah untuk mengambil kunci itu dan menambahkannya ke repo2kunci Deploy, tetapi github.com akan kesalahan dan memberi tahu Anda bahwa kunci tersebut sudah digunakan.

Sekarang Anda pergi dan menghasilkan kunci lain (menggunakan ssh-keygen -t rsa -C "[email protected]"tanpa kata sandi tentu saja), dan agar ini tidak menjadi berantakan, Anda sekarang akan memberi nama kunci Anda seperti ini:

  • repo1 keypair: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 keypair: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Anda sekarang akan meletakkan kunci publik baru repo2di konfigurasi Menyebarkan kunci di github.com, tetapi sekarang Anda memiliki masalah ssh untuk ditangani.

Bagaimana ssh dapat mengetahui kunci mana yang digunakan jika repositori di-host pada github.comdomain yang sama ?

.ssh/configFile Anda menunjuk ke github.comdan tidak tahu kunci mana yang digunakan ketika saatnya melakukan tarikan.

Jadi saya menemukan trik dengan github.com. Anda dapat memberi tahu klien ssh Anda bahwa setiap repositori tinggal di subdomain github.com yang berbeda, dalam hal ini, mereka akan repo1.github.comdanrepo2.github.com

Jadi hal pertama adalah mengedit .git/configfile pada klon repo Anda, jadi mereka terlihat seperti ini sebagai gantinya:

Untuk repo1

[remote "origin"]
        url = "ssh://[email protected]/alice/repo1.git"

Untuk repo2

[remote "origin"]
        url = "ssh://[email protected]/alice/repo2.git"

Dan kemudian, pada .ssh/configfile Anda , sekarang Anda akan dapat memasukkan konfigurasi untuk setiap subdomain :)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

Sekarang Anda dapat git pull origin mastertanpa memasukkan kata sandi dari kedua repositori.

Jika Anda memiliki beberapa mesin, Anda bisa menyalin kunci ke masing-masing mesin dan menggunakannya kembali, tetapi saya menyarankan melakukan pekerjaan kaki untuk menghasilkan 1 kunci per mesin dan repo. Anda akan memiliki lebih banyak kunci untuk ditangani, tetapi Anda tidak akan terlalu rentan jika seseorang dikompromikan.

Gubatron
sumber
1
Menentukan subdomain yang cocok dengan host .ssh/configadalah langkah penting - terima kasih banyak untuk itu
Mike Miller
22

Saya memiliki 2 akun di github, dan inilah yang saya lakukan linuxuntuk membuatnya bekerja.

Kunci

  • Buat 2 pasang kunci rsa, via ssh-keygen, beri nama dengan benar, sehingga memudahkan hidup.
  • Tambahkan kunci pribadi ke agen lokal melalui ssh-add path_to_private_key
  • Untuk setiap akun github, unggah kunci publik (berbeda).

Konfigurasi

~ / .ssh / config

Host github-kc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_kc.pub
    # LogLevel DEBUG3

Host github-abc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_abc.pub
    # LogLevel DEBUG3

Setel url jarak jauh untuk repo:

  • Untuk repo di Host github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • Untuk repo di Host github-abc:

    git remote set-url origin git@github-abc:abcdefg/yyy.git
    

Penjelasan

Opsi dalam ~/.ssh/config:

  • Hostgithub- <identify_specific_user>
    Host dapat berupa nilai apa pun yang dapat mengidentifikasi host plus akun, itu tidak perlu menjadi host nyata, misalnya github-kcmengidentifikasi salah satu akun saya di github untuk laptop lokal saya,

    Saat mengatur url jarak jauh untuk git repo, ini adalah nilai yang harus dicari git@ , itulah cara repo memetakan ke Host, mis.git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Berikut ini adalah sub opsi dari Host]
  • Hostname
    tentukan nama host yang sebenarnya, cukup gunakan github.comuntuk github,
  • User git
    pengguna selalu gituntuk github,
  • IdentityFile
    tentukan kunci yang akan digunakan, cukup letakkan jalur tersebut sebagai kunci publik,
  • LogLevel
    tentukan level log untuk debug, jika ada masalah, DEBUG3berikan info paling detail.

Eric Wang
sumber
indah - tidak perlu ssh-add path_to_private_key- mungkin karena agen tidak diharuskan dalam kasus ini. File config secara eksplisit mendefinisikan jalur ke kunci.
Mark Chackerian
2
@ MarkChackerian Saya pikir Anda tidak perlu ssh-addkarena kunci Anda tidak dilindungi kata sandi atau (jika Anda menggunakan Mac) gantungan kunci OSX yang menanganinya untuk Anda. ssh-addmencegah Anda dari keharusan memasukkan kata sandi setiap kali Anda mengakses kunci Anda.
Ashhar Hasan
18

Gunakan IdentityFileparameter di ~/.ssh/config:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance
Andy Lester
sumber
Terima kasih tetapi ini tidak cukup akurat. Saya menemukan jawabannya dan membagikannya di bawah.
radesix
Saya cukup yakin pendekatan saya akan berhasil dalam kasus Anda. Anda dapat mengidentifikasi pengguna yang berbeda dan file identitas yang berbeda. Hanya perlu memberikan masing-masing parameter Host yang berbeda pada stanza konfigurasi.
Andy Lester
1
Andy, menurut tautan yang saya temukan di bawah ini, saya perlu menjatuhkan .com dari tuan rumah. Setelah saya lakukan itu bekerja dengan baik.
radesix
5

Alternatif yang mungkin lebih sederhana untuk mengedit file konfigurasi ssh (seperti yang disarankan dalam semua jawaban lain), adalah mengonfigurasi repositori individual untuk menggunakan kunci ssh yang berbeda (misalnya non-default).

Di dalam repositori yang ingin Anda gunakan kunci yang berbeda, jalankan:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'

Dan pastikan, kunci Anda ditambahkan ke ssh-agent, dengan menjalankan:

ssh-add ~/.ssh/id_rsa_anotheraccount

Perlu diingat bahwa perintah di atas hanya akan menambahkan kunci ke ssh-agent untuk sesi Anda saat ini. Jika Anda ingin ini berfungsi selamanya, Anda harus "secara permanen" menambahkannya ke ssh-agent Anda. Misal inilah cara melakukannya untuk ubuntu dan di sini untuk OSX .

Seharusnya juga memungkinkan untuk skala pendekatan ini ke beberapa repositori menggunakan konfigurasi git global dan kondisional termasuk ( lihat contoh ).

Jakub Kukul
sumber
4

Dalam kasus saya, tidak ada solusi di atas yang menyelesaikan masalah saya, tetapi ssh-agent tidak. Pada dasarnya, saya melakukan yang berikut:

  1. Hasilkan pasangan kunci menggunakan ssh-keygen yang ditunjukkan di bawah ini. Ini akan menghasilkan pasangan kunci (dalam contoh ini .\keyfiledan .\keyfile.pub)

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. Unggah keyfile.pubke penyedia git

  3. Mulai ssh-agent di mesin Anda (Anda dapat memeriksanya ps -ef | grep ssh-agentuntuk melihat apakah sudah berjalan)
  4. Jalankan ssh-add .\keyfileuntuk menambahkan kredensial
  5. Sekarang kamu bisa lari git clone git@provider:username/project.git
berniey
sumber
4

Saya menghabiskan banyak waktu untuk memahami semua langkah. Jadi mari kita jelaskan langkah demi langkah:

  1. Buat file identitas baru menggunakan ssh-keygen -t rsa. Berikan alternatif suka proj1.id_rsadan pukul tanpa ragu karena Anda tidak memerlukan kata sandi.
  2. Tambahkan bagian baru di .ssh/config:

    Host proj1.github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/proj1.id_rsa
    

Pertimbangkan bagian pertama dan perhatikan bahwa proj1.github.comkami akan kembali ke bagian nanti.

  1. Tambahkan identitas ke agen ssh ssh-add ~/.ssh/proj1.id_rsa
  2. Itu yang saya berantakan pertama kali - sekarang ketika Anda ingin mengkloning repo proj1 Anda melakukannya menggunakan proj1.github.com(persis host dari file config). git clone [email protected].

Tutorial yang bagus.

Jangan mengacaukan host

I159
sumber
Terima kasih untuk tautan ke turorial! Anda memiliki kesalahan ketik: nama-nama kunci id_rsa_proj1dan proj1_id_rsaharus benar-benar sama. Anda juga bisa menambahkan bagian tentang .git/configpengaturan dari tutorial ke jawaban Anda.
cezar
Anda masih memiliki salah ketik: proj1.id_rsavs.proj1_id_rsa
cezar
2

Saya menggunakan,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User [email protected]

Itu baik-baik saja wokred.

Gunakan pengaturan di atas dalam file .ssh / config Anda untuk kunci rsa yang berbeda untuk nama pengguna yang berbeda.

Jyoti Prakash
sumber
2

Sebagai pelengkap jawaban @stefano, Lebih baik menggunakan perintah -fketika membuat kunci SSH baru untuk akun lain,

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "[email protected]"

Karena id_rsa_workfile tidak ada di jalur ~/.ssh/, dan saya membuat file ini secara manual, dan itu tidak berfungsi :(

li2
sumber
2

Saya memposting teknik yang saya gunakan untuk menangani ini di sini

David H
sumber