tra-loi-cau-hoi-phat-trien-web.com

Làm cách nào để chỉ định khóa SSH riêng để sử dụng khi thực hiện lệnh Shell trên Git?

Một tình huống khá bất thường có lẽ, nhưng tôi muốn chỉ định khóa SSH riêng để sử dụng khi thực hiện lệnh Shell (git) từ máy tính cục bộ.

Về cơ bản như thế này: 

git clone [email protected]:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

Hoặc thậm chí tốt hơn (trong Ruby):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone [email protected]:TheUser/TheProject.git")
end

Tôi đã thấy các ví dụ về kết nối với máy chủ từ xa bằng Net :: SSH sử dụng khóa riêng được chỉ định, nhưng đây là lệnh cục bộ. Có thể không?

811
Christoffer

Một cái gì đó như thế này sẽ hoạt động (được đề xuất bởi orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'

nếu bạn thích subshells, bạn có thể thử cách sau (mặc dù nó dễ vỡ hơn):

ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)

Git sẽ gọi SSH sẽ tìm tác nhân của nó theo biến môi trường; lần lượt, nó sẽ có khóa được tải.

Ngoài ra, cài đặt HOME cũng có thể thực hiện thủ thuật, miễn là bạn sẵn sàng thiết lập thư mục chỉ chứa thư mục .sshHOME; cái này có thể chứa một tập tin id.pub hoặc tập tin config settings IdentityFile.

610
Martin v. Löwis

Không có giải pháp nào trong số này làm việc cho tôi. 

Thay vào đó, tôi giải thích chi tiết về @Martin v. Löwis đề cập đến việc thiết lập tệp config cho SSH.

SSH sẽ tìm tệp ~/.ssh/config của người dùng. Tôi có thiết lập của tôi là:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

Và tôi thêm một kho git từ xa:

git remote add Origin [email protected]:myrepo.git

Và sau đó các lệnh git hoạt động bình thường đối với tôi.

git Push -v Origin master

GHI CHÚ

  • IdentitiesOnly yes được yêu cầu để ngăn chặn hành vi mặc định của SSH gửi tệp nhận dạng khớp với tên tệp mặc định cho mỗi giao thức. Nếu bạn có một tệp có tên ~/.ssh/id_rsa sẽ được dùng thử TRƯỚC ~/.ssh/id_rsa.github của bạn mà không có tùy chọn này.

Tài liệu tham khảo

999
HeyWatchThis

Đề xuất của người khác về ~/.ssh/config rất phức tạp. Nó có thể đơn giản như:

Host github.com
  IdentityFile ~/.ssh/github_rsa
367
philfreo

Bắt đầu từ Git 2.3.0, chúng tôi cũng có lệnh đơn giản (không cần tệp cấu hình):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone [email protected]:repo.git

Bạn có thể cần khởi động lại cho dịch vụ ssh trên máy của mình.

295
Robert Jack Will

Nội dung của my_git_ssh_wrapper:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

Sau đó, bạn có thể sử dụng khóa bằng cách thực hiện:

GIT_SSH=my_git_ssh_wrapper git clone [email protected]:TheUser/TheProject.git
126
Joe Block

Để tổng hợp câu trả lời và nhận xét , cách tốt nhất để thiết lập git để sử dụng các tệp chính khác nhau và sau đó quên nó, cũng hỗ trợ người dùng khác nhau cho cùng một Máy chủ (ví dụ: tài khoản GitHub cá nhân và tài khoản công việc), cũng hoạt động trên Windows, là chỉnh sửa ~/.ssh/config (hoặc c:\Users\<your user>\.ssh\config) và chỉ định nhiều danh tính:

Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv

Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser

Sau đó, để sao chép một dự án là người dùng cá nhân của bạn, chỉ cần chạy lệnh git clone thông thường.

Để sao chép repo là workuser, hãy chạy git clone [email protected]:company/project.git.

81
Dan Dascalescu

Với git 2.10+ (quý 3 năm 2016: phát hành ngày 2 tháng 9 năm 2016), bạn có thể đặt config cho GIT_SSH_COMMAND (và không chỉ là biến môi trường như được mô tả trong Rober Jack Will 's câu trả lời )

Xem cam kết 3c8ede3 (ngày 26 tháng 6 năm 2016) bởi Nguyễn Thái Ngọc Duy (pclouds) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster - in commit dc21164 , ngày 19 tháng 7 năm 2016)

Một biến cấu hình mới core.sshCommand đã được thêm vào chỉ định giá trị nào cho GIT_SSH_COMMAND để sử dụng cho mỗi kho lưu trữ.

core.sshCommand:

Nếu biến này được đặt, git fetchgit Push sẽ sử dụng lệnh được chỉ định thay vì ssh khi chúng cần kết nối với hệ thống từ xa.
Lệnh có cùng dạng với biến môi trường GIT_SSH_COMMAND và bị ghi đè khi biến môi trường được đặt.

Nó có nghĩa là git clone có thể là:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone Host:repo.git
65
VonC

Như đã nêu ở đây: https://superuser.com/a/912281/607049

Bạn có thể định cấu hình cho mỗi lần repo:

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

Tôi đã sử dụng biến môi trường GIT_SSH . Đây là trình bao bọc của tôi, tương tự như biến từ Joe Block ở trên, nhưng xử lý bất kỳ số lượng đối số nào.

Tệp ~/gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "[email protected]"

Sau đó, trong .bashrc của tôi, thêm vào như sau:

export GIT_SSH=~/gitwrap.sh
30
Jamie

Cách tốt hơn để thêm Máy chủ hoặc ip đó vào tệp .ssh/config như vậy:

Host (a space separated list of made up aliases you want to use for the Host)
    User git
    Hostname (ip or hostname of git server)
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)
28
thamster

Khi bạn cần kết nối với github với một yêu cầu bình thường (git pull Origin master), đặt Máy chủ là * trong ~/.ssh/config làm việc cho tôi, bất kỳ Máy chủ nào khác (giả sử "github" hoặc "gb") đều không hoạt động.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx
7
chopstik

Nhiều trong số các giải pháp này trông hấp dẫn. Tuy nhiên, tôi thấy cách tiếp cận git-quấn-script chung ở liên kết sau là hữu ích nhất:

Cách chỉ định tệp khóa ssh bằng lệnh git

Vấn đề là không có lệnh git như sau:

git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git

Giải pháp của Alvin là sử dụng tập lệnh bash-Wrapper được xác định rõ để lấp đầy khoảng trống này:

git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git

Trong đó git.sh là:

#!/bin/bash

# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command

if [ $# -eq 0 ]; then
    echo "Git wrapper script that can specify an ssh-key file
Usage:
    git.sh -i ssh-key-file git-command
    "
    exit 1
fi

# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0

if [ "$1" = "-i" ]; then
    SSH_KEY=$2; shift; shift
    echo "ssh -i $SSH_KEY \[email protected]" > /tmp/.git_ssh.$$
    chmod +x /tmp/.git_ssh.$$
    export GIT_SSH=/tmp/.git_ssh.$$
fi

# in case the git command is repeated
[ "$1" = "git" ] && shift

# Run the git command
git "[email protected]"

Tôi có thể xác minh rằng điều này đã giải quyết vấn đề mà tôi gặp phải với nhận dạng người dùng/khóa cho repo bitbucket từ xa với git remote update, git pullgit clone; tất cả đều hoạt động tốt trong tập lệnh công việc cron mà nếu không gặp sự cố khi điều hướng Shell bị giới hạn. Tôi cũng có thể gọi tập lệnh này từ bên trong R và vẫn giải quyết chính xác vấn đề thực thi cron chính xác (Ví dụ: system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")).

Không phải R giống với Ruby, nhưng nếu R có thể làm điều đó ... O :-)

7
Paul McMurdie

Nếu không có giải pháp nào khác ở đây phù hợp với bạn và bạn đã tạo nhiều khóa ssh, nhưng vẫn không thể thực hiện những việc đơn giản như

git pull

sau đó giả sử bạn có hai tệp chính ssh như 

id_rsa
id_rsa_other_key

sau đó bên trong git repo bạn đang vật lộn với (cd vào đó), hãy thử:

eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

và cũng đảm bảo tên người dùng và userid mặc định của github của bạn là chính xác bằng cách:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "[email protected]"

Xem https://Gist.github.com/jexchan/2351996 để biết thêm thông tin.

4
cgnorthcutt

GIT_SSH_COMMAND = "ssh - i

3
carlsborg

nếu bạn có thư mục trên đường dẫn của mình, nơi bạn muốn đăng nhập với một tệp xác định cụ thể, bạn có thể chỉ định sử dụng một tệp nhận dạng cụ thể thông qua tệp .ssh/config bằng cách đặt ControlPath e.g.:

Host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

Sau đó, ssh sẽ sử dụng tệp nhận dạng được chỉ định khi thực hiện các lệnh git trong đường dẫn công việc đã cho.

3
cristobal

Mẹo cho tôi là sử dụng git @ hostname thay vì http: // hostname

2
AmazingTurtle

Trong Windows với Git Bash, bạn có thể sử dụng cách sau để thêm kho lưu trữ ssh-agent bash -c 'ssh-add "key-address"; git remote add Origin "rep-address"' Ví dụ: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add Origin [email protected]:test/test.git' Khóa riêng nào trong ổ D, kiểm tra thư mục của máy tính. Ngoài ra nếu bạn muốn sao chép một kho lưu trữ, bạn có thể thay đổi git remote add Origin bằng git clone.

Sau khi nhập cái này vào Git Bash, nó sẽ hỏi bạn mật khẩu!

Hãy cảnh giác rằng khóa riêng mở và khóa riêng PuTTY là diiferent!

Nếu bạn đã tạo khóa của mình bằng puttygen, bạn phải chuyển đổi khóa riêng của mình sang openssh!

2
Peyman Mahdavi

Bạn có thể sử dụng biến môi trường GIT_SSH. Nhưng bạn sẽ cần phải bọc ssh và các tùy chọn thành tập lệnh Shell.

Xem hướng dẫn sử dụng git: man git trong lệnh Shell của bạn.

2
rudimeier

Đây là khóa ssh tôi đã tìm thấy trong khi tìm giải pháp cho vấn đề này:

Ví dụ: bạn có 2 bộ khóa khác nhau:

key1, key1.pub, key2, key2.pub

Giữ các khóa này trong thư mục .ssh của bạn

Bây giờ trong tệp bí danh .bashrc hoặc .bash_profile của bạn, hãy thêm các lệnh này

alias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'

alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'

Voila! Bạn có một phím tắt để chuyển đổi phím bất cứ khi nào bạn muốn!

Hy vọng điều này làm việc cho bạn. 

1
penduDev

cho gitlabRSAAuthentication yes 

Host gitlab.com
  RSAAuthentication yes
  IdentityFile ~/.ssh/your_private_key_name
  IdentitiesOnly yes

tài liệu ở đây

1
Alupotha

Bạn cần tạo một ~/.ssh/config như bên dưới

Host <Your bitbucket server>
User <userid>
Hostname <Your bitbucket server as above>
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa<file> This is your private key file

sự cho phép như dưới đây

-rw------- $HOME/.ssh/config

Thêm khóa công khai của bạn vào git của bạn (cat ~/.ssh/id_rsa_pub [hoặc tên simillar])

và sau đó git clone như dưới đây

git clone ssh://[email protected]/userid/test.git
0
gajanan malvade

Vấn đề là khi bạn có kho lưu trữ từ xa khác nhau trên cùng một Máy chủ (nói github.com) và bạn muốn tương tác với chúng bằng các khóa ssh khác nhau (tức là các tài khoản GitHub khác nhau).

Để làm điều đó:

1) Trước tiên, bạn nên khai báo các khóa khác nhau của mình trong tệp ~/.ssh/config.

# Key for usual repositories on github.com
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

# Key for a particular repository on github.com
Host XXX
HostName github.com
User git
IdentityFile ~/.ssh/id_other_rsa

Bằng cách này, bạn liên kết khóa thứ hai với một tên thân thiện mới "XXX" cho github.com.

2) Sau đó, bạn phải thay đổi Nguồn gốc từ xa của kho lưu trữ cụ thể của mình để nó sử dụng tên thân thiện mà bạn đã xác định.

Chuyển đến thư mục kho lưu trữ cục bộ của bạn trong lệnh Prompt và hiển thị nguồn gốc từ xa hiện tại:

>git remote -v
Origin  [email protected]:myuser/myrepo.git (fetch)
Origin  [email protected]:myuser/myrepo.git (Push)

Sau đó thay đổi Xuất xứ với:

>git remote set-url Origin [email protected]:myuser/myrepo.git
>git remote -v
Origin  [email protected]:myuser/myrepo.git (fetch)
Origin  [email protected]:myuser/myrepo.git (Push)

Bây giờ bạn có thể Đẩy, tìm nạp ... bằng phím bên phải tự động.

0
rodo

Nếu số cổng SSH không phải là 22 (mặc định), hãy thêm Port xx trong ~/.ssh/config

Trong trường hợp của tôi (từ đồng nghĩa),

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

Sau đó sao chép bằng tiêu đề Máy chủ trong cấu hình. ("my_synology". để tránh "*" của @chopstik 

git clone my_synology:path/to/repo.git
0
w..k

Tôi sử dụng zsh và các khóa khác nhau được tự động tải vào ssh-agent của zsh Shell cho các mục đích khác (nghĩa là truy cập vào máy chủ từ xa) trên máy tính xách tay của tôi. Tôi đã sửa đổi câu trả lời của @ Nick và tôi đang sử dụng nó cho một trong những repos của tôi cần được làm mới thường xuyên. (Trong trường hợp này, đó là dotfiles mà tôi muốn phiên bản mới nhất và giống nhau trên tất cả các máy của tôi, bất cứ nơi nào tôi đang làm việc.)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • Sinh ra một đại lý ssh
  • Thêm khóa chỉ đọc vào tác nhân
  • Thay đổi thư mục để repo git của tôi
  • Nếu cd để repo dir thành công, hãy kéo từ repo từ xa
  • Giết ssh-đại lý sinh sản. (Tôi sẽ không muốn nhiều tác nhân nán lại xung quanh.)
0
sdkks

Nếu bạn giống tôi, bạn có thể:

  • Giữ các khóa ssh của bạn được tổ chức

  • Giữ các lệnh git clone của bạn đơn giản

  • Xử lý bất kỳ số lượng khóa cho bất kỳ số lượng kho.

  • Giảm bảo trì khóa ssh của bạn.

Tôi giữ các khóa của mình trong thư mục ~/.ssh/keys.

Tôi thích quy ước hơn cấu hình.

Tôi nghĩ rằng mã là luật; nó càng đơn giản thì càng tốt.

BƯỚC 1 - Tạo bí danh

Thêm bí danh này vào Shell của bạn: alias git-clone='GIT_SSH=ssh_wrapper git clone'

BƯỚC 2 - Tạo tập lệnh

Thêm tập lệnh này ssh_wrapper vào PATH của bạn:

#!/bin/bash
# Filename: ssh_wrapper

if [ -z ${SSH_KEY} ]; then
    SSH_KEY='github.com/l3x'  # <= Default key
fi
SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa"
ssh -i "${SSH_KEY}" "[email protected]"

VÍ DỤ

Sử dụng khóa github.com/l3x:

KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go

Ví dụ sau đây cũng sử dụng khóa github.com/l3x (theo mặc định):

git-clone https://github.com/l3x/learn-fp-go

Sử dụng khóa bitbucket.org/lsheehan:

KEY=bitbucket.org/lsheehan git-clone [email protected]:dave_andersen/exchange.git

GHI CHÚ

Thay đổi SSH_KEY mặc định trong tập lệnh ssh_wrapper thành những gì bạn sử dụng hầu hết thời gian. Theo cách đó, bạn không cần phải sử dụng biến KEY hầu hết thời gian.

Bạn có thể nghĩ, "Này! Điều đó xảy ra rất nhiều với bí danh, tập lệnh và một số thư mục các phím", nhưng đối với tôi đó là quy ước. Gần như tất cả các máy trạm của tôi (và máy chủ cho vấn đề đó) được cấu hình tương tự nhau.

Mục tiêu của tôi ở đây là đơn giản hóa các lệnh mà tôi thực hiện thường xuyên.

Các quy ước của tôi, ví dụ, các tập lệnh Bash, bí danh, v.v., tạo ra một môi trường nhất quán và giúp tôi giữ mọi thứ đơn giản.

KISS và tên quan trọng.

Để biết thêm mẹo thiết kế, hãy xem Chương 4 SOLID Design in Go từ cuốn sách của tôi: https: // www <azon.com/Learning- Chức năng-Lập trình-Lex-Sheehan-ebook/dp/B0725B8MYW

Mong rằng sẽ giúp. - Lex

0
l3x