在Git上执行shell命令时,如何指定专用SSH密钥?


1108

也许是一种非常不寻常的情况,但是我想指定一个从本地计算机执行shell(git)命令时要使用的专用SSH密钥。

基本上是这样的:

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

甚至更好(在Ruby中):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

我已经看到了使用Net :: SSH使用指定私钥连接到远程服务器的示例,但这是本地命令。可能吗?


6
在SuperUser中也可以看到此问题
Flimm,2015年

28
我想知道为什么这如此不寻常,以至于Git没有-issh这样的选择。
尼克T

29
使用git 2.10(2016年第三季度),您还拥有一个新配置:git config core.sshCommand 'ssh -i private_key_file'。请在下面
VonC

3
我认为,HeyWatchThis答案应为可接受的答案,因为它允许所有git命令在设置后正常执行,而不必像当前接受的答案所要求的那样为每个git命令制作一个子外壳。
gloriphobia

Answers:


797

像这样的东西应该起作用(由orip建议):

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

如果您喜欢子外壳,可以尝试以下操作(尽管它更脆弱):

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

Git将调用SSH,它将通过环境变量查找其代理;这将依次加载密钥。

另外,设置HOME也可以做的伎俩,只要你愿意建立一个仅包含一个目录.ssh的目录HOME; 它可能包含一个identity.pub或一个配置文件设置IdentityFile。


5
但这会将密钥永久添加为可接受的SSH密钥,对吗?我想避免这种情况,以免user2与用户的项目混为一谈。它是针对Web应用程序的,因此使用不同的OS用户是不切实际的,这将是最佳选择。
Christoffer,2010年

28
否,当git完成时,ssh-agent终止,并且密钥被遗忘。
Martin v。Löwis2010年

6
此命令在Windows git bash上不起作用。它说出意外令牌'ssh-add'附近的语法错误
-Mohit

116
固定的命令行(适用于Windows或Linux)类似于:ssh-agent bash -c 'ssh-add sshkey; git clone url'
orip

4
ssh-agent $(..)语法不是为我工作,我这是不是知道怎么想的工作:(BA)SH应执行命令内$(..)与输出参数,然后再运行ssh代理。
Johannes'fish'Ziemke

1199

这些解决方案都不适合我。

相反,我详细介绍了@Martin诉Löwis提到的config为SSH 设置文件。

SSH将查找用户的~/.ssh/config文件。我有我的设置为:

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

然后添加一个远程git存储库:

git remote add origin git@gitserv:myrepo.git

然后git命令对我来说正常工作。

git push -v origin master

笔记

  • IdentitiesOnly yes需要防止SSH默认行为发送所述身份文件匹配每个协议的默认的文件名的。如果您有一个名为的文件~/.ssh/id_rsa,那么在~/.ssh/id_rsa.github没有此选项的情况下,您将尝试使用该文件。

参考文献


17
我发现,当您使用.ssh / config指定多个键时,需要在“主机”行中使用主机朋友名称,作为“ git remote add”命令的一部分。如果行是“ Host stg”,那么您需要使用git remote add <someName> user @ stg:/path_to_git_repo.git“。如果使用确切的服务器名称,例如user@myserver.com:/path_to_git_repo.git,则配置文件没有被git选中。因此,它不能正确选择私钥文件。我通过将相同的内容推送到github和heroku来尝试了此操作,并且仅当您在“ git remote add”中给出友好名称时才起作用
Gopinath MR

2
我不确定github的Host。我找到了此链接:gist.github.com/jexchan/2351996
卡斯滕2014年

1
如果您想为几个git存储库提供几个密钥文件,请在这里看看
e271p314 2014年

1
您可以使用Host remote.server.com并继续使用原始URL
MauganRa '16

5
经过两次更改,这对我有用。如果配置文件是新的,请不要忘记这样做chmod 600 ~/.ssh/config(请参见此处)。如果您使用的是GitHub,请替换Host gitservHost github.com,省略Hostname remote.server.com并添加远程git remote add origin git@github.com:user_name/repo_name.git
miguelmorin

478

从Git 2.3.0开始,我们还有一个简单的命令(不需要配置文件):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git

3
我知道cannot run ssh -i /home/vagrant/.ssh/git: No such file or directory它的存在444 Nov 16 18:12 /home/vagrant/.ssh/git时间是ls -l /home/vagrant/.ssh/git
ted

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

8
简便的解决方案。如果您需要做很多事情,我建议创建一个别名。
Lasse Meyer

5
别忘了chmod 400 <path-to-private-key-file>。否则git命令可能会失败,并且没有特殊错误消息...
Eonil

5
如果还包括此答案-o IdentitiesOnly=yes以确保-i使用指定的密钥(而不是来自SSH代理的密钥),那将是很好的。
罗宾斯特

423

其他人的建议~/.ssh/config特别复杂。它可以很简单:

Host github.com
  IdentityFile ~/.ssh/github_rsa

30
您也需要该IdentitiesOnly选项。
Flimm

4
@EnzeChi您可以通过操作遥控器来拥有多个github帐户: git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git。然后,您的配置看起来就像Host personal HostName github.com ... Host corporate HostName github.com
emory

@EnzeChi我做了类似的事情,所以我使用了2个不同的ssh密钥-一个用于获取,另一个用于推送。提取没有密码短语。推确实。
艾默里(Emory),

144

my_git_ssh_wrapper的内容:

#!/bin/bash

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

然后,您可以通过以下方式使用密钥:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git

4
如果您在同一个域中拥有多个帐户,这是一个很好的解决方案,而其他解决方案则无法很好地解决这一问题
Beka 2014年

1
不错的解决方案。您也可以使用> GIT_SSH = my_git_ssh_wrapper简化此过程;git clone git@github.com:TheUser / TheProject.git
Shiva

2
此解决方案还涵盖了您希望从不带主目录的帐户使用git的情况。
piotrekkr 2014年

太棒了 您也可以对私有服务器使用这种方式:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"

1
这是在Cygwin环境中对我
有用

113

使用Git 2.10+(Q3 2016年公布的九月2D中,2016),你必须设置一个可能配置GIT_SSH_COMMAND(如描述,而不仅仅是一个环境变量罗伯特·杰克威尔回答

提交3c8ede3通过(2016年6月26日)阮泰玉维战(pclouds
(通过合并JUNIOÇ滨野- gitster-提交dc21164 7月19日2016)

core.sshCommand添加了新的配置变量,以指定GIT_SSH_COMMAND每个存储库使用什么值。

core.sshCommand:

如果这个变量被设置,git fetch并且git push将使用指定的命令,而不是ssh当他们需要连接到远程系统。
该命令与GIT_SSH_COMMAND环境变量的格式相同,并且在设置环境变量后将被覆盖。

这意味着git clone可以是:

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

您甚至可以仅通过一个命令设置它:

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

这比设置GIT_SSH_COMMAND环境变量要容易得多,正如在Windows上由MátyásKuti-Kreszács 指出的那样

set "GIT_SSH_COMMAND=ssh -i private_key_file"


已发布。
Flimm

4
作品。人们应该认为这是最好的答案。发出后,将.git / config文件与预先复制到/ tmp的版本进行比较可能会很有帮助。已经创建了一个新条目:sshCommand = ...为了它的价值,我使用了'git config core.sshCommand“ ssh -i $ HOME / .ssh / privatekeyfile”。
WeakPointer

1
@Spanky您可以执行内联命令,git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git后跟配置集git config core.sshCommand 'ssh -i private_key_file'
dav_i

1
这绝对是最好的答案!
Wagner Patriota

110

总结答案和评论,这是设置git以便使用不同的密钥文件然后忘掉它的最佳方法,该方法还支持同一主机的不同用户(例如,个人GitHub帐户和一个工作帐户),该帐户可在Windows上使用同样,是编辑~/.ssh/config(或c:\Users\<your user>\.ssh\config)并指定多个身份:

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

然后,要将项目克隆为您的个人用户,只需运行常规git clone命令。

要将仓库复制为workuser,请运行git clone git@github-work:company/project.git


3
我之所以打败您,是因为您所说的一切都已经包含在上述答案中,并且在我眼中,更加清晰了。例如,为什么要分别将用户分别定义为e dandv和workuser?
hroptatyr

2
您回答了一个已有4年历史的问题,没有任何新信息,并且您声称自己的回答是“最佳方法”。此外,您投票否决了其他用户,并争夺了他们的答案……只是为了让您的答案被推高。
rudimeier 2015年

@hroptatyr:我已经使用dandvworkuser支持我的示例,例如“一个个人GitHub帐户和一个工作帐户”。dandv是我的GitHub用户名。
Dan Dascalescu 2015年

12
我认为这是一个比@thamster更好的答案,仅仅是因为它解释了主机别名。
大卫·摩尔

2
我喜欢这个答案。但是,对我来说,这仅在我添加IdentitiesOnly yes到ssh配置文件中后才有效。
winni2k

75

如此处所述:https : //superuser.com/a/912281/607049

您可以按仓库配置它:

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

1
怎么-F /dev/null办?据我所知,这将使configFile从~/.ssh/config默认值更改,但是为什么要这样做呢?确保沙盒命令?
多米尼克

3
linuxcommand.org/man_pages/ssh1.html,不指定任何配置文件,因此当git运行ssh时,不会传递任何配置文件(实际上,这是一种沙盒模式,只需忽略用户配置默认选项即可)。有关-F的详细信息
David David

1
我正在寻找的那个。谢谢!
Loscitizen

适用于Kuber环境的AAAAA +解决方案。谢谢!
眼镜蛇与忍者

1
嗨,您知道如何将其传播到子模块吗?
Arka Prava Basu

38

问题是当您在同一主机上不同的远程存储库(例如github.com),并且您想使用不同的ssh密钥(即不同的GitHub帐户)与它们进行交互时。

为了做到这一点:

  1. 首先,您应该在~/.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

    这样,您将第二个密钥与github.com的新友好名称“ XXX”相关联。

  2. 然后,您必须更改特定存储库的远程来源,以便它使用刚定义的友好名称。

    在命令提示符下转到本地存储库文件夹,并显示当前的远程来源:

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

    然后使用以下命令更改原点:

    >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)

    现在,您可以使用右键自动推,取...。


1
在我看来,这是最“正确”的答案,在此您可以在ssh配置文件中组织连接和键,这是最佳做法,可长期支持。
jamescampbell

其他解决方案似乎是解决方法,它使用了该工具支持的强大功能。
Craig.C

太棒了,正是我想要的东西,谢谢!
magikMaker

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

要么

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

这个为我工作。
mohammed_ayaz

36

更好的主意是将该主机或IP添加到.ssh/config文件中,如下所示:

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
这很有用,但可以使您使用回购密钥与该主机名进行所有交互。如果同一台服务器上还有其他需要不同密钥的存储库,则最好使用包装器,并告诉git与GIT_SSH一起使用。
乔街区

11
不一定是真的。我为Github使用多个密钥-一个用于工作,另一个用于我的个人帐户。您不必为“主机”输入域名。您可以输入任何所需的别名。例如,我使用gh-home和gh-work作为主机名,克隆时使用例如,git clone git@gh-work:repo/project.git 在我的〜/ .ssh / config中,我有两个部分都将github.com用作HostName。他们只是拥有不同的IdentityFile和Host
blockloop

@ brettof86这个策略在大多数情况下都有效,但是当您检出的存储库取决于还托管在github上的gem时,您会怎么做?在Gemfile中对github存储库的引用不会包含您的“别名”,除非您想为该项目上的其他开发人员破坏东西,否则不要
这么做

@ brettof86我也有两个不同的github帐户(工作,家庭),但是我无法获得适合我的示例。您可以张贴两个样本吗?
Climbs_lika_Spyder

@Climbs_lika_Spyder这是我的~/.ssh/config pastebin.com/8rYn7yCi中的内容
blockloop 2015年

32

我使用了GIT_SSH环境变量。这是我的包装器,类似于上面的Joe Block的包装器,但是可以处理任何数量的参数。

文件〜/ gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

然后,在我的.bashrc中,添加以下内容:

export GIT_SSH=~/gitwrap.sh

我确实在.bashrc上进行了设置。但是当我登录到openshift实例时,它似乎并没有调用它。我想念什么吗?
Jigar Shah 2013年

它失败,并为我提供了一个错误..尽管它在那里找不到脚本事件..不知道发生了什么...错误:无法运行/tmp/gitwrap.sh:没有这样的文件或目录
ap1234

如果您遇到“没有这样的文件或目录”错误,请输入的完整路径gitwrap.sh,例如/home/ubuntu/gitwrap.sh
Tahir Akhtar

您可能需要添加-o StrictHostKeyChecking=no到ssh命令
dan-man

12

如果这里没有其他解决方案对您有用,并且您已经创建了多个ssh-key,但仍然无法完成诸如

git pull

然后假设您有两个ssh密钥文件,例如

id_rsa
id_rsa_other_key

然后在git repo内部,尝试:

# Run these commands INSIDE your git directory
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

并通过以下方式确保您的github默认用户名和用户ID正确:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "mona.lisa@email.com"

有关更多信息,请参见https://gist.github.com/jexchan/2351996


请注意,如果得到Could not open a connection to your authentication agent.,请尝试$ eval `ssh-agent -s`再试一次。
cgnorthcutt

1
对于那些迷路的人,ssh-add命令技巧对我有用。将ssh身份验证密钥添加到ssh进行身份验证的列表中。这对我很好!
本·卡特赖特

您为什么认为在哪个目录中运行很重要ssh-add
三人节

@BenCartwright因为您正在修改本地设置,而不是全局设置。这种方法是在仓库.git内部而不是全局修改git程序。您可以--global用来设置全局用户名和电子邮件。
cgnorthcutt

11

当你需要一个正常的请求(连接到github上git pull origin master),设置主机为*~/.ssh/config工作对我来说,任何其他主机(比如,“github上”或“国标”)不能正常工作。

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

最好不去填写整个“ Host *”行。
lionello 2014年

1
它可能不起作用,因为它与您的远程URL不匹配。如果要使用Host my-host-alias,则必须设置remote.origin.url=git@my-host-alias:[username]/[repo].git
大卫·摩尔

11

这些解决方案中的许多看起来都很诱人。但是,我发现以下链接中的通用git-wrapping-script方法是最有用的:

如何使用git命令指定ssh密钥文件

关键是没有git以下命令:

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Alvin的解决方案是使用定义良好的bash-wrapper脚本来填补这一空白:

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

在哪里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 "$@"

我可以验证这解决了我用用户/密钥识别具有用于远程到位桶回购一个问题git remote updategit pullgit clone; 所有这些现在都可以在cron工作脚本中正常运行,否则无法在受限外壳中导航。我还能够从R中调用此脚本,并且仍然可以解决完全相同的cron执行问题(例如system("bash git.sh -i ~/.ssh/thatuserkey.pem pull"))。

不是说R和Ruby是一样的,但是如果R可以做到的话……O :-)


1
看起来很棒!我将对此进行测试并回复。
BlueBird

3
除了语法,这怎么比GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.git按照罗伯特·杰克威尔的答案
大卫·摩尔

6

如果您的路径上有要使用给定的identifyfile签名的目录,则可以通过设置以下示例通过.ssh / config文件指定使用特定的identification文件ControlPath

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

然后ssh在给定的工作路径下执行git命令时将使用指定的标识文件。


后来发现,您还可以设置属性ControlMaster autoControlPersist yes,因此您无需每次都重新输入密码。在本文中
克里斯托瓦尔

3

您需要创建一个〜/ .ssh / config,如下所示

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

许可如下

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

将您的公钥添加到git中(cat〜/ .ssh / id_rsa_pub [或类似名称])

然后如下git clone

git clone ssh://blahblah@blah.com/userid/test.git

3

很多不错的答案,但其中有些假设具有事先的管理知识。

我认为重要的是要明确强调的是,如果你通过克隆该网页的网址开始你的项目 - https://github.com/<user-name>/<project-name>.git
那么你需要确保url [remote "origin"].git/config 被改为SSH URL(见下面的代码块)。

除此之外,请确保添加sshCommmand以下内容:

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

在此处了解更多信息。


1
非常感谢,花了很多时间试图弄清楚git为什么不使用ssh key。我不明白为什么github在克隆按钮中将https url作为默认值。
Chakradar Raju

2

在带有Git Bash的Windows中,您可以使用以下ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' 示例添加存储库 :ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'哪个私钥在驱动器D中,计算机的文件夹测试。此外,如果你想克隆一个资源库,你可以改变git remote add origin使用git clone

将其输入到Git Bash后,它将要求您输入密码!

注意openssh私钥和putty私钥是不同的!

如果您使用puttygen创建了密钥,则必须将私钥转换为openssh!


1

您可以使用GIT_SSH环境变量。但是您将需要将ssh和options包装到shell脚本中。

参见git manual:man git在命令外壳中。


1

我使用了zsh不同的密钥,这些密钥会ssh-agent自动出于其他目的(即访问远程服务器)加载到我的zsh shell 上。我修改了@Nick的答案,并将其用于需要经常刷新的我的存储库之一。(在这种情况下dotfiles,无论我在哪里工作,我都希望在所有计算机上使用相同的最新版本。)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • 产生一个ssh-agent
  • 向代理添加只读密钥
  • 将目录更改为我的git repo
  • 如果cdrepo dir成功,则从远程repo提取
  • 杀死生成的ssh-agent。(我不希望很多代理商徘徊。)

1

对于gitlab RSAAuthentication yes

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

doc在这里


您提供的链接上似乎没有提到它
rbennell '19

1

要使GIT_SSH_COMMAND环境变量在Windows下而不是在以下环境下工作:

set GIT_SSH_COMMAND="ssh -i private_key_file"

采用:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

报价必须像

set "variable=value" 

一些backgorund:https ://stackoverflow.com/a/34402887/10671021


0

如果SSH端口号不是22(默认),加Port xx~/.ssh/config

就我而言(同理学)

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

然后使用配置中的主机标题进行克隆。(“ my_synology”。避免使用@chopstik的“ *”)

git clone my_synology:path/to/repo.git

0

如果您像我,可以:

  • 保持SSH密钥井井有条

  • 保持git clone命令简单

  • 处理任意数量的存储库的任意数量的密钥。

  • 减少ssh密钥维护。

我将密钥保存在~/.ssh/keys目录中。

我更喜欢约定而不是配置。

我认为代码是法律;越简单越好。

第1步-创建别名

将此别名添加到您的外壳程序: alias git-clone='GIT_SSH=ssh_wrapper git clone'

第2步-创建脚本

将此ssh_wrapper脚本添加到您的PATH中:

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

例子

使用github.com/l3x密钥:

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

以下示例还使用github.com/l3x键(默认情况下):

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

使用bitbucket.org/lsheehan密钥:

KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git

笔记

将ssh_wrapper脚本中的默认SSH_KEY更改为大多数时间使用的内容。这样,您就不需要在大多数时间使用KEY变量。

您可能会想,“嘿!别名,脚本和一些键目录要花很多时间,”但是对我来说这是惯例。我的几乎所有工作站(以及与此相关的服务器)的配置都差不多。

我的目标是简化我经常执行的命令。

我的约定(例如Bash脚本,别名等)创建了一个一致的环境,并帮助我简化了事情。

吻和名字很重要。

有关更多设计技巧,请从我的书中查看Go中的第4章SOLID Designhttps//www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

希望能有所帮助。-莱克斯



0

这种方法的问题是,至少当在Windows上由bash.exe运行时,它将每次都创建一个将保持休眠状态的新进程。

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

如果您想按计划将其用于同步回购,则需要在最后添加“ && ssh-agent -k”。

就像是:

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完成后将终止该进程。



-1

这是我在找到此问题的解决方案时发现的ssh密钥黑客:

例如,您有2组不同的键:

key1, key1.pub, key2, key2.pub

将这些密钥保留在.ssh目录中

现在在您的.bashrc.bash_profile别名文件中,添加以下命令

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'

瞧!您可以通过快捷方式随时切换按键!

希望这对您有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.