Câu hỏi Làm thế nào để nói với git mà khóa riêng để sử dụng?


ssh có -i tùy chọn để cho biết tệp khóa cá nhân nào sẽ sử dụng khi xác thực:

-i identity_file

    Chọn một tệp mà từ đó   danh tính (khóa riêng) để xác thực RSA hoặc DSA được đọc.   Mặc định là ~/.ssh/identity cho giao thức phiên bản 1,   và ~/.ssh/id_rsa và ~/.ssh/id_dsa cho giao thức phiên bản 2.   Các tệp danh tính cũng có thể được chỉ định trên cơ sở mỗi máy chủ   trong tệp cấu hình. Có thể có nhiều -i tùy chọn    (và nhiều danh tính được chỉ định trong các tệp cấu hình).

Có cách tương tự để nói git tệp khóa cá nhân nào để sử dụng trên hệ thống có nhiều khóa riêng tư trong ~/.ssh danh mục?


464
2018-01-12 18:20


gốc


Xem câu hỏi này trong StackOverflow cũng. - Flimm
Cũng liên quan serverfault.com/questions/194567/… - Machavity


Các câu trả lời:


Trong ~/.ssh/config, thêm vào:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

Bây giờ bạn có thể làm git clone git@github.com:username/repo.git.

LƯU Ý: Xác minh rằng các điều khoản trên IdentityFile là 400.SSH sẽ từ chối, theo cách không rõ ràng, các khóa SSH quá dễ đọc. Nó sẽ trông giống như một sự từ chối ủy nhiệm. Giải pháp, trong trường hợp này, là:

chmod 400 ~/.ssh/id_rsa_github

516
2018-01-12 19:36



Điều gì sẽ xảy ra nếu bạn cần kết nối với cùng một máy chủ với các khóa khác nhau? - Valentin Klinghammer
@Quelltextfabrik - bạn có thể thêm một phần khác với Máy chủ khác: nerderati.com/2011/03/… - Ben Challenor
@Cliff Nop, trong manpage của tôi: "HostName: Chỉ định tên máy chủ thực để đăng nhập. Điều này có thể được sử dụng để chỉ định biệt hiệu hoặc chữ viết tắt cho máy chủ. "Phiên bản ssh của tôi là openssh-6.7p1. - Grissiom
@Grissiom Đó chính xác là những gì nó nói. Nhưng bạn dường như hiểu ý nghĩa ngược. Host (hoặc Match) là bắt buộc. Để tạo biệt hiệu máy chủ, bạn đặt biệt hiệu trong dòng Máy chủ và tên máy chủ thực trong dòng Tên máy chủ. Ví dụ: saltycrane.com/blog/2008/11/… - Cliff
Nếu tệp cấu hình mới, đừng quên làm chmod 600 ~/.ssh/config - elysch


Biến môi trường GIT_SSH_COMMAND:

Từ phiên bản Git 2.3.0, bạn có thể sử dụng biến môi trường GIT_SSH_COMMAND như thế này:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

Lưu ý rằng -i đôi khi có thể bị ghi đè bởi tệp cấu hình của bạn, trong trường hợp này, bạn nên cung cấp cho SSH một tệp cấu hình trống, như sau:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Cấu hình core.sshCommand:

Từ phiên bản Git 2.10.0, bạn có thể định cấu hình cho mỗi repo hoặc trên toàn cầu, do đó bạn không phải đặt biến môi trường nữa!

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

216
2018-05-08 09:43



Tôi phải xuất vỏ biến thành biến môi trường để thực hiện công việc này, tức là export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example", sau đó git clone example - Abdull
@Abdull Trong Bash, thực hiện nhiệm vụ trên cùng một dòng khi lệnh xuất biến môi trường cho lệnh đó. Thử nó: example=hello /usr/bin/env | grep example. - Flimm
mọi thứ đã trở nên tốt hơn: như Git 2.10, bạn có thể lưu lệnh trong cấu hình Git của mình: stackoverflow.com/a/38474220/520162 - eckes
@Noitidart /dev/null chỉ là một tên tệp hợp lệ trong các hệ điều hành giống UNIX, nó không hoạt động trên Windows. - Flimm
Nếu bạn cần nhiều khóa, tham số -i có thể được lặp lại, và ssh sẽ thử mỗi khóa lần lượt. git config core.sshcommand "ssh -i /path/to/keyA -i /path/to/keyB". Điều này cho phép git sử dụng các khóa khác nhau với các máy chủ từ xa khác nhau. - Mark


Không thẳng thắn đường nói git khóa cá nhân nào để sử dụng, vì nó dựa vào ssh để xác thực kho lưu trữ. Tuy nhiên, vẫn còn một vài cách để đạt được mục tiêu của bạn:

Lựa chọn 1: ssh-agent

Bạn có thể dùng ssh-agent để tạm thời cho phép khóa cá nhân của bạn.

Ví dụ:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Lựa chọn 2: GIT_SSH_COMMAND

Vượt qua các đối số ssh bằng cách sử dụng GIT_SSH_COMMAND biến môi trường (Git 2.3.0+).

Ví dụ:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Bạn có thể nhập tất cả trên một dòng - bỏ qua $ và bỏ đi \.

Tùy chọn 3: GIT_SSH

Vượt qua các đối số ssh bằng cách sử dụng GIT_SSH biến môi trường để chỉ định thay thế ssh nhị phân.

Ví dụ:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

Lưu ý: Các dòng trên là các dòng lệnh shell (terminal) mà bạn nên dán vào terminal của bạn. Họ sẽ tạo một tệp có tên ssh, làm cho nó thực thi, và (gián tiếp) thực hiện nó.

Chú thích: GIT_SSH có sẵn từ v0.99.4 (2005).

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

Sử dụng ~/.ssh/config tệp như được đề xuất trong các câu trả lời khác để chỉ định vị trí của khóa riêng của bạn, ví dụ:

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

62
2018-01-23 22:08



//, Nếu danh tính của bạn trong ssh-agent được chuyển tiếp, mặc dù, như trong câu hỏi này? superuser.com/questions/971732/… - Nathan Basanese
Tôi đã cho phép tôi định dạng lại bài đăng này: IMO đây là câu trả lời toàn diện nhất. Trong thiết kế ban đầu của nó, một lần quét nhanh đề xuất bài đăng mô tả một giải pháp phức tạp duy nhất cho vấn đề, vì vậy tôi đã bỏ qua nó. - Alberto
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host' đã làm việc cho tôi khi không có gì khác. Thanh danh. - Daniel Dewhurst
Tôi đã phải sử dụng ~/.ssh/config phương pháp, env vars đã không làm việc cho tôi ... - Greg Dubicki
GIT_SSH có sẵn từ v0.99.4 (tháng 8 năm 2005), về cơ bản kể từ khi Git tồn tại (tháng 4 năm 2005). - Dominik


Viết kịch bản lệnh gọi ssh với các đối số bạn muốn và đặt tên tệp của tập lệnh vào $GIT_SSH. Hoặc chỉ cần đặt cấu hình của bạn ~/.ssh/config.


32
2018-01-12 18:25



Giải thích khác về cách thực hiện điều này. - Sithsu
~/.ssh/config Là các con đường để đi. - hek2mgl
Tôi làm việc trên một máy tính (A) mà từ đó tôi git đẩy đến một máy chủ (B) mà chỉ chấp nhận xác thực khóa ssh. Trong khi thiết lập ~ / .ssh / config của tôi trên (A) hoạt động hoàn toàn tốt khi tôi làm việc trực tiếp trên máy đó, nó không khi tôi đăng nhập từ một số vị trí khác (C). Sử dụng $GIT_SSH và một kịch bản đã giải quyết được vấn đề này. Cảm ơn! - bsumirak


Nếu bạn không muốn phải chỉ định biến môi trường mỗi khi bạn chạy git, không muốn một tập lệnh wrapper khác, không / không thể chạy ssh-agent (1), cũng không muốn tải xuống gói khác chỉ cho mục đích này, hãy sử dụng git -remote-ext (1) vận tải ngoài:

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

Tôi xem xét giải pháp này vượt trội vì:

  • Nó là kho lưu trữ / từ xa cụ thể
  • Tránh đoạn mã của trình bao bọc
  • Không cần tác nhân SSH - hữu ích nếu bạn muốn bản sao / push / pull không giám sát (ví dụ: trong cron)
  • Chắc chắn, không cần công cụ bên ngoài

14
2017-07-21 19:44



//, Giải pháp tuyệt vời. Tôi tự hỏi, mặc dù, nếu điều này sẽ cho phép một để xác định một danh tính thông qua sử dụng chuyển tiếp đại lý. Hầu hết các khóa của tôi không phải là cục bộ cho các máy chủ mà tôi đang sử dụng chúng. Tôi hỏi về điều này ở đây: superuser.com/questions/971732/… - Nathan Basanese
Câu trả lời chỉ đề cập đến một cách chỉ định các dòng lệnh tùy ý được sử dụng làm kho lưu trữ git. IMHO, bạn nên cố gắng phân loại vấn đề của mình bằng cách sử dụng ssh một mình trước (ví dụ: "ssh chủ nhà"nên kết nối bằng cách sử dụng phím bên phải). Tuy nhiên, tôi sẽ cố gắng cung cấp thêm thông tin về câu hỏi khác của bạn. - flaviovs
Câu trả lời này chính xác là những gì tôi cần để ép đầu bếp git tài nguyên để sử dụng các khóa triển khai dành riêng cho kho lưu trữ để sao chép / tìm nạp từ kho lưu trữ Github riêng tư. Ưu điểm bổ sung của phương thức này trên môi trường dựa trên kịch bản lệnh là vì khóa-đường dẫn được mã hóa trong cấu hình của trình repo làm việc, nó sẽ sử dụng cùng khóa trên cả bản sao ban đầu và các lần nạp / đẩy tiếp theo. - Adam Franco
WOW! Điều này thật tuyệt, không biết về điều này. Cảm ơn câu trả lời, khá hữu ích cũng như trong môi trường con rối, để ngăn chặn những rắc rối thêm để quản lý .ssh/config v.v. - gf_
Nếu bạn gặp phải lỗi sau fatal: transport 'ext' not allowed, bạn phải đưa vào danh sách trắng giao thức ext qua export GIT_ALLOW_PROTOCOL=ext. Về cơ bản, trình trợ giúp từ xa git-remote-ext (hỗ trợ "ext :: ssh example.com% S foo / repo" URL) cho phép thực thi lệnh tùy ý. Điều này thường không bao giờ là một mối quan tâm bởi vì người dùng luôn nhìn thấy và tin tưởng vào URL mà họ chuyển đến git. Tuy nhiên git submodules, thông qua tệp .gitmodules, cho phép kẻ tấn công yêu cầu khách hàng tìm nạp các URL git tùy ý. hackerone.com/reports/104465 - Gomino


Sau cuộc đấu tranh của tôi với $GIT_SSH Tôi muốn chia sẻ những gì làm việc cho tôi.

Thông qua các ví dụ của tôi, tôi sẽ giả định bạn có khóa riêng của mình tại/home/user/.ssh/jenkins

Lỗi cần tránh: Giá trị GIT_SSH bao gồm các tùy chọn

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

hoặc bất cứ điều gì tương tự sẽ thất bại, như git sẽ cố gắng thực thi giá trị dưới dạng tệp. Vì lý do đó, bạn phải tạo một kịch bản.

Ví dụ làm việc của kịch bản $ GIT_SSH /home/user/gssh.sh

Kịch bản lệnh sẽ được gọi như sau:

$ $GIT_SSH [username@]host [-p <port>] <command>

Kịch bản lệnh mẫu có thể hoạt động như sau:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

Lưu ý $* cuối cùng, nó là một phần quan trọng của nó.

Thay thế an toàn hơn, điều này sẽ ngăn chặn bất kỳ xung đột nào có thể xảy ra với bất kỳ thứ gì trong tệp cấu hình mặc định của bạn (cộng với việc đề cập rõ ràng cổng để sử dụng) sẽ là:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

Giả sử tập lệnh nằm trong /home/user/gssh.shthì bạn sẽ:

$ export GIT_SSH=/home/user/gssh.sh

và tất cả sẽ hoạt động.


13
2018-05-28 17:09



Cảm ơn. Chỉ cần lưu ý: sử dụng "$ @" thay vì $ * cho các đối số pass-thru, như trước đây hoạt động chính xác khi đối số chứa khoảng trắng. - Piotr Findeisen
@PiotrFindeisen Cảm ơn bạn đã lưu ý. Tuy nhiên, tôi không hiểu nó hoàn toàn - trong zsh nó giúp tôi giữ dây với không gian trong một mảnh, nhưng trong bash không. Bạn có thể cho tôi biết thêm hoặc chỉ cho một số lời giải thích? Tôi không muốn thêm một số sửa đổi một cách mù quáng. - Jan Vlcinsky
Bạn nên loại bỏ nửa đầu câu trả lời của mình. Không ai quan tâm đến một giải pháp không hoạt động, và nó lãng phí đọc mà obfuscates câu trả lời chính xác ở phía dưới, trong đó hoạt động tuyệt vời. - Cerin
@Cerin Nếu bạn muốn xóa "Lỗi để tránh", tôi sẽ giữ nó ở đó. Nó chia sẻ pitfall phổ biến để tránh và nó là rất ngắn. Tôi chắc chắn, ai đó sẽ cố gắng tối ưu hóa giải pháp bằng cách cung cấp tất cả mọi thứ vào biến (điều này xảy ra với tôi), vì vậy tôi đã cố gắng rút ngắn con đường thành công. - Jan Vlcinsky


Sử dụng cấu hình máy chủ lưu trữ tùy chỉnh trong ~/.ssh/config, như thế này:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

sau đó sử dụng tên máy chủ tùy chỉnh của bạn như sau:

git remote add thuc git@gitlab-as-thuc:your-repo.git  

6
2018-05-17 15:03



Đây là câu trả lời tôi đang tìm kiếm, vì tôi có các tài khoản GitHub riêng biệt cho nhà riêng và cơ quan. Tôi chỉ cần thiết lập Host work.github.com  HostName github.com  IdentityFile ~/.ssh/workvà sau đó thay thế "github.com" bằng "work.github.com" bất cứ khi nào tôi sao chép kho lưu trữ công việc. Nó vẫn kết nối với "github.com", nhưng sử dụng cặp khóa không mặc định. - Mikkel
URL để biết chi tiết ("itblog.study.land / ... ") không hoạt động nữa :( - Carl Smotricz


Bạn chỉ có thể sử dụng ssh-ident thay vì tạo trình bao bọc của riêng bạn.

Bạn có thể đọc thêm tại:    https://github.com/ccontavalli/ssh-ident

Nó tải các khóa ssh theo yêu cầu khi cần thiết đầu tiên, một lần, ngay cả với nhiều phiên đăng nhập, xterms hoặc NFS chung nhà.

Với một tệp cấu hình nhỏ, nó có thể tự động tải các khóa khác nhau và giữ chúng tách biệt trong các tác nhân khác nhau (để chuyển tiếp đại lý) tùy thuộc vào những gì bạn cần làm.


5
2018-03-23 01:35





Tôi có một khách hàng cần một tài khoản github riêng. Vì vậy, tôi cần sử dụng một khóa riêng cho dự án này.

Giải pháp của tôi là thêm cái này vào .zshrc / .bashrc của tôi:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

Bất cứ khi nào tôi muốn sử dụng git cho dự án đó, tôi thay thế "infogit" bằng git:

infogit commit -am "Some message" && infogit push

Đối với tôi, nó dễ nhớ hơn.


4
2018-03-26 19:26