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,但这不是我想要的。
我更喜欢什么答案
我更喜欢满足以下标准的答案:
- 当 Windows 系统启动并打开终端执行 git 操作时,必须解密一次 Ssh 密钥
- 当打开新终端时,可以继续与 git 存储库进行交互,即不会弹出要求输入密码的提示。
- 我并不热衷于 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://
只是一种简写,以便在命令行上输入更方便。