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?
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 .ssh
là HOME
; cái này có thể chứa một tập tin id.pub hoặc tập tin config settings IdentityFile.
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
Đề 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
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.
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
Để 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
.
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 fetch
vàgit 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ườngGIT_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
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
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
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)
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
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 pull
và git 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 :-)
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.
GIT_SSH_COMMAND = "ssh - i
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.
Mẹo cho tôi là sử dụng git @ hostname thay vì http: // hostname
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!
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.
Đâ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.
cho gitlabRSAAuthentication yes
Host gitlab.com
RSAAuthentication yes
IdentityFile ~/.ssh/your_private_key_name
IdentitiesOnly yes
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
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.
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
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'
cd
để repo dir thành công, hãy kéo từ repo từ xaNế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