如何防止用于执行 git 操作的 ssh 密钥在随后在 Windows 上打开新终端时也只被解密一次?

如何防止用于执行 git 操作的 ssh 密钥在随后在 Windows 上打开新终端时也只被解密一次?

Linux

在我的 Linux 系统上,每次启动系统时我都会解密一个私有 ssh 密钥。启动后,我打开终端并发出以下命令:

ssh-add ~/.ssh/id_rsa_some_key

然后我就可以执行 git 操作了,比如git clone <git-url>git pull -a等等。当我打开另一个终端并再次发出此类命令时,不会弹出要求输入加密 ssh-key 密码的提示。总之,在我的 linux 系统上我只需要输入一次密码。

视窗

我的工作电脑是 Windows 系统。启动后,我打开git bash并发出:

eval $(ssh-agent)

ssh-add ~/.ssh/private_key,输入密码并发出能够与 git 存储库通信的 git 命令。与我的 Linux 系统相反,当我打开一个新的 git-bash 并发出 git 命令时,会出现一个提示,要求输入密码。总之,当私钥在 git-bash 终端中解密后,就可以与 git 存储库进行交互,但是当打开新的终端时,应该再次解密 ssh-key。

我尝试了什么

我尝试使用 pageant。第一个问题是 id_rsa 不合适。必须使用 puttygen 创建一个新密钥,但后来发现无法使用以 git@ 开头的 ssh git url。必须将其替换为 https url,但这不是我想要的。

我更喜欢什么答案

我更喜欢满足以下标准的答案:

  1. 当 Windows 系统启动并打开终端执行 git 操作时,必须解密一次 Ssh 密钥
  2. 当打开新终端时,可以继续与 git 存储库进行交互,即不会弹出要求输入密码的提示。
  3. 我并不热衷于 git-bash。如果 Windows 上有另一个终端符合前两个条件,那么我就可以接受。

答案1

命令

eval $(ssh-agent)

启动 SSH 代理进程(相当于 Pageant),并通常创建两个环境变量:SSH_AUTH_SOCK 和 SSH_AGENT_PID(至少在 Linux 上,不知道 Windows git-bash 在这里是否有任何区别;可能没有)。

如果设置了 SSH_AUTH_SOCK 变量并指向有效的身份验证代理套接字,则任何可以读取该变量的进程都可以使用它。因此,您只需要一种方法来让此变量的值从一个 git-bash 会话传播到另一个。SSH_AGENT_PID 变量只是一种便利,允许在需要时轻松终止代理。

如果您可以将这些环境变量(甚至只是 SSH_AUTH_SOCK)存储在文件中,以便您后续的 git-bash 窗口可以读取它,您可以按照以下方式编写脚本:

每当启动新的 git-bash 时(即使用.bashrc脚本或其 git-bash 等效项)

  • 检查 SSH 代理环境变量文件是否存在
  • 如果文件存在:
    • 阅读
    • 如果文件中列出的代理套接字(以及可选的进程)仍然存在,则在当前会话中按原样使用变量。
  • 否则(即如果文件不存在或其信息已过时):
    • 跑步eval $(ssh-agent)
    • 创建一个新的 SSH 代理环境变量文件
  • 完毕!

此外,您可能需要以完整形式输入 SSH git URL,也就是说,不仅仅是这样[email protected]/project.git,您应该像这样输入:

ssh://[email protected]/project.git

从技术上讲,没有前缀的形式ssh://只是一种简写,以便在命令行上输入更方便。

相关内容