Nhiều tài khoản GitHub & Cấu hình SSH


249

Tôi gặp một số khó khăn khi có hai khóa SSH / tài khoản GitHub khác nhau để chơi tốt với nhau. Tôi có các thiết lập sau:

Repos có thể truy cập từ một tài khoản bằng git@github.com:accountname

Repos có thể truy cập từ một tài khoản khác bằng cách sử dụng git@github.com:anotheraccount

Mỗi tài khoản có khóa SSH riêng. Cả hai khóa SSH đã được thêm vào và tôi đã tạo một tệp cấu hình. Tôi không tin rằng tập tin cấu hình là chính xác mặc dù. Tôi không chắc chắn làm thế nào để xác định rằng các repos được truy cập bằng cách sử dụng git@github.com:accountnamenên sử dụng id_rsagit@github.com:anotheraccountnên sử dụng id_rsa_anotheraccount.


Tôi tìm thấy liên kết này hữu ích vừa.freecodecamp.org / từ
jreen

Tôi có 3 danh tính SSH riêng biệt trong ~ / .ssh / config. Một cho máy chủ trường học có một mật mã; 2 cho các tài khoản GitHub cá nhân / công việc riêng biệt thì không. Chạy liên git pulltục thất bại và yêu cầu mật mã trường, mặc dù các tệp Nhận dạng riêng biệt, "Danh tính riêng = có", tên miền và tên máy chủ riêng biệt, tất cả đều có trong ssh-add -l... Khóa uni là 'đầu tiên' bất kể thiết lập đó. Phải di chuyển phần của nó bên dưới các phần khác trong .ssh / config và bây giờ git pulltừ cả hai accit GitHub đều thành công khi yêu cầu mật khẩu uni ssh.
mc01

Câu trả lời:


309

Phản hồi của Andy Lester là chính xác nhưng tôi đã tìm thấy một bước bổ sung quan trọng mà tôi cần phải thực hiện để thực hiện điều này. Khi cố gắng thiết lập hai hồ sơ, một cho cá nhân và một cho công việc, tôi ~/.ssh/configđại khái như sau:

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

Hồ sơ công việc của tôi đã không mất cho đến khi tôi đã làm một ssh-add ~/.ssh/work_rsa. Sau đó, các kết nối đến github đã sử dụng đúng cấu hình. Trước đây họ mặc định là khóa công khai đầu tiên.

Để không thể mở kết nối đến đại lý xác thực của bạn khi sử dụng ssh-add,
hãy kiểm tra: https://stackoverflow.com/a/17695338/1760313


39
Cảm ơn! - đó ssh-addlà những gì tôi đã thiếu.
hiền nhân

Bằng cách sử dụng ssh-add, tôi có thể thấy rằng tôi không có quyền truy cập tệp cho khóa được đặt chính xác. Khi tôi sửa nó, mọi thứ đều hoạt động. Vì vậy, cảm ơn!
phatmann

6
Xem thêm doblock.com/articles/ trên . Thông tin mới quan trọng là bạn có thể cần thêm tên người dùng ("công việc", trong ví dụ này) vào tên máy chủ trong URL từ xa, ví dụ: git@work.github.com: work / my_Vpo.git (như trái ngược với "git@github.com ...")
BobS


15
Để khắc phục sự cố "họ mặc định là khóa chung đầu tiên", hãy thêm IdentitiesOnly yesvào Host *phần ~/.ssh/configtệp của bạn . Điều này nói với ssh thực sự sử dụng các IdentityFiles mà bạn chỉ định, thay vì spam máy chủ với tất cả chúng.
Ốc cơ khí

172

Gần đây tôi đã phải làm điều này và phải sàng lọc tất cả các câu trả lời và nhận xét của họ để cuối cùng ghép thông tin lại với nhau, vì vậy tôi sẽ đặt tất cả ở đây, trong một bài đăng, để thuận tiện cho bạn:


Bước 1: Phím ssh
Tạo bất kỳ bàn phím nào bạn cần. Trong ví dụ này, tôi đã đặt tên cho tôi là 'id_rsa' (là mặc định) và tên mới 'id_rsa-work':

ssh-keygen -t rsa -C "stefano@work.com"


Bước 2: ssh config
Thiết lập nhiều cấu hình ssh bằng cách tạo / sửa đổi ~ / .ssh / config . Lưu ý các giá trị 'Máy chủ' hơi khác nhau:

# 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


Bước 3: ssh-add
Bạn có thể hoặc không phải làm điều này. Để kiểm tra, liệt kê dấu vân tay nhận dạng bằng cách chạy:

$ 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 stefano@work.com (RSA)

Nếu mục của bạn không có ở đó thì hãy chạy:

ssh-add ~/.ssh/id_rsa_work


Bước 4: kiểm tra
Để kiểm tra xem bạn đã thực hiện đúng tất cả chưa, tôi đề nghị kiểm tra nhanh sau đây:

$ ssh -T git@github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@work.github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

Lưu ý rằng bạn sẽ phải thay đổi tên máy chủ (github / work.github) tùy thuộc vào khóa / danh tính bạn muốn sử dụng. Nhưng bây giờ bạn nên đi thật tốt! :)


1
Đây là một phản ứng tuyệt vời. Tôi đã phải sử dụng ssh-add để thêm cả hai phím ssh để sử dụng tệp cấu hình .. Cảm ơn :)
gaurav.singharoy

Điều duy nhất tôi muốn thêm là khi bạn chạy ssh-keygen -t rsa, nó sẽ cung cấp cho bạn một tên tệp mặc định, đó là nơi bạn nhập tên tệp tùy chỉnh của mình.
Donato

Một trong những câu trả lời hay nhất. Ngoài ra video này đã giúp tôi. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
Kiểm traWithArif

Bài đăng tốt, sẽ rất tuyệt nếu bài đăng này bao gồm cài đặt git config 'email' của bạn: help.github.com/articles/ mẹo
Kỹ sư Dave

43

Giả sử alicelà một người dùng github.com, có 2 kho lưu trữ riêng tư trở lên repoN. Trong ví dụ này, chúng tôi sẽ làm việc chỉ với hai kho lưu trữ có tên repo1repo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Bạn cần phải lấy từ các kho lưu trữ này mà không cần nhập mật khẩu có thể trên một máy chủ hoặc trên nhiều máy chủ. Bạn muốn thực hiện git pull origin masterchẳng hạn, và bạn muốn điều này xảy ra mà không cần hỏi mật khẩu.

Bạn không thích giao dịch với ssh-agent, bạn đã phát hiện (hoặc bạn đang khám phá ngay bây giờ) về ~/.ssh/configmột tệp cho phép khách hàng ssh của bạn biết sử dụng khóa riêng nào tùy thuộc vào Tên máy chủ và tên người dùng, với mục nhập cấu hình đơn giản trông giống như điều này:

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

Vì vậy, bạn đã tiếp tục và tạo ra (alice_github.id_rsa, alice_github.id_rsa.pub)cặp khóa của mình , sau đó bạn cũng đã đi đến .git/configtệp của kho lưu trữ của mình và bạn đã sửa đổi url của điều khiển từ xa của bạn originthành một cái gì đó như thế này:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

Và cuối cùng bạn đã đi đến phần kho lưu trữ Settings > Deploy keysvà thêm nội dung củaalice_github.id_rsa.pub

Tại thời điểm này, bạn có thể làm git pull origin mastermà không cần nhập mật khẩu mà không có vấn đề.

Nhưng còn kho thứ hai thì sao?

Vì vậy, bản năng của bạn sẽ là lấy khóa đó và thêm nó vào repo2các khóa Triển khai, nhưng github.com sẽ báo lỗi và cho bạn biết rằng khóa đó đã được sử dụng.

Bây giờ bạn đi và tạo một khóa khác ( ssh-keygen -t rsa -C "alice@alice.com"dĩ nhiên không sử dụng mật khẩu) và để điều này không trở thành một mớ hỗn độn, bây giờ bạn sẽ đặt tên cho các khóa của mình như thế này:

  • repo1 móc khóa: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 móc khóa: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Bây giờ bạn sẽ đặt khóa công khai mới vào repo2cấu hình Khóa triển khai tại github.com, nhưng bây giờ bạn có vấn đề về ssh.

Làm thế nào ssh có thể cho biết khóa nào sẽ được sử dụng nếu kho được lưu trữ trên cùng một github.comtên miền?

Tệp của bạn .ssh/configtrỏ đến github.comvà nó không biết nên sử dụng phím nào khi đến lúc thực hiện thao tác kéo.

Vì vậy, tôi tìm thấy một mẹo với github.com. Bạn có thể nói với khách hàng ssh của mình rằng mỗi kho lưu trữ nằm trong một tên miền phụ github.com khác nhau, trong những trường hợp này, chúng sẽ repo1.github.comrepo2.github.com

Vì vậy, điều đầu tiên là chỉnh sửa các .git/configtệp trên bản sao repo của bạn, để chúng trông giống như thế này:

Đối với repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

Đối với repo2

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

Và sau đó, trên .ssh/configtệp của bạn , bây giờ bạn sẽ có thể nhập cấu hình cho từng tên miền phụ :)

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

Bây giờ bạn có thể git pull origin mastermà không cần nhập bất kỳ mật khẩu từ cả hai kho lưu trữ.

Nếu bạn có nhiều máy, bạn có thể sao chép các phím vào từng máy và sử dụng lại chúng, nhưng tôi khuyên bạn nên thực hiện công việc chân để tạo 1 khóa cho mỗi máy và repo. Bạn sẽ có nhiều chìa khóa hơn để xử lý, nhưng bạn sẽ ít bị tổn thương hơn nếu bị xâm phạm.


1
Chỉ định tên miền phụ phù hợp với máy chủ lưu trữ .ssh/configlà bước quan trọng - cảm ơn rất nhiều vì điều đó
Mike Miller

22

Tôi có 2 tài khoản trên github và đây là những gì tôi đã làm (trên linux) để làm cho nó hoạt động.

Chìa khóa

  • Tạo 2 cặp khóa rsa, thông qua ssh-keygen, đặt tên cho chúng đúng cách để cuộc sống dễ dàng hơn.
  • Thêm khóa riêng cho đại lý địa phương thông qua ssh-add path_to_private_key
  • Đối với mỗi tài khoản github, tải lên khóa chung (riêng).

Cấu hình

~ / .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

Đặt url từ xa cho repo:

  • Đối với repo trong Host github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • Đối với repo trong máy chủ github-abc:

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

Giải thích

Tùy chọn trong ~/.ssh/config :

  • Hostgithub- <nhận dạng_specific_user>
    Máy chủ có thể là bất kỳ giá trị nào có thể xác định máy chủ cộng với tài khoản, không cần phải là máy chủ thực sự, ví dụ: github-kcxác định một trong những tài khoản của tôi trên github cho máy tính xách tay cục bộ của tôi,

    Khi đặt url từ xa cho repo git, đây là giá trị cần đặt sau git@, đó là cách repo ánh xạ tới Máy chủ, ví dụ:git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Sau đây là các tùy chọn phụ của Host]
  • Hostname
    chỉ định tên máy chủ thực tế, chỉ cần sử dụng github.com cho github,
  • Usergit
    người dùng luôngit dành cho github,
  • IdentityFile
    chỉ định khóa để sử dụng, chỉ cần đặt đường dẫn là khóa chung,
  • LogLevel
    chỉ định mức ghi nhật ký để gỡ lỗi, nếu có vấn đề, DEBUG3cung cấp thông tin chi tiết nhất.


đáng yêu - không cần ssh-add path_to_private_key- có lẽ vì tác nhân không bắt buộc trong trường hợp này. Các tập tin cấu hình được xác định rõ ràng đường dẫn đến các phím.
Mark Chackerian

2
@MarkChackerian Tôi nghĩ rằng bạn không cần ssh-addvì các khóa của bạn không được bảo vệ bằng mật khẩu hoặc (nếu bạn sử dụng máy Mac), móc khóa OSX đang xử lý nó cho bạn. ssh-addngăn bạn không cần nhập cụm mật khẩu mỗi khi bạn truy cập khóa.
Ashhar Hasan

18

Sử dụng IdentityFiletham số trong ~/.ssh/config:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance

Cảm ơn nhưng điều này không hoàn toàn chính xác. Tôi tìm thấy câu trả lời và chia sẻ dưới đây.
radesix

Tôi khá chắc chắn rằng phương pháp của tôi sẽ làm việc trong trường hợp của bạn. Bạn có thể xác định người dùng khác nhau và các tập tin nhận dạng khác nhau. Chỉ cần cung cấp cho mỗi tham số Host khác nhau trên khổ cấu hình.
Andy Lester

1
Andy, theo liên kết tôi tìm thấy bên dưới, tôi cần phải bỏ tên miền từ máy chủ. Một khi tôi đã làm điều đó nó hoạt động tốt.
radesix

5

Một cách khác có thể đơn giản hơn để chỉnh sửa tệp cấu hình ssh (như được đề xuất trong tất cả các câu trả lời khác), là định cấu hình một kho lưu trữ riêng để sử dụng khóa ssh khác (ví dụ: không mặc định).

Trong kho lưu trữ mà bạn muốn sử dụng một khóa khác, hãy chạy:

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

Và đảm bảo, khóa của bạn được thêm vào ssh-agent, bằng cách chạy:

ssh-add ~/.ssh/id_rsa_anotheraccount

Hãy nhớ rằng lệnh trên sẽ chỉ thêm khóa vào tác nhân ssh cho phiên hiện tại của bạn. Nếu bạn muốn nó hoạt động mãi mãi, bạn phải "vĩnh viễn" thêm nó vào ssh-agent của bạn. Ví dụ: đây là cách thực hiện cho Ubuntu và ở đây cho OSX .

Cũng có thể mở rộng cách tiếp cận này tới nhiều kho lưu trữ bằng cách sử dụng cấu hình git toàn cầu và bao gồm điều kiện ( xem ví dụ ).


4

Trong trường hợp của tôi, không có giải pháp nào ở trên giải quyết được vấn đề của tôi, nhưng ssh-agent thì có. Về cơ bản, tôi đã làm như sau:

  1. Tạo cặp khóa bằng ssh-keygen được hiển thị bên dưới. Nó sẽ tạo ra một cặp khóa (trong ví dụ này .\keyfile.\keyfile.pub)

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

  2. Tải lên keyfile.pub nhà cung cấp git

  3. Bắt đầu ssh-agent trên máy của bạn (bạn có thể kiểm tra với ps -ef | grep ssh-agent xem nó đã chạy chưa)
  4. Chạy ssh-add .\keyfile để thêm thông tin đăng nhập
  5. Bây giờ bạn có thể chạy git clone git@provider:username/project.git

4

Tôi đã dành rất nhiều thời gian để hiểu tất cả các bước. Vì vậy, hãy mô tả từng bước:

  1. Tạo tập tin nhận dạng mới bằng cách sử dụng ssh-keygen -t rsa. Cung cấp cho nó một cách thay thế proj1.id_rsavà nhấn mà không nghi ngờ gì vì bạn không cần cụm mật khẩu.
  2. Thêm phần mới vào .ssh/config:

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

Hãy tính đến phần đầu tiên và lưu ý rằng proj1.github.comchúng tôi sẽ quay lại phần sau.

  1. Thêm danh tính cho đại lý ssh ssh-add ~/.ssh/proj1.id_rsa
  2. Đó là những gì tôi đã làm hỏng lần đầu tiên - bây giờ khi bạn muốn sao chép một repo proj1 bạn thực hiện bằng cách sử dụng proj1.github.com(chính xác là máy chủ từ tệp cấu hình). git clone git@proj1.github.com.

Một hướng dẫn tốt.

Đừng gây rối với chủ nhà


Cảm ơn các liên kết đến các turorial! Bạn có một lỗi đánh máy: tên chính id_rsa_proj1proj1_id_rsathực sự phải giống nhau. Bạn cũng có thể thêm phần về .git/configcài đặt từ hướng dẫn vào câu trả lời của bạn.
cezar

Bạn vẫn có một lỗi đánh máy: proj1.id_rsavs.proj1_id_rsa
cezar 2/218

2

Tôi đã sử dụng

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User abc@gmail.com

Nó khóc tốt.

Sử dụng cài đặt ở trên trong tệp .ssh / config của bạn cho các khóa rsa khác nhau cho các tên người dùng khác nhau.


2

Để bổ sung cho câu trả lời của @stefano, tốt hơn là sử dụng lệnh -fkhi tạo khóa SSH mới cho tài khoản khác,

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"

id_rsa_worktệp không tồn tại trong đường dẫn ~/.ssh/và tôi tạo tệp này theo cách thủ công và nó không hoạt động :(


2

Tôi đã đăng kỹ thuật tôi sử dụng để đối phó với những điều này ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.