我有2个Git服务器,需要2个不同的SSH密钥.
git clone user1@server1:blahblahblah使用~/.ssh/id_rsa,但我需要根据我连接的服务器指定使用哪个密钥.
什么Git命令行参数完成这项工作?(我正在运行Linux)
Ric*_*ith 53
还有另一种可能性.那是设置core.sshCommand,例如
git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"
Run Code Online (Sandbox Code Playgroud)
当这个策略特别有用的时候有一个特殊情况:那就是当你在Github上拥有多个帐户时,因为所有帐户都是sshGithub,git@github.com并且它使用ssh密钥来确定你是哪个Github用户.在这种情况下,既.ssh/config不会也ssh-agent不会做你想要的.
更新 - 在拥有本地存储库之前无法运行上述内容,因此如果您尝试克隆远程存储库,则需要根据Guss的答案手动指定密钥:
GIT_SSH_COMMAND="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git clone https://github.com/user/repo
Run Code Online (Sandbox Code Playgroud)
一旦克隆了存储库,就可以使用该git config命令永久地设置它.
Cam*_*ner 40
如果您通过SSH连接,则密钥将由SSH参数控制,而不是git参数.
SSH在~/.ssh/config文件中查找配置参数.修改该文件并为两个Git服务器添加IdentityFile条目,如下所示:
Host server1.whatever.com
IdentityFile /path/to/key_1
Host server2.whatever.com
IdentityFile /path/to/key_2
Run Code Online (Sandbox Code Playgroud)
本文有更多细节.
Zaz*_*Zaz 31
通常,您想要使用~/.ssh/config此功能.只需将服务器地址与您要使用的密钥配对,如下所示:
Host github.com
IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
IdentityFile ~/.ssh/id_rsa.heroku
Host *
IdentityFile ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)
Host *表示任何服务器,因此我使用它来设置~/.ssh/id_rsa为要使用的默认密钥.
khe*_*lll 17
使用ssh-add path-to-private-key它开箱即用.
Gus*_*uss 17
在我的场景中,类似于@Richard Smith场景(其解决方案,BTW,对我来说不起作用),我需要在不同的存储库下为同一台服务器使用不同的密钥.
我的解决方法是使用环境变量正确设置会话GIT_SSH_COMMAND,如下所示:
export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"
Run Code Online (Sandbox Code Playgroud)
更新:
这里要注意的另一件事是正确设置环境变量可能是一个喧嚣,所以我使用像Liquid Shell的Liquid Prompt提供的命令提示修改工具挂钩到shell并继续根据环境变量更新当前目录和一些规则.例如,~/Documents/Projects/personal当我的shell钩子运行pwd并且发现当前目录在该路径下时,我需要使用Gitlab的个人SSH密钥的所有个人项目都是如此,它会GIT_SSH_COMMAND根据需要自动设置变量.
Mao*_*dok 11
您可以设置 --global 或 --local 配置,全局将更新~/.gitconfig文件,本地将更新存储库中的配置.git/config并覆盖全局(~/.gitconfig)配置
git config --local --add core.sshCommand 'ssh -i ~/.ssh/my_key'
小智 11
这里的 Windows 用户,我刚刚遇到了这个问题并且有一个稍微不同的解决方案,然后我在这里阅读到目前为止。我面临的问题是,我只想使用特定的私有 ssh 密钥克隆一个存储库,而不必像在 PowerShell 中工作那样全局配置我的 git 配置或添加特定的 git bash 设置。本质上,我只想在我的 .ssh 文件夹中放置一些私钥,并根据需要在特定的存储库中引用它们。
以下命令适用于此:
git clone -c core.sshCommand="ssh -i ~/.ssh/<PRIVATE KEY NAME>" <CLONE URL>
Run Code Online (Sandbox Code Playgroud)
本质上这是在 git repo 的初始化时它在运行克隆之前设置 core.sshCommand 选项。因此,您希望用于此存储库的特定 ssh 密钥仅为此存储库设置。这可能不是所有情况下的理想解决方案,但对于我想要的。
另一种选择是编写一个小脚本以使其core.sshCommand更智能 - 检查当前工作目录是否配置了特定的 SSH 密钥,如果是,则使用它,否则 - 依赖标准 SSH 密钥解析。
这是我的第一个版本:
#!/bin/bash
key="$(git config ssh.key)"
if [ -n "$key" ]; then
ssh -o IdentitiesOnly=yes -i "$key" "$@"
else
ssh "$@"
fi
Run Code Online (Sandbox Code Playgroud)
然后将其设置为全局git SSH 命令:
chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command
Run Code Online (Sandbox Code Playgroud)
(是SystemD 操作系统上“在此处放置用户脚本”~/.local/bin的当前标准)
设置完成后,您可以通过设置配置选项将任何存储库配置为使用特定的 SSH 密钥ssh.key:
git config --local ssh.key ~/.ssh/my-non-default-private-key
Run Code Online (Sandbox Code Playgroud)
ssh.key为“默认回退到非默认 SSH 密钥”或其他内容。core.sshCommand在存储库的根目录中执行时,您的自定义git-ssh-command可以查看它并对目录名称有一些启发。这可以在 部分中完成else,因此只有在 中没有特定键时启发式才会启动ssh.key。git remote -v检查以添加基于遥控器的启发式方法,就像在 Eike 的脚本中一样remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"在脚本的开头添加以解析正在操作的遥控器 - 并进行检查($remote看起来像输出中的中间列git remote -v)。这是自定义 SSH 命令的一个版本,它查看远程 URL 并执行一些启发式操作 - 就我而言,我有多个不同的身份,具有相同的公共 git 托管服务(一个用于工作,一个用于个人等),我可以选择通过查看远程 URL 来确定正确的身份(检查 Gitlab 组或 Github 组织等):
chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52324 次 |
| 最近记录: |