Windows 的 .ssh/config 文件 (git)

Posted

技术标签:

【中文标题】Windows 的 .ssh/config 文件 (git)【英文标题】:.ssh/config file for windows (git) 【发布时间】:2014-12-03 16:42:56 【问题描述】:

我一直在寻找有关如何使用多个 ssh 密钥的解决方案,我发现它可以与 .ssh 目录中的配置文件一起使用,但它不适用于 Windows。

我的问题是我正在使用私钥访问 git 服务器,所以它看起来像这样: ssh://git@example.com/directory ,当我使用 TortoiseGit 时它工作正常,因为有可能选择私钥。

但是我想在我的 IntelliJ IDEA 中使用 git rep,并且只有使用 git native shell 的选项,如果我将名为 id_rsa 的密钥放入 .ssh 文件夹,它也可以工作。现在我想使用多个 ssh 密钥(所以我的密钥将获得名称“id_rsa_test”,那么如何在 Windows 下配置 .ssh/config 文件,使其与普通的 git 服务器一起使用?

我发现的大多数示例仅用于 github。

【问题讨论】:

【参考方案1】:

如果你使用“Git for Windows”

>cd c:\Program Files\Git\etc\ssh\

添加到 ssh_config 如下:

AddKeysToAgent yes
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_test

ps。你需要 ssh 版本 >= 7.2 (发布日期 2016-02-28)

【讨论】:

【参考方案2】:

您可以在 Windows 10 上使用多个 ssh 密钥并指定允许的访问类型。

假设您已经创建了 ssh 安全密钥,并且它们存储在 C:\Users\[User]\.ssh

    打开文件夹C:\Users\[User]\.ssh

    创建文件config(无文件扩展名)

    在记事本等文本编辑器中打开文件,并为第一个远程主机和用户添加这些配置详细信息。保留 CMD 和 BASH 路径或只选择一种格式。然后在其下方复制并粘贴其他主机/用户组合,并根据需要进行修改。保存文件。

    Host [git.domain.com]
    User [user]
    Port [number]
    IdentitiesOnly=yes
    PreferredAuthentications publickey
    PasswordAuthentication no
    # CMD
    IdentityFile C:\Users\[User]\.ssh\[name_of_PRIVATE_key_file]
    # BASH
    IdentityFile /c/Users/[User]/.ssh/[name_of_PRIVATE_key_file]
    

    测试

使用 Bash(Windows 版 Git)
$ ssh -T git@[git.domain.com]
Welcome to GitLab, @[User]!
使用命令行(需要激活 Win 10 OpenSSH 客户端)
C:\Users\[User]>ssh -T git@[git.domain.com]
Welcome to GitLab, @[User]!
    对于故障排除,请使用 ssh -Tv git@[git.domain.com](或 -Tvv-Tvvv 以获得更高的详细级别)。

【讨论】:

谢谢你,这对我有帮助:) 这对我有用。谢谢。【参考方案3】:

这些说明在 Linux 中运行良好。在 Windows 中,它们今天不适合我。

我找到了一个对我有帮助的答案,也许这会对 OP 有所帮助。我亲吻了很多青蛙试图解决这个问题。您需要使用“ssh-add”添加新的非标准命名密钥文件!这是魔术子弹的说明:Generating a new SSH key and adding it to the ssh-agent。一旦您知道神奇的搜索词是“在 Windows 中使用 ssh-add 添加密钥”,您就会发现许多其他链接。

如果我经常使用 Windows,我会想办法让它永久化。 https://github.com/raeesbhatti/ssh-agent-helper.

ssh 密钥代理查找默认的“id_rsa”和它知道的其他密钥。您使用非标准名称创建的密钥必须添加到 ssh 密钥代理。

首先,我在 Git BASH shell 中启动密钥代理:

$ eval $(ssh-agent -s)
Agent pid 6276

$ ssh-add ~/.ssh/Paul_Johnson-windowsvm-20180318
Enter passphrase for /c/Users/pauljohn32/.ssh/Paul_Johnson-windowsvm-20180318:
Identity added: /c/Users/pauljohn32/.ssh/Paul_Johnson-windowsvm-20180318 (/c/Users/pauljohn32/.ssh/Paul_Johnson-windowsvm-20180318)

然后我切换到我要克隆 repo 的目录

$ cd ~/Documents/GIT/

$ git clone git@git.ku.edu:test/spr2018.git
Cloning into 'spr2018'...
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

我为此奋斗了很长时间。

这是我在此过程中尝试过的其他事情

起初我确定这是因为文件和文件夹权限。在 Linux 上,如果文件夹未设置为 700,我看到 .ssh 设置被拒绝。Windows 有 711。在 Windows 中,我找不到任何方法来设置权限 700。

在与那个斗争之后,我认为这一定不是问题。这就是为什么。 如果密钥被命名为“id_rsa”,那么 git 就可以了! Git能够连接到服务器。但是,如果我将密钥文件命名为其他名称,并以一致的方式修复配置文件,无论如何,git 都无法连接。这让我觉得权限不是问题。

调试此问题的方法是查看详细信息 使用配置的密钥从 ssh 命令输出。

在 git bash shell 中,运行这个

$ ssh -T git@name-of-your-server

注意,这里的用户名应该是“git”。如果您的密钥已设置并且 配置文件找到了,你看到了,因为我刚刚在我的Linux系统中测试过:

$ ssh -T git@git.ku.edu
Welcome to GitLab, Paul E. Johnson!

另一方面,在 Windows 中,我在应用“ssh-add”之前遇到了同样的麻烦。它想要git的密码,总是失败。

$ ssh -T git@gitlab.crmda.ku.edu
git@gitlab.crmda.ku.edu's password:

再次,如果我手动将我的密钥复制到“id_rsa”和“id_rsa.pub”,那么这工作正常。运行 ssh-add 后,在 Windows Git BASH 中观察胜利:

$ ssh -T git@gitlab.crmda.ku.edu
Welcome to GitLab, Paul E. Johnson!

如果你在这里,你会听到我快乐地跳舞的声音。

要找出问题所在,您可以使用“-Tvv”运行“ssh”

在 Linux 中,当它成功时我会看到:

debug1: Offering RSA public key: pauljohn@pols124
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp SHA256:bCoIWSXE5fkOID4Kj9Axt2UOVsRZz9JW91RQDUoasVo
debug1: Authentication succeeded (publickey).

在 Windows 中,当这失败时,我看到它正在寻找默认名称:

debug1: Found key in /c/Users/pauljohn32/.ssh/known_hosts:1
debug2: set_newkeys: mode 1
debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug2: set_newkeys: mode 0
debug1: rekey after 4294967296 blocks
debug2: key: /c/Users/pauljohn32/.ssh/id_rsa (0x0)
debug2: key: /c/Users/pauljohn32/.ssh/id_dsa (0x0)
debug2: key: /c/Users/pauljohn32/.ssh/id_ecdsa (0x0)
debug2: key: /c/Users/pauljohn32/.ssh/id_ed25519 (0x0)
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: publickey
debug1: Trying private key: /c/Users/pauljohn32/.ssh/id_rsa
debug1: Trying private key: /c/Users/pauljohn32/.ssh/id_dsa
debug1: Trying private key: /c/Users/pauljohn32/.ssh/id_ecdsa
debug1: Trying private key: /c/Users/pauljohn32/.ssh/id_ed25519
debug2: we did not send a packet, disable method
debug1: Next authentication method: password
git@gitlab.crmda.ku.edu's password:

这是我需要的提示,它说它找到了我的 ~/.ssh/config 文件,但从不尝试我希望它尝试的密钥。

我在很长一段时间内只使用一次 Windows,这令人沮丧。也许一直使用 Windows 的人会解决这个问题而忘记它。

【讨论】:

确认 ssh-add 是让我的 Cygwin 设置在 Windows 上运行所需的关键步骤。谢谢!一个小问题,普通的“ssh-agent -s”和eval有什么区别?【参考方案4】:

您可以在~/.ssh/config 文件中使用IdentityFile 选项并为每个主机指定密钥文件。

Host host_with_key1.net
  IdentityFile ~/.ssh/id_rsa

Host host_with_key2.net
  IdentityFile ~/.ssh/id_rsa_test

更多信息:http://linux.die.net/man/5/ssh_config

也看http://nerderati.com/2011/03/17/simplify-your-life-with-an-ssh-config-file/

【讨论】:

谢谢,但我确实试过了,我认为 windows 无法识别位于 ~/.ssh/ 中的配置,如果 git 找到该文件,是否有可能检查?跨度> 尝试使用环境变量,例如USERPROFILE:IdentityFile %USERPROFILE%/.ssh/id_rsa_test或相对路径:IdentityFile id_rsa_test 来自man页面:文件名可以使用波浪号语法来指代用户的主目录或以下转义字符之一:'%d'(本地用户的主目录) 、'%u'(本地用户名)、'%l'(本地主机名)、'%h'(远程主机名)或'%r'(远程用户名)。 - 尝试使用这些字符 我不知道为什么它不起作用。实际上 git 可以识别配置文件,因为如果我故意犯了语法错误,它甚至不会“加载”。但是,我尝试了unix语法,绝对路径,相对路径。你上一篇文章中的所有这些字符,我实际上不知道如何使用它们。 在 Windows 上,请确保您正在写信至 ~/.ssh/config 而不是 ~/.ssh/config.txt。默认情况下,文件扩展名在 Windows 上是隐藏的,所以这可能不明显【参考方案5】:

对我来说,我只在 Windows 上的 c:\Program Files\Git\etc\ssh\ 目录上添加了我的 Linux 系统上的 ~/.ssh/config 目录上的 configssh_config 文件。

在某些 git 版本中,我们需要编辑 C:\Users\<username>\AppData\Local\Programs\Git\etc\ssh\ssh_config 文件。

之后,我可以使用我在 Linux 上通常使用的所有别名和设置,通过 SSH 在Git Bash 上连接或推送。

【讨论】:

对我来说,配置文件名是“ssh_config”,只要它可以帮助任何人 感谢您的回答,在我这边,我发现正确的文件是C:\Users\itsme\AppData\Local\Programs\Git\etc\ssh\ssh_config【参考方案6】:

替代解决方案:告诉 git 哪个身份文件应用于某个存储库。因此,您必须使用 ssh [2] 的 -i 选项替换 git [1] 使用的默认 ssh 命令。

    在存储库中打开命令行 git config --local core.sshCommand "ssh -i ~/.ssh/<private_key_file>"

[1a]https://git-scm.com/docs/git-config#Documentation/git-config.txt-coresshCommand [1b]https://git-scm.com/docs/git-config#Documentation/git-config.txt---local [2]https://www.man7.org/linux/man-pages/man1/ssh.1.html

灵感来自 https://gist.github.com/rbialek/1012262#gistcomment-3730916

【讨论】:

以上是关于Windows 的 .ssh/config 文件 (git)的主要内容,如果未能解决你的问题,请参考以下文章

linux的ssh相关指令

find命令,linux和windows互传文件

ssh配置文件ssh_config和sshd_config区别

SSH 连接的 VS 代码远程开发问题(Windows 到 Linux)

~/.ssh/config 文件中的 SSH 端口转发? [关闭]

ssh config配置