也许是一个相当不寻常的情况,但我想指定一个私有SSH密钥,以便在从本地计算机执行shell(git)命令时使用。

基本上是这样的:

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

甚至更好(在Ruby中):

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

我见过使用Net :: SSH连接到远程服务器的示例,它使用指定的私钥,但这是一个本地命令。 可能吗?


#1楼

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

相反,我详细阐述了@Martinv.Löwis提到为SSH设置config文件。

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

Host gitservHostname remote.server.comIdentityFile ~/.ssh/id_rsa.githubIdentitiesOnly 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之前尝试。

参考

  • 在一个客户端上使用多个SSH私钥的最佳方法
  • 我怎么能阻止ssh提供错误的密钥

#2楼

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

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

#3楼

我选择了GIT_SSH环境变量。 这是我的包装器,类似于上面的Joe Block,但处理任意数量的参数。

文件〜/ gitwrap.sh

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

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

export GIT_SSH=~/gitwrap.sh

#4楼

当您需要使用正常请求( git pull origin master )连接到github时,在~/.ssh/config中将Host设置为*对我~/.ssh/config ,任何其他主机(例如,“github”或“gb”)都不是'工作。

Host *User gitHostname github.comPreferredAuthentications publickeyIdentityFile ~/.ssh/id_rsa_xxx

#5楼

其他人关于~/.ssh/config的建议比较复杂。 它可以很简单:

Host github.comIdentityFile ~/.ssh/github_rsa

#6楼

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

Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandvHost 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


#7楼

其中许多解决方案看起来很诱人。 但是,我发现以下链接中的通用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-commandif [ $# -eq 0 ]; thenecho "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.$$' 0if [ "$1" = "-i" ]; thenSSH_KEY=$2; shift; shiftecho "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验证这解决了我用远程bitbucket repo的用户/密钥识别问题; 所有这些现在在cron作业脚本中工作正常,否则在导航有限shell时遇到问题。 我也能够从R中调用这个脚本,仍然可以解决完全相同的cron执行问题(例如system("bash git.sh -i ~/.ssh/thatuserkey.pem pull") )。

不是R和Ruby一样,但如果R可以做到...... O :-)


#8楼

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

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

您可能需要重新启动计算机上的ssh服务。


#9楼

使用git 2.10 +(2016年第3季度:2016年9月2日发布),您可以为GIT_SSH_COMMAND设置配置 (而不仅仅是Rober Jack Will的答案中描述的环境变量)

请参阅NguyễnTháiNgọcDuy( pclouds ) 提交的3c8ede3 (2016年6月26日) 。
(由Junio C gitster合并- gitster -在提交dc21164 ,2016年7月19日)

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

core.sshCommand:

如果设置了此变量, git fetchgit push将在需要连接到远程系统时使用指定的命令而不是ssh
该命令与GIT_SSH_COMMAND环境变量的格式相同,并在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

#10楼

在使用Git Bash的Windows中,您可以使用以下命令添加存储库ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' 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' ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'哪个私钥在驱动器D中,计算机的文件夹测试。 此外,如果要克隆存储库,可以使用git clone更改git remote add origin

输入Git Bash之后,它会询问你的密码!

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

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


#11楼

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

您可以按每个仓库配置它:

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

#12楼

这样的东西应该工作(由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,它将通过环境变量找到它的代理; 反过来,这将加载密钥。

或者,如果您愿意设置仅包含.ssh目录作为HOME的目录,则设置HOME也可以.ssh ; 这可能包含identity.pub或配置文件设置IdentityFile。


#13楼

我使用zsh并在我的笔记本电脑上自动将不同的密钥加载到我的zsh shell的ssh-agent以用于其他目的(即访问远程服务器)。 我修改了@ 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仓库
  • 如果cd to repo dir成功,请从远程仓库中取出
  • 杀死ssh-agent。 (我不希望许多代理人徘徊。)

#14楼

对于gitlab RSAAuthentication yes

Host gitlab.comRSAAuthentication yesIdentityFile ~/.ssh/your_private_key_nameIdentitiesOnly yes

doc就在这里


#15楼

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

在我的情况下(synology),

Host my_synologyHostname xxxx.synology.meIdentityFile ~/.ssh/id_rsa_xxxxUser mynamePort xx

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

git clone my_synology:path/to/repo.git

#16楼

如果这里没有其他解决方案适合你,并且你已经创建了多个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 。


#17楼

您需要创建一个〜/ .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 [或simillar name])

然后git克隆如下

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

#18楼

如果你像我一样,你可以:

  • 保持你的ssh键有条理

  • 保持你的git clone命令简单

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

  • 减少ssh密钥维护。

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

我更喜欢约定优于配置。

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

第1步 - 创建别名

将此别名添加到shell: alias git-clone='GIT_SSH=ssh_wrapper git clone'

第2步 - 创建脚本

将此ssh_wrapper脚本添加到PATH:

#!/bin/bash
# Filename: ssh_wrapperif [ -z ${SSH_KEY} ]; thenSSH_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脚本,别名等,创建了一致的环境并帮助我保持简单。

KISS和名字很重要。

有关更多设计技巧,请参阅我的书中的第4章SOLID设计 : https : //www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

希望有所帮助。 - Lex


#19楼

GIT_SSH_COMMAND =“ssh -i / path / to / git-private-access-key”git clone $ git_repo


#20楼

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

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

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'

瞧! 你有一个快捷方式可以随时切换键!

希望这对你有用。


#21楼

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

host github.comControlPath ~/Projects/work/**HostName github.comIdentityFile ~/.ssh/id_workUser git

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


#22楼

问题是当您在同一主机 (例如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)

现在,您可以使用正确的键自动推送,获取...


#23楼

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

请参阅命令shell中的git manual: man git


#24楼

my_git_ssh_wrapper的内容:

#!/bin/bashssh -i /path/to/ssh/secret/key $1 $2

然后你可以通过这样做来使用密钥:

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

如何指定在Git上执行shell命令时使用的私有SSH密钥?相关推荐

  1. jenkins 插件执行shell命令时,提示“Command not found”处理方法

    首先提示找不到"Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具 ...

  2. java连接linux服务器执行shell命令(框架分析+推荐)

    java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...

  3. python调用shell命令-python中执行shell命令的几个方法小结

    最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 复制代码 代码如下: os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0或 ...

  4. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

  5. Python 执行 shell命令 的几个方法小结

    参考:https://blog.csdn.net/ronnyjiang/article/details/53333538 Python 执行 shell 命令 Python 可以执行 shell 命令 ...

  6. python中执行shell命令_python中执行shell命令的几个方法小结-阿里云开发者社区

    Python 执行 shell 命令 最近有个需求就是页面上执行shell命令,第一想到的就是os.system os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令 ...

  7. python中command是什么意思_python中command执行shell命令脚本方法

    在Python中有一个模块commands也很容易做到以上的效果. 看一下三个函数: 1). commands.getstatusoutput(cmd) 用os.popen()执行命令cmd, 然后返 ...

  8. java linux命令远程执行_java执行远程服务器上的shell命令

    所需jar包,commons-io-2.6.jar, ganymed-ssh2-262.jar import ch.ethz.ssh2.ChannelCondition; import ch.ethz ...

  9. Ganymed-ssh2实现scp上传和下载文件,以及执行shell命令

    使用Ganymed-ssh2执行远程机器上的Shell脚本,还可以使用SCP来上传和下载文件 严禁转载!!! pom依赖 <dependency><groupId>com.ai ...

最新文章

  1. 【Java源码分析】集合框架-Collections工具类-Arrays工具类
  2. yolov5损失函数笔记
  3. pcl中ransac提取直线_复杂场景中的一个图像配准思路
  4. leetcode343. 整数拆分(dp)
  5. php mysql 查询时间_PHP-MySQL查询需要大量时间才能执行
  6. 2021年考计算机考研三战,2021考研的小伙伴有3条忠告一定要记得,这些都是历年实战经验...
  7. sqlserver数据库中char、varchar、text与nchar、nvarchar、ntext数据类型使用详解
  8. 表字段identity
  9. java实现省市区的联动,chosen实现省市区三级联动
  10. 语言基础(9):static, extern 和 inline
  11. 关于.dll' could not be found 的问题以及解决方案
  12. 【数模】模糊综合评价模型
  13. HTML简单代码示例
  14. 搜狗输入法在别的屏幕
  15. 【python技能树】python程序设计思想
  16. 数据库表插入中文数据时报错Incorrect string value: ‘\xE4\xBB\x8E\xE5\x85\xA5...‘ for column ‘name‘ at r
  17. 20211高考成绩查询,青岛理工大学教务系统URP成绩查询、网上选课查分 http://211.64.192.21/,精英高考网...
  18. Excel 多条件筛选 与 数据透视表 实现
  19. 结构光相机国产、非国产统计参数对比分析
  20. linux 如何让程序后台执行

热门文章

  1. NotePad++ 宏录制使用
  2. 第十二周项目一-实现复数类中的运算符重载(3)
  3. oracle aul 索引,ORACLE恢復神器之ODU/AUL/DUL
  4. HTTP Content-Length与分块传输
  5. 华为dra路由方式分为relay和proxy_华为云计算(3)——网络虚拟化
  6. Enum类的非一般用法汇总(工作中遇到时持续更新)
  7. 1.4 以查询取代临时变量
  8. 知识回顾——构造函数
  9. margin-before: 1em; margin-after: 1em;margin-start:0px;margin-end: 0px;
  10. Java线程:新特征-条件变量(转)