Linux 的 Windows 子系统 - 共享 ssh-agent?

Linux 的 Windows 子系统 - 共享 ssh-agent?

我在 Windows 10 上的 Windows Subsystem for Linux (WSL) shell 中运行 Ubuntu 16.04。我可以从终端内启动 ssh-agent 并在该终端的生命周期内多次使用它。我可以从 ps 以及 Windows 10 任务管理器中看到 ssh-agent 正在运行。

但是,如果我从开始菜单启动第二个 WSL bash 终端,它不会意识到 ssh-agent。奇怪的是,如果我从 Windows 命令行启动第二个终端,它就可以工作。一种可能的解决方法是从现有的 bash 窗口中打开新的 bash 窗口,但我也不知道该怎么做。

有什么办法解决这个问题吗?

答案1

您可以修改 .bashrc 以查找现有的正在运行的 ssh 代理。

我使用基于的东西要旨

# ssh-agent configuration
if [ -z "$(pgrep ssh-agent)" ]; then
    rm -rf /tmp/ssh-*
    eval $(ssh-agent -s) > /dev/null
else
    export SSH_AGENT_PID=$(pgrep ssh-agent)
    export SSH_AUTH_SOCK=$(find /tmp/ssh-* -name agent.*)
fi

# optional... potentially annoying
#if [ "$(ssh-add -l)" == "The agent has no identities." ]; then
#    ssh-add
#fi

答案2

只是由于另一个新答案而发现了这一点,但这里的大多数答案都建议某种形式的启动脚本调整(例如~/.bashrc)。我建议不要重新发明轮子keychain

安装后(在大多数发行版存储库中可用,例如sudo apt install keychain),只需添加:

eval $(keychain --eval --agents ssh id_rsa)

...到你的~/.bashrc。这将正确设置当前会话的SSH_AGENT_PIDSSH_AUTH_SOCK变量以指向现有会话ssh-agent或在需要时启动一个新会话。这样,ssh-agent所有打开的 WSL/终端会话仅使用一个共享。

有趣的花絮——keychain最初是由 Daniel Robbins 编写的,他也是 Gentoo Linux 的创始人。

答案3

也许不是:听起来好像ssh-agent正在以通常的方式运行,它是 shell 的父进程。另一个窗口有自己的进程父/子层次结构,它与您正在使用的窗口无关。

一种工作方式此功能是在启动代理的窗口中ssh-agent运行screen(或)。tmux这些 screen/tmux 窗口也是进程的子进程ssh-agent,并且可以毫无问题地与之通信。

答案4

现在有了。安装最新版本的适用于 Windows 的 OpenSSH,然后得到ssh-代理-wsl帮手。按照说明操作,您将很容易获得在 WSL 和 Windows 之间共享凭据的有效方法!它就像一个魅力!

相关内容