可能是一种非常不寻常的情况,但我想指定一个专用的ssh密钥,以便在从本地计算机执行shell(git)命令时使用。
基本上是这样的:
1
| git clone git@github.com:TheUser/TheProject.git -key"/home/christoffer/ssh_keys/theuser" |
或者更好(红宝石):
1 2 3
| with_key ("/home/christoffer/ssh_keys/theuser") do
sh("git clone [email protected]:TheUser/TheProject.git")
end |
我已经看到了使用使用指定私钥的net::ssh连接到远程服务器的示例,但这是一个本地命令。有可能吗?
- 在超级用户中也可以看到这个问题。
- 我想知道为什么这是如此不寻常,以至于Git没有像ssh那样的-i选项。
- 使用git 2.10(2016年第3季度),您还可以有一个新配置:git config core.sshCommand 'ssh -i private_key_file'。请看下面我的答案
- 在我看来,heywatch这个答案应该是可接受的答案,因为它允许所有的git命令在设置后正常执行,而不必按照当前接受的答案的要求为每个git命令制作子shell。
这些解决方案对我都不起作用。
相反,我详细阐述了@martin v.l?WIS提到为ssh设置一个config文件。
ssh将查找用户的~/.ssh/config文件。我的设置为:
1 2 3 4
| Host gitserv
Hostname remote.server.com
IdentityFile ~/.ssh/id_rsa.github
IdentitiesOnly yes # see NOTES below |
我还添加了一个远程Git存储库:
1
| git remote add origin git@gitserv:myrepo.git |
然后Git命令对我来说正常工作。
1
| git push -v origin master |
笔记
- 为了防止ssh默认行为发送与每个协议的默认文件名匹配的标识文件,需要使用IdentitiesOnly yes。如果您有一个名为~/.ssh/id_rsa的文件,在没有此选项的情况下,它将在您的~/.ssh/id_rsa.github之前被试用。
工具书类
- 在一个客户机上使用多个ssh私钥的最佳方法
- 我怎么能停止ssh提供错误的密钥呢?
- 我发现,当您使用.ssh/config指定多个键时,需要在"host"行中使用主机朋友名作为"git remote add"命令的一部分。如果行为"host stg",则需要使用git remote adduser@stg:/path_to_git_repo.git"。如果使用与[email protected]:/path_to_git_repo.git相同的服务器名称,则配置文件不会由git选择。因此,它没有正确地选择私钥文件。我尝试将相同的内容推送到Github和Heroku,只有当您在"Git远程添加"中给出友好名称时才能工作。
- 我不确定Github的主机。我找到了这个链接:gist.github.com/jexchan/2351996。
- @Jonnyreeves编辑引入了不匹配的主机名。推到gitserv将与remote或remote.server.com的ssh配置Host条目不匹配。因此,不使用预期的IdentityFile。我要编辑这个答案。
- 如果您想要为几个Git存储库提供几个密钥文件,请看这里。
- 希望ssh-config解决方案能够支持从以下格式获取帐户名:'[email protected]:/some_repo.git,在执行克隆时,您不必为不同的帐户名修改主机。
- 不工作,仍然提示输入每个git命令的密码。
- 我不明白为什么需要IdentitiesOnly。据我所知,通过将这个主机添加到配置文件中,它将把这个ssh密钥添加到它要尝试的密钥列表中,即它将首先尝试~/.ssh/identity、~/.ssh/id_dsa、~/.ssh/id_ecdsa和~/.ssh/id_rsa,然后再尝试~/.ssh/id_rsa.github。在id_rsa.github之前尝试id_rsa有什么问题吗,只要它最终尝试id_rsa.github了?
- 嗯,这对我不起作用。当我从我的私人回购中进行git拉取时,git会完全忽略我的.ssh/config文件并尝试使用id-rsa,这是错误的密钥。
- 除了IdentitiesOnly以外,我还有其他所有的功能,它工作了一段时间,但有一天停止工作,试图使用我在id_rsa中的默认密钥。IdentifiesOnly似乎确实很重要。
- 您可以使用Host remote.server.com并继续使用原始URL
- 出于某种原因,这对我很有效,但我首先将ssh登录添加到git服务器,以便使用Identify文件(可能与未填充的已知主机有关)。所以,在这样做之后,在运行你的git clone ...命令之前,运行:ssh {hostname}
- 在配置条目中也可能需要用户
- 经过两次改变,这对我很有效。如果配置文件是新的,不要忘记执行chmod 600 ~/.ssh/config(请参见此处)。如果您使用的是Github,那么用Host github.com替换Host gitserv,省略Hostname remote.server.com,用git remote add origin [email protected]:user_name/repo_name.git添加Remote。
- 以东十一〔二十六〕做到了!我快疯了。我尝试使用自定义的ssh密钥来设置gitlab——这应该是官方文档的一部分。
- 这正是我想要的。完全忘记了~/.ssh/config。谢谢你这个好心的陌生人。
- 是否可能是同一主机,但子文件夹不同?即"hostbitback.org",但不同项目的键不同
- 增加一个新遥控器的事实对我来说是个骗局。对于上下文:我在项目期间添加了一个新的键,并希望使用它进行推送。
- 为了保存更多的字符,将User git添加到该配置项中,并只使用gitserv:myrepo.git作为远程URL。
这样的方法应该有效(由ORIP建议):
1
| ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git' |
如果您喜欢子shell,可以尝试以下方法(尽管它更脆弱):
1
| ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git) |
Git将调用ssh,ssh将按环境变量查找其代理;这将依次加载密钥。
或者,设置HOME也可以做到这一点,前提是您愿意将只包含.ssh目录的目录设置为HOME;这可以包含identity.pub,也可以包含设置identity file的配置文件。
- 但这会永久地将密钥添加为可接受的ssh密钥,对吗?我想避免这样做,这样用户2就不会干扰用户的项目。它是针对一个Web应用程序的,所以使用不同的操作系统用户是不现实的,这是最好的选择。
- 不,当git完成时,ssh代理终止,密钥被遗忘。
- 精彩的!:)非常感谢。
- 此命令在Windows Git Bash上不起作用。它说语法错误接近意外的标记"ssh add"
- 固定命令行(用于Windows或Linux)类似于:ssh-agent bash -c 'ssh-add sshkey; git clone url'
- 这在我的桌面*nix机器上运行良好,但在当前Debian的原始安装的几个服务器上失败。@你看,这个答案似乎在任何地方都适用(尽管这个答案是暂时的,但它是永久的)
- 猎户座的线对我有用;马丁的线对我无效。
- bash在Windows上崩溃(使用git bash环境变量)。有窗户的工作区吗?
- 我已经修复了第一个命令行的语法:应该是$( ... )来启动子shell。
- ssh-agent $(..)语法对我来说不起作用,我也不确定这是如何工作的:(ba)sh应该先执行$(..)中的命令,然后以输出为参数运行ssh代理。
- 如果密钥具有密码短语,该解决方案将如何工作?
- 非常感谢,这对我有用。我的操作系统x的连线很好,我只能使用你提到的ssh代理方式来访问git服务器,直接使用git克隆将得到Permission denied (publickey,gssapi-keyex,gssapi-with-mic). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.,即使私钥在~/。ssh/id_rsa和ssh add-l已经正确地显示了它。你知道这个吗?
- 不幸的是,它没有拔出钥匙,而是把它留在了那里。您应该在末尾添加ssh a d d-d/path/to/key。
- 有点遗憾,默认情况下,这个能力并没有与Git本身集成…
- $(..)语法可能没有达到预期的效果:它首先在内部运行命令,并将其输出发送到ssh-agent。如果另一个ssh-agent碰巧已经在运行,这可能会发生,但是新的密钥将留在代理中(除非添加ssh-add -d将其取出),而答案将变为ssh-add /somewhere/yourkey && git clone [email protected]:user/project.git ; ssh-add -d /somewhere/yourkey(我们假设ssh-agent已经在运行,并注意&&而不是;的使用)。但这是没有意义的,因为bash -c版本是正确的。
- 在我从OpenSUSE 42.3升级到15.0之后,这个解决方案出于某种原因停止了对我的工作。我切换到stackoverflow.com/a/29754018/47680,它工作得很好。
- 您也可以使用ssh-add -t 60; git clone [email protected]:user/project.git来完成这一点。这将在60秒后使密钥过期。
- –1因为投票最高的答案是无可争辩的好。
其他人对~/.ssh/config的建议是非常复杂的。它可以简单到:
1 2
| Host github.com
IdentityFile ~/.ssh/github_rsa |
- 只有当您只有一个github用户帐户时,这才有效
- 你也需要IdentitiesOnly选项。
- @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
- @Enzechi我做了类似的事情,所以我使用了两个不同的ssh密钥——一个用于获取,另一个用于推送。提取没有密码短语。推。
从Git2.3.0开始,我们还有简单的命令(不需要配置文件):
1
| GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git |
您可能需要重新启动计算机上的ssh服务。
- 我从ls -l /home/vagrant/.ssh/git得到了cannot run ssh -i /home/vagrant/.ssh/git: No such file or directory,尽管它存在于444 Nov 16 18:12 /home/vagrant/.ssh/git。
- @泰德:chmod 400/home/vagrant/.ssh/git
- 很好,很容易解决。如果您需要经常这样做,我建议您创建一个别名。
- @Ted读取我应该授予私钥哪些权限级别?如果混淆。
- 完美的解决方案,在Cygwin中无任何问题
- 管理多个存储库的绝佳解决方案,尤其是当您在同一帐户上使用不同的密钥时。
- 别忘了给chmod 400 。否则,git命令可能会失败,不会出现特殊错误消息…
- 这是我最喜欢的答案^^
- 这是最好的解决方案,考虑到您以后要提取代码,git-ssh-command='ssh-i private-key-file'git-pull-origin-branchu将其命名为simple,它可以工作。
- 在Mac上使用Git2.13.6对我很有用。我可以通过ssh转发代理克隆远程回购。谢谢!注:不过,我只需要1〔5〕个字。
我的Git-ssh-u包装的内容:
1 2 3
| #!/bin/bash
ssh -i /path/to/ssh/secret/key $1 $2 |
然后您可以通过执行以下操作来使用密钥:
1
| GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git |
- 如果您在同一个域中有多个帐户,则非常好的解决方案,其他解决方案处理不好
- 好的解决方案。您还可以使用>git_ssh=my_git_ssh_wrapper;git clone [email protected]:theuser/theproject.git简化此过程。
- 这个解决方案还包括在不使用主目录的情况下使用git-from帐户。
- 好极了。您也可以使用这种方式访问私有服务器:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"。
- 这是我在赛格温环境中工作的唯一方法。
为了总结答案和评论,设置Git以使用不同的密钥文件然后忽略它的最佳方法是编辑~/.ssh/config或c:\Users\\.ssh\config并指定多个标识,这也支持同一主机的不同用户(例如个人GitHub帐户和工作帐户),该帐户也在Windows上工作:
1 2 3 4 5 6 7 8 9
| 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命令。
要将repo克隆为workuser,请运行git clone git@github-work:company/project.git。
- 我对你投了反对票,因为你说的每一句话都已经包含在上面的答案里,在我的眼里,甚至更清楚。例如,为什么要分别将用户定义为e dandv和workuser?
- 你回答了一个4岁的问题,没有新的信息,你声称你的回答是"最好的方式"。此外,你投了反对票,还说服其他用户删除他们的答案…只是想把你的那个推起来。
- @hroptatyr:我已经使用dandv和workuser来支持我的示例,"例如个人github帐户和工作帐户"。dandv是我的github用户名。
- 你的想法是对的,但这行不通。你必须使用用户"git"。问题是,你在复制泰姆斯特2012年的回复。
- 我认为这比@thamster的答案更好,如果只是因为它解释了主机别名的话。
- 我喜欢这个答案。但是,对于我来说,这只在我将IdentitiesOnly yes添加到ssh配置文件中时有效。
使用git 2.10+(2016年第3季度:2016年9月2日发布),您可以为GIT_SSH_COMMAND设置配置(而不仅仅是rober jack will's answer中描述的环境变量)。
见NGUY提交的承诺书3c8ede3(2016年6月26日)?第二次世界大战?杜伊(pclouds)。(由Junio C Hamano——EDOCX1【2】——于2016年7月19日提交DC21164合并)
A new configuration variable core.sshCommand has been added to
specify what value for GIT_SSH_COMMAND to use per repository.
If this variable is set, git fetch and git push will use the specified command instead of ssh when they need to connect to a remote system.
The command is in the same form as the GIT_SSH_COMMAND environment variable and is overridden when the environment variable is set.
这意味着git clone可以是:
1 2 3 4
| cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file'
# later on
git clone host:repo.git |
- @flimm发布日期:calendar.google.com/calendar/…
- 它已经发布了。
- @是的:这就是我的版本(stackoverflow.com/posts/38474137/revisions)提到的。
- 是的,但是评论还没有被删除。我删除了我的旧评论,并将其他评论标记为"过时"。
- 作品。人们应该认为这是最好的答案。一旦发布,就可以将.git/config文件与预先复制到/tmp的版本进行比较。已创建新条目:sshcommand=…为了实现它的价值,我使用了"git config core.sshcommand"ssh-i$home/.ssh/privatekeyfile。
- 仅适用于现有的git目录。否则,您需要将它设置为全局,而这并不是您真正想要的。
如前所述:https://superuser.com/a/912281/607049
您可以为每个回购配置它:
1 2 3
| git config core.sshCommand"ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push |
- -F /dev/null是做什么的?据我所知,这将改变~/.ssh/config违约的配置文件,但为什么需要这样做?要确保沙盒命令?
- linuxcommand.org/man_pages/ssh1.html,指定没有配置文件,所以当git运行ssh时,不会传递任何配置文件(实际上是一种沙盒模式,只需忽略用户配置默认选项),superuser中的原始线程有关于-f的更多信息。
- 是的,可能是个好主意
- 工作很有魅力,我支持你:)
- 伟大的!谢谢。。。
- 我在找的那个。谢谢!
- 在库伯环境下工作的AAAAA+解决方案。谢谢!
我使用了git_sh环境变量。这是我的包装器,类似于上面的JoeBlock,但可以处理任意数量的参数。
文件~/gitwrap.sh
1 2
| #!/bin/bash
ssh -i ~/.ssh/gitkey_rsa"$@" |
然后,在my.bashrc中添加以下内容:
1
| export GIT_SSH=~/gitwrap.sh |
- 我把它打开了。巴什克。但当我登录到openshift实例时,它似乎并没有调用它。我错过什么了吗?
- 它失败了,对我来说是一个错误。它在那里找不到脚本事件。不确定发生了什么…错误:无法运行/tmp/gitwrap.sh:没有此类文件或目录
- 如果您遇到"无此文件或目录"错误,请输入gitwrap.sh的完整路径,例如/home/ubuntu/gitwrap.sh。
- 您可能需要将-o StrictHostKeyChecking=no添加到ssh命令中。
将主机或IP添加到.ssh/config文件中的更好方法是这样:
1 2 3 4 5
| 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) |
- 这很有用,但会使您使用repo键与该主机名进行所有交互。如果同一服务器上还有其他需要不同密钥的回购,那么使用包装器并告诉Git将其与Git_ssh一起使用会更好。
- 这不一定是真的。我对GitHub使用多个密钥-一个用于工作,一个用于个人帐户。你不必为"主机"输入域名。您可以使用任何类型的别名。例如,我使用gh home和gh work作为主机名,克隆时使用git clone git@gh-work:repo/project.git,例如,在my~/.ssh/config中,我有两个部分都使用github.com作为主机名。他们只是有不同的身份文件和主机
- @Brettof86这个策略在大多数情况下都有效,但是当您要签出的存储库依赖于一个也托管在GitHub上的gem时,您会怎么做?在gemfile中对github repo的引用不会包含您的"别名",除非您希望为项目中的其他开发人员打破某些限制…
- @Brettof86我也有两个不同的Github帐户(工作、家庭),但我不能让这个例子为我工作。你能寄一份有两个的样品吗?
- @爬上去,像个间谍,这是我的~/.ssh/configpastebin.com/8ryn7yci里的东西。
- @Brettof86它说这种糊状物已经被去除了:(
- @像间谍一样爬上去,现在也不见了。-_-
- @布雷托夫86如果你能把这篇文章贴在这里就太好了…
- 我可以把它贴在这里,但会很难看…Host work-gh HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/work_id_rsa Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa
- gist在这里gist.github.com/justbrettjones/…
其中许多解决方案看起来很诱人。但是,我发现下面链接中的通用Git包装脚本方法最有用:
如何使用git命令指定ssh密钥文件
要点是没有git命令,如下所示:
1
| git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git |
Alvin的解决方案是使用一个定义良好的bash包装器脚本来填补这个空白:
1
| git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git |
其中,git.sh为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #!/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 update、git pull和git clone进行远程bitback repo的用户/密钥识别时遇到的一个问题;所有这些问题现在在cron作业脚本中都可以正常工作,否则在有限shell的导航中会遇到问题。我还可以从R中调用这个脚本,仍然可以解决完全相同的cron执行问题。(如system("bash git.sh -i ~/.ssh/thatuserkey.pem pull"))。
不是R和Ruby一样,但是如果R能做到…O:)
- 看起来不错!我会测试这个并回复。
- 除了语法之外,根据罗伯特·杰克·威尔的回答,这比GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone [email protected]:/git/repo.git更好吗?
当您需要以正常请求(git pull origin master连接到github时,在~/.ssh/config中将主机设置为*对我有效,任何其他主机(如"github"或"gb")都不起作用。
1 2 3 4 5
| Host *
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_xxx |
- 最好把整个"主机*"行都去掉。
- 它可能不起作用,因为它与您的远程URL不匹配。如果要使用Host my-host-alias,必须设置remote.origin.url=git@my-host-alias:[username]/[repo].git。
git_ssh_command="ssh-i/path/to/git private access key"git克隆$git_repo
如果这里的其他解决方案都不适用于您,并且您已经创建了多个ssh密钥,但仍然不能执行诸如
然后假设您有两个ssh密钥文件,比如
1 2
| id_rsa
id_rsa_other_key |
然后,在您正在努力处理的git repo(cd)内部,尝试:
1 2 3
| eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key |
并通过以下方式确保您的Github默认用户名和用户ID正确:
1 2 3
| # Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "[email protected]" |
更多信息请参见https://gist.github.com/jexchan/2351996。
- 注意:如果你得到了Could not open a connection to your authentication agent.,试试$ eval `ssh-agent -s`,然后再试一次。
- 对于那些迷路的人来说,江户指挥的把戏对我很有效。在ssh身份验证时尝试使用的列表中添加标识密钥。这对我很管用!
您可以使用git_ssh环境变量。但您需要将ssh和选项包装到shell脚本中。
参见你的命令shell中的git手册:man git。
在带有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 [email protected]:test/test.git',哪个私钥在驱动器D中,计算机的文件夹测试。另外,如果要克隆存储库,可以使用git clone更改git remote add origin。
在进入git bash之后,它会要求您输入密码!
请注意,openssh私钥和putty私钥是不同的!
如果使用puttygen创建了密钥,则必须将私钥转换为openssh!
您需要创建~/.ssh/config,如下所示
1 2 3 4 5
| 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 |
许可如下
1
| -rw------- $HOME/.ssh/config |
将您的公钥添加到Git中(cat~/.ssh/id_rsa_pub[或similar name])
然后git克隆如下
1
| git clone ssh://blahblah@blah.com/userid/test.git |
如果您的路径上有要用给定的identify file签名的目录,则可以通过设置ControlPath来指定通过.ssh/config文件使用特定的标识文件,例如:
1 2 3 4 5
| host github.com
ControlPath ~/Projects/work/**
HostName github.com
IdentityFile ~/.ssh/id_work
User git |
然后,在给定的工作路径下执行git命令时,ssh将使用指定的标识文件。
用于Gitlab RSAAuthentication yes。
1 2 3 4
| Host gitlab.com
RSAAuthentication yes
IdentityFile ~/.ssh/your_private_key_name
IdentitiesOnly yes |
医生在这里
以下是我在寻找解决此问题的方法时发现的ssh密钥黑客:
例如,您有两组不同的键:
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'
哇!您有一个快捷方式,可以随时切换按键!
希望这对你有用。
如果ssh端口号不是22(默认),则在~/.ssh/config中添加Port xx。
在我的案例中(概要)
1 2 3 4 5
| Host my_synology
Hostname xxxx.synology.me
IdentityFile ~/.ssh/id_rsa_xxxx
User myname
Port xx |
然后使用配置中的主机标题进行克隆。"我的概要"。避免@chopstik的"*")
1
| git clone my_synology:path/to/repo.git |
我使用zsh,不同的密钥自动加载到我的zsh shell的ssh-agent,用于笔记本电脑上的其他用途(即访问远程服务器)。我修改了@nick的答案,并将其用于需要经常刷新的一次回购。(在这种情况下,它是我的dotfiles,我希望在我所有的机器上,无论我在哪里工作,都能有相同和最新的版本。)
1
| 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代理
- 向代理添加只读密钥
- 将目录更改为我的git repo
- 如果cdto repo dir成功,从远程repo拉
- 杀死生成的ssh代理。(我不想让很多特工在这里逗留。)
如果你和我一样,你可以:
保持您的ssh密钥井然有序
保持Git克隆命令简单
为任意数量的存储库处理任意数量的密钥。
减少ssh密钥维护。
我把钥匙放在我的~/.ssh/keys目录中。
比起配置,我更喜欢约定。
我认为法典就是法律,越简单越好。
步骤1-创建别名
在shell中添加这个别名:alias git-clone='GIT_SSH=ssh_wrapper git clone'。
步骤2-创建脚本
将此ssh_包装脚本添加到您的路径:
1 2 3 4 5 6 7 8
| #!/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键:
1
| KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go |
以下示例还使用github.com/l3x键(默认情况下):
1
| git-clone https://github.com/l3x/learn-fp-go |
使用bitback.org/lsheehan键:
1
| KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git |
笔记
将ssh-wrapper脚本中的缺省ssh-u密钥更改为您大多数时候使用的密钥。这样,大多数时候不需要使用键变量。
你可能会想,"嘿!一个别名、一个脚本和一些键的目录经常发生这种情况,"但对我来说,这是惯例。几乎我所有的工作站(以及相关的服务器)的配置都是类似的。
我的目标是简化我经常执行的命令。
我的约定(如bash脚本、别名等)创建了一个一致的环境,并帮助我保持简单。
吻和名字很重要。
更多设计技巧请参阅Go from my book中的第4章实体设计:https://www.amazon.com/learning-functional-programming-lex-sheehan-ebook/dp/b0725b8myw
希望有帮助。-莱克斯