gpt4 book ai didi

ssh - 如何根据URL路径或SSH参数(对于github部署 key )匹配SSH配置?

转载 作者:行者123 更新时间:2023-12-02 13:46:25 25 4
gpt4 key购买 nike

我正在尝试为github使用多个部署 key ,这意味着我需要根据存储库名称匹配我的SSH配置。我无法根据主机名,端口或用户进行匹配,因为它们都相同。只有仓库名称和部署 key 不同。

我知道这个问题以前曾被问过,但我找不到令人满意的答案,因为我对在github ssh URL中添加子域或用户不感兴趣。这个问题专门针对如何匹配不涉及修改默认github ssh URL的URL PATH或SSH参数或其他解决方法。

默认的ssh github url是git@github.com:githubusername/githubreponame.git
常用的SSH配置为:

# repo 1
# MATCH or HOST xxxxxxxxxxx
HostName github.com
User git
IdentityFile ~/.ssh/myrepo1name_rsa

# repo 2
# MATCH or HOST xxxxxxxxxxx
HostName github.com
User git
IdentityFile ~/.ssh/myrepo2name_rsa

按照ssh config手册 http://man7.org/linux/man-pages/man5/ssh_config.5.html,您可以使用2个参数来匹配配置,即HOST或MATCH。

我们已经知道,HOST无法做到这一点。因此,MATCH是唯一的方法:

The available criteria keywords for MATCH are: canonical, final, exec, host, originalhost, user, and localuser.



从这些MATCH标准关键字看来,它们似乎都没有访问 repo 名称或SSH参数或任何有用的东西的权限。

MATCH exec条件关键字似乎很有希望:

The exec keyword executes the specified command under the user's shell. If the command returns a zero exit status then the condition is considered true.


exec可以访问以下变量 http://man7.org/linux/man-pages/man5/ssh_config.5.html#TOKENS:
%h    The remote hostname.
%i The local user ID.
%L The local hostname.
%l The local hostname, including the domain name.
%n The original remote hostname, as given on the command line.
%p The remote port.
%r The remote username.
%u The local username.

这些变量都不对我有用。

我尝试了以下方法:
Match exec "pwd | grep myreponame1"
HostName github.com
User git
IdentityFile ~/.ssh/myreponame1_rsa

它是部分成功的,因为通常当我使用git时,我在repo目录中,因此 pwd | grep reponame将退出true。但这不适用于克隆或使用其他目录名。

我正在寻找更好的替代方法,它可能还会以某种方式使用 MATCH exec

编辑:到目前为止,我发现的最佳解决方案是:
Match exec "git remote get-url origin | grep reponame || echo $REPO | grep reponame"

但是我对此并不满意,因为我需要在git clone之前添加一个env变量。

最佳答案

您可以为特定的GitHub用户或存储库指定SSH key 。
在全局git配置中使用url规则更改主机名。然后在SSH代理配置中使用Host规则为主机名选择正确的身份。
示例:
GitHub用户名:user1
仓库:git@github.com:user1/repo.git
用户身份文件:~/.ssh/id_rsa_user1~/.gitconfig~/.config/git/config:

[url "git@github.com:"]
insteadOf = https://github.com/
[url "git@github-user1:user1"]
insteadOf = git@github.com:user1
~/.ssh/config:
AddKeysToAgent  yes
IdentitiesOnly yes

Host github-user1
HostName github.com
IdentityFile ~/.ssh/id_rsa_user1

Host *.example.com
IdentityFile ~/.ssh/id_rsa_example
Git将 git@github.com:user1替换为 git@github-user1:user1。因此,新的主机名将为 github-user1。然后,SSH代理将使用新的主机名来选择 user1身份文件 ~/.ssh/id_rsa_user1
现在,您可以使用以下命令克隆存储库:
git clone git@github.com:user1/repo.git
注释:
仅应用一个 url规则。因此,这将不起作用:
git clone https://github.com/user1/repo.git
SSH配置手册:
man ssh_config
参数含义:
  • AddKeysToAgent-首次使用时,将 key 及其 key 短语存储在代理中。
  • IdentitiesOnly-即使代理具有更多身份,也仅使用配置的身份。

  • 默认身份为 ~/.ssh/id_rsa。如果您使用它,请不要通过顶级 IdentityFileHost *规则进行设置,否则会遇到以下问题:
  • 默认身份使用IdentityFile ~/.ssh/id_rsa设置。
  • 默认身份位于代理中,而id_rsa_user1不存在。
  • 尽管有github-user1规则,代理仍将使用Host github-user1主机的默认标识。
  • 关于ssh - 如何根据URL路径或SSH参数(对于github部署 key )匹配SSH配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60683677/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com