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?


1110

Một tình huống khá bất thường có lẽ, nhưng tôi muốn chỉ định một 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 git@github.com: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 git@github.com: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?



28
Tôi tự hỏi tại sao điều này lại bất thường đến nỗi Git không có -itùy chọn như thế ssh.
Nick T

29
Với git 2.10 (quý 3 năm 2016), bạn cũng có cấu hình mới : git config core.sshCommand 'ssh -i private_key_file'. Xem câu trả lời của tôi dưới đây
VonC

3
Theo tôi, câu trả lời HeyWatch này phải là câu trả lời được chấp nhận vì nó cho phép tất cả các lệnh git được thực thi như bình thường sau khi thiết lập thay vì phải tạo một nhánh con cho mỗi lệnh git như câu trả lời được chấp nhận hiện tại yêu cầu.
gloriphobia

Câu trả lời:


800

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 git@github.com: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 git@github.com: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 HOMEcũng có thể thực hiện thủ thuật, miễn là bạn sẵn sàng thiết lập một thư mục chỉ chứa một .sshthư mục như HOME; cái này có thể chứa id.pub hoặc cài đặt tệp cấu hình IdentityFile.


5
Nhưng điều này sẽ thêm khóa vĩnh viễn dưới dạng khóa SSH được chấp nhận, phải không? Tôi muốn tránh điều đó để theuser2 không thể gây rối với các dự án của người dùng. Đó là một ứng dụng web vì vậy việc sử dụng các người dùng hệ điều hành khác nhau là không thực tế, đây sẽ là lựa chọn tốt nhất.
Christoffer

28
Không, khi git hoàn thành, ssh-agent chấm dứt và khóa bị quên.
Martin v. Löwis

6
lệnh này không hoạt động trên windows git bash. Nó nói lỗi cú pháp gần mã thông báo bất ngờ 'ssh-add'
Mohit

116
Dòng lệnh cố định (cho windows hoặc linux) sẽ giống như:ssh-agent bash -c 'ssh-add sshkey; git clone url'
orip

4
Các ssh-agent $(..)cú pháp không làm việc cho tôi và tôi không chắc chắn cách này là giả sử để làm việc: (ba) sh nên thực thi các lệnh bên trong $(..)trước, sau đó chạy ssh-agent với sản lượng như tham số.
Zi 'cá' Ziemke

1200

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 trên @Martin v. Löwis đề cập đến việc thiết lập một configtệp cho SSH.

SSH sẽ tìm ~/.ssh/configtập tin 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 git@gitserv: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Ú

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

Người giới thiệu


17
Tôi thấy rằng khi bạn chỉ định nhiều khóa bằng cách sử dụng .ssh / config, bạn cần sử dụng tên bạn bè của máy chủ lưu trữ trong dòng "Máy chủ" như một phần của lệnh "git remote add". Nếu dòng là "Host stg", thì bạn cần sử dụng git remote add <someName> user @ stg: /path_to_git numpo.git ". Nếu bạn sử dụng tên máy chủ chính xác như user@myserver.com: /path_to_git nbpo.git, tệp cấu hình không được chọn bởi git. Do đó, nó không chọn đúng tệp khóa riêng tư. Tôi đã thử điều này bằng cách đẩy cùng một nội dung vào github và heroku và chỉ hoạt động khi bạn đặt tên thân thiện trong "git remote add"
Gopinath MR

2
Tôi không chắc chắn về Host cho github. Tôi tìm thấy liên kết này: gist.github.com/jexchan/2351996 .
Karsten

1
Hãy xem ở đây nếu bạn muốn có một vài tệp chính cho vài kho git
e271p314

1
Bạn có thể sử dụng Host remote.server.comvà tiếp tục sử dụng URL gốc
MauganRa

5
Điều này làm việc cho tôi sau hai thay đổi. Nếu tệp cấu hình là mới, đừng quên làm chmod 600 ~/.ssh/config(xem tại đây ). Và nếu bạn đang sử dụng GitHub, thay thế Host gitservbằng Host github.com, bỏ qua Hostname remote.server.comvà thêm điều khiển từ xa bằng git remote add origin git@github.com:user_name/repo_name.git.
Miguelmorin

480

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 user@host:repo.git

3
Tôi nhận được cannot run ssh -i /home/vagrant/.ssh/git: No such file or directorymặc dù nó tồn tại 444 Nov 16 18:12 /home/vagrant/.ssh/gittừls -l /home/vagrant/.ssh/git
ted

3
@ted: chmod 400 /home/vagrant/.ssh/git
Yash

8
Giải pháp tốt đẹp và dễ dàng. Tôi đề nghị tạo một bí danh nếu bạn cần làm điều này nhiều.
Lasse Meyer

5
Đừng quên chmod 400 <path-to-private-key-file>. Nếu không, lệnh git có thể không thành công mà không có thông báo lỗi đặc biệt ...
Eonil

5
Sẽ rất tốt nếu câu trả lời này cũng được đưa -o IdentitiesOnly=yesvào để đảm bảo rằng khóa được chỉ định -isẽ được sử dụng (trái ngược với khóa từ tác nhân SSH).
cướp

423

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

Host github.com
  IdentityFile ~/.ssh/github_rsa

30
Bạn cần IdentitiesOnlytùy chọn, quá.
Flimm

4
@EnzeChi bạn có thể có nhiều tài khoản github bằng cách thao tác từ xa : git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git. Sau đó, bạn cấu hình giống nhưHost personal HostName github.com ... Host corporate HostName github.com
emory

@EnzeChi Tôi làm một cái gì đó tương tự để tôi sử dụng 2 phím ssh khác nhau - một để tìm nạp và một để đẩy. Tìm nạp không có cụm mật khẩu. Việc đẩy nào.
emory

144

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 git@github.com:TheUser/TheProject.git

4
Giải pháp rất tốt nếu bạn có nhiều tài khoản trong cùng một tên miền, điều mà các giải pháp khác không xử lý tốt
Beka

1
Giải pháp tốt đẹp. Bạn cũng có thể đơn giản hóa việc này với> GIT_SSH = my_git_ssh_wrapper; git clone git@github.com: TheUser / TheProject.git
Shiva

2
Giải pháp này cũng bao gồm các tình huống khi bạn muốn sử dụng git từ tài khoản mà không có thư mục chính.
piotrekkr

Tuyệt diệu. Bạn cũng có thể sử dụng cách này cho các máy chủ riêng tư:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
tấn

1
Đây là cách duy nhất phù hợp với tôi trong môi trường cygwin
ChatterOne

113

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 cấu hình cho GIT_SSH_COMMAND(và không chỉ là một biến môi trường như được mô tả trong câu trả lời của Rober Jack Will )

Xem cam kết 3c8ede3 (26 tháng 6 năm 2016) của Nguyễn Thái Ngọc Duy ( pclouds) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 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ị GIT_SSH_COMMANDsử dụng cho mỗi kho lưu trữ.

core.sshCommand:

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

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

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

Bạn thậm chí có thể đặt nó cho chỉ một lệnh:

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

Điều này dễ hơn là thiết lập một GIT_SSH_COMMANDbiến môi trường, trên Windows, như được ghi nhận bởi Mátyás Kuti-Kreszács , sẽ là

set "GIT_SSH_COMMAND=ssh -i private_key_file"

Ngày phát hành @Flimm: calendar.google.com/calWiki/ cường
VonC

Nó đã được phát hành.
Flimm

4
Làm. Mọi người nên xem đây là câu trả lời tốt nhất. Sau khi được ban hành, có thể cung cấp thông tin để tìm khác biệt tệp .git / config với phiên bản được sao chép vào / tmp trước đó. Một mục mới đã được tạo: sshCommand = ... Để biết giá trị của nó, tôi đã sử dụng 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile".
WeakPulum

1
@Spanky Bạn có thể thực hiện lệnh nội tuyến git -c core.sshCommand="ssh -i private_key_file" clone host:repo.gittheo sau là bộ cấu hìnhgit config core.sshCommand 'ssh -i private_key_file'
dav_i

1
Đây chắc chắn là câu trả lời tốt nhất!
Wagner Patriota

111

Để 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ó đi, 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à công việc), hoạt động trên Windows đồng thời, 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 git clonelệnh thông thường .

Để sao chép repo là workuser, chạy git clone git@github-work:company/project.git.


3
Tôi đánh giá thấp bạn bởi vì tất cả mọi thứ bạn nói đã được bao phủ trong các câu trả lời ở trên, và trong mắt tôi, thậm chí rõ ràng hơn. Chẳng hạn, tại sao bạn lại xác định chính xác Người dùng tương ứng với người dùng và người làm việc?
hroptatyr

2
Bạn đã trả lời một câu hỏi 4 năm không có thông tin mới và bạn cho rằng câu trả lời của bạn là "cách tốt nhất". Ngoài ra, bạn đã hạ thấp và làm phiền những người dùng khác để xóa câu trả lời của họ ... chỉ để khiến câu hỏi của bạn được đẩy lên.
rudimeier

@hroptatyr: Tôi đã sử dụng dandvworkuserđể hỗ trợ ví dụ của mình, "ví dụ: tài khoản GitHub cá nhân và tài khoản công việc". dandvlà tên người dùng GitHub của tôi.
Dan Dascalescu 28/03/2015

12
Tôi nghĩ rằng đó là một câu trả lời tốt hơn so với @ thamster, nếu chỉ vì nó giải thích bí danh máy chủ.
David Moles

2
Tôi thích câu trả lời này. Tuy nhiên, đối với tôi điều này chỉ hoạt động nếu tôi thêm IdentitiesOnly yesvào tập tin cấu hình ssh của tôi.
winni2k

75

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

1
Không gì -F /dev/nulllàm gì? Theo như tôi có thể thấy điều này sẽ thay đổi configFile từ ~/.ssh/configmặc định nhưng tại sao điều đó lại mong muốn? Để đảm bảo một lệnh sandbox?
Đaminh

3
linuxcommand.org/man_pages/ssh1.html , chỉ định không có tệp cấu hình, vì vậy khi git sẽ chạy ssh, sẽ không có tệp cấu hình nào được chuyển qua (thực tế đó là một loại chế độ hộp cát, chỉ cần bỏ qua các tùy chọn mặc định cấu hình người dùng) Thông tin thêm về -F
David

1
Người mà tôi đang tìm kiếm. Cảm ơn!
mất tích

Giải pháp AAAAA + để làm việc trong môi trường kuber. Cảm ơn!
Cobra vs Ninja

1
Xin chào Bạn có biết làm thế nào để truyền bá điều này đến một mô hình con?
Arka Prava Basu

38

Vấn đề là khi bạn có các kho lưu trữ từ xa khác nhau trên cùng một máy chủ (giả sử 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 bạn trong ~/.ssh/configtập tin.

    # 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 vừa xác định.

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

    >git remote -v
    origin  git@github.com:myuser/myrepo.git (fetch)
    origin  git@github.com:myuser/myrepo.git (push)

    Sau đó thay đổi nguồn gốc với:

    >git remote set-url origin git@XXX:myuser/myrepo.git
    >git remote -v
    origin  git@XXX:myuser/myrepo.git (fetch)
    origin  git@XXX:myuser/myrepo.git (push)

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


1
Đây là câu trả lời "đúng" nhất trong tâm trí của tôi, nơi bạn sắp xếp các kết nối và khóa trong tệp cấu hình ssh của bạn, đó là cách thực hành tốt nhất và có thể hỗ trợ lâu dài.
jamescampbell

Các giải pháp khác có vẻ như cách giải quyết, đây là sử dụng tính năng tuyệt vời mà công cụ hỗ trợ.
Craig.C

Tuyệt vời, chính xác những gì tôi đang tìm kiếm, cảm ơn !!
magikMaker

37
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

hoặc là

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push

Cái này làm việc cho tôi
mohammed_ayaz

36

Cách tốt hơn để thêm máy chủ hoặc ip đó vào .ssh/configtệp 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)

1
Điều đó hữu ích, nhưng khiến bạn sử dụng khóa repo cho tất cả các tương tác với tên máy chủ đó. Nếu có các repos khác trên cùng một máy chủ yêu cầu các khóa khác nhau, sử dụng trình bao bọc và yêu cầu git sử dụng nó với GIT_SSH thì tốt hơn.
Joe Block

11
Điều đó không hẳn đúng. Tôi sử dụng nhiều khóa cho Github - một cho công việc và một cho tài khoản cá nhân của tôi. Bạn không cần phải đặt tên miền cho "Máy chủ". Bạn có thể đặt bất kỳ loại bí danh nào bạn muốn. Ví dụ: tôi sử dụng gh-home và gh-work làm tên máy chủ của mình và khi tôi sao chép tôi sử dụng, ví dụ: git clone git@gh-work:repo/project.git Trong ~ / .ssh / config tôi có hai phần sử dụng github.com cho HostName. Họ chỉ có IdentityFile và Host khác nhau
blockloop

@ brettof86 chiến lược này hoạt động với hầu hết các phần, nhưng bạn sẽ làm gì khi một kho lưu trữ mà bạn đang kiểm tra phụ thuộc vào một viên ngọc cũng được lưu trữ trên github? Tham chiếu đến repo github trong Gemfile sẽ không chứa "bí danh" của bạn, trừ khi bạn muốn phá vỡ mọi thứ cho các nhà phát triển khác trong dự án ...
ktec 28/03/2015

@ brettof86 Tôi cũng có hai tài khoản github khác nhau (công việc, nhà), nhưng tôi không thể lấy ví dụ để làm việc cho tôi. Bạn có thể gửi một mẫu có hai?
Climbs_lika_Spyder

@Climbs_lika_Spyder đây là những gì trong ~/.ssh/config pastebin
tôi.com / 8rYn7yCi

32

Tôi đã đi với biến môi trường GIT_SSH. Đây là trình bao bọc của tôi, tương tự như trình bao bọc của 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 "$@"

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

export GIT_SSH=~/gitwrap.sh

Tôi đã thiết lập điều này trên .bashrc. Nhưng khi tôi đăng nhập vào ví dụ openshift, có vẻ như nó không gọi nó. Tui bỏ lỡ điều gì vậy ?
Jigar Shah

Nó không thành công với một lỗi đối với tôi .. nó không thể tìm thấy sự kiện tập lệnh mặc dù nó ở đó .. không chắc chắn điều gì đang xảy ra ... lỗi: không thể chạy /tmp/gitwrap.sh: Không có tệp hoặc thư mục như vậy
ap1234

Nếu bạn gặp phải lỗi "Không có tệp hoặc thư mục như vậy" gitwrap.sh, ví dụ: đặt đường dẫn đầy đủ của/home/ubuntu/gitwrap.sh
Tahir Akhtar

bạn có thể muốn thêm -o StrictHostKeyChecking=novào lệnh ssh
dan-man

12

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 repo git, thử:

# Run these commands INSIDE your git directory
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 "mona.lisa@email.com"

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


Lưu ý nếu bạn nhận được Could not open a connection to your authentication agent., thử $ eval `ssh-agent -s`và thử lại.
cgnorthcutt

1
Đối với những người bị mất, ssh-addthủ thuật lệnh làm việc cho tôi. Thêm khóa nhận dạng vào danh sách những người được thử khi ssh xác thực. Điều này làm việc cho tôi tốt!
Ben Cartwright

Tại sao bạn nghĩ nó quan trọng trong thư mục bạn chạy ssh-add?
tripleee

@BenCartwright Vì bạn đang sửa đổi cài đặt cục bộ, không phải cài đặt chung. Cách tiếp cận này sửa đổi .gitbên trong repo chứ không phải chương trình git trên toàn cầu. Bạn có thể sử dụng --globalđể đặt tên người dùng và email toàn cầu.
cgnorthcutt

11

Khi bạn cần phải kết nối với github với một yêu cầu bình thường ( git pull origin master), thiết lập Host như *trong ~/.ssh/configlàm việc cho tôi, bất kỳ máy chủ khác (nói, "github" hoặc "gb") không hoạt động.

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

Cũng có thể để lại toàn bộ dòng "Host *".
Lionello

1
Nó có thể không hoạt động vì nó không khớp với URL từ xa của bạn. Nếu bạn muốn sử dụng Host my-host-alias, bạn phải thiết lập remote.origin.url=git@my-host-alias:[username]/[repo].git.
David Moles

11

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 gitlệnh

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

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/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 thatuser@myserver.com:/git/repo.git

Ở đâu git.sh:

#!/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 \$@" > /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 "$@"

Tôi có thể xác minh rằng điều này giải quyết một vấn đề tôi gặp phải với người dùng / nhận chìa khóa cho một repo bitbucket từ xa với git remote update, git pullgit clone; tất cả bây giờ hoạt động tốt trong một cronkịch bản công việc mà nếu không gặp khó khăn trong việc đ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 cronvấn đề thực thi chính xác tương tự (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 :-)


1
Trông thật tuyệt! Tôi sẽ kiểm tra điều này và trả lời lại.
BlueBird

3
Ngoài cú pháp, làm thế nào điều này tốt hơn GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.gittheo câu trả lời của Robert Jack Will ?
David Moles

6

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 đã cho, 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 ControlPathví dụ:

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

Sau đó sshsẽ 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.


Phát hiện ra sau đó bạn cũng có thể thiết lập các thuộc tính ControlMaster autoControlPersist yes, do đó bạn không cần phải nhập lại mật khẩu mỗi lần. Tìm thấy thông tin trong bài viết này
cristobal

3

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://blahblah@blah.com/userid/test.git

3

Rất nhiều câu trả lời tốt, nhưng một số trong số họ thừa nhận kiến ​​thức quản trị trước.

Tôi nghĩ rằng điều quan trọng là để nhấn mạnh một cách rõ ràng rằng nếu bạn bắt đầu dự án của bạn bằng cách nhân bản URL web - https://github.com/<user-name>/<project-name>.git
thì bạn cần phải chắc chắn rằng các url giá trị dưới [remote "origin"]trong .git/config đã được đổi thành URL SSH (xem khối mã dưới đây).

Ngoài ra, hãy chắc chắn rằng bạn thêm sshCommmandnhư được đề cập dưới đây:

user@workstation:~/workspace/project-name/.git$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist
[remote "origin"]
    url = git@github.com:<user-name>/<project-name>.git  <-- Make sure its the SSH URL and not the WEB URL
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

Đọc thêm về nó ở đây .


1
Cảm ơn bạn rất nhiều, đã dành rất nhiều thời gian để cố gắng tìm hiểu tại sao git không sử dụng khóa ssh. Tôi không hiểu tại sao github cung cấp url https làm mặc định trong nút sao chép.
Chakradar Raju

2

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 git@git.test.com:test/test.git'Khóa riêng nào nằm 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 originvớigit 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!


1

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 một kịch bản shell.

Xem hướng dẫn git: man gittrong shell lệnh của bạn.


1

Tôi sử dụng zshvà các khóa khác nhau được ssh-agenttự động tải vào vỏ zsh của tôi cho các mục đích khác (tức 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à dotfilesphiên bản mới nhất của tôi và 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.)

1

cho gitlab RSAAuthentication yes

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

tài liệu ở đây


dường như không được đề cập trên liên kết mà bạn cung cấp nữa
rbennell

1

Để biến môi trường GIT_SSH_COMMAND hoạt động trong Windows thay vì:

set GIT_SSH_COMMAND="ssh -i private_key_file"

Sử dụng:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

Câu trích dẫn phải như thế

set "variable=value" 

Một số backgorund: https://stackoverflow.com/a 432402887/10671021


0

Nếu số cổng SSH không phải là 22 (mặc định), hãy thêm Port xxvào~/.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

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ữ chìa khóa của tôi trong ~/.ssh/keysthư mục của tôi .

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 vỏ của bạn: alias git-clone='GIT_SSH=ssh_wrapper git clone'

BƯỚC 2 - Tạo Script

Thêm tập lệnh ssh_wrapper này 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}" "$@"

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 git@bitbucket.org: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. Bằng 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 Thiết kế RẮN trong cuốn sách của tôi: https://www.amazon.com/Learning-Feftal-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

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



0

Vấn đề với phương pháp này là, ít nhất là khi chạy bởi bash.exe trên Windows, nó sẽ tạo ra một quy trình mới mỗi lần sẽ không hoạt động.

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

Nếu bạn muốn sử dụng nó cho repo syncig theo lịch trình thì bạn cần thêm "&& ssh-agent -k" vào cuối.

Cái gì đó như:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

ssh-agent -k sẽ giết quá trình khi nó hoàn thành.


0

Tôi chỉ cần thêm khóa sau đó chạy lại bản sao git.

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git

-1

Đây là hack ssh key 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 .sshthư mục của bạn

Bây giờ trong tệp .bashrchoặc .bash_profilebí danh của bạn , 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.

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.