在 PowerShell 中重用 运行 PuTTY 代理(选美)

Reuse in PowerShell a running PuTTY agent (pageant)

PS 5.1 中有没有办法重用 PuTTY 代理密钥?

现在,详情。

要使用密钥代理,需要有一个 Agent 来保存密钥(左框),以及 Client 委托管理的应用程序键(右框)。 例如,客户端应用程序 C1=putty 当然可以使用自己的代理 A1=pageant。 客户端应用程序 C2=winscp 知道如何直接使用 A1.

某些Client不能直接使用某些Agent,但是有Proxy代理可以弥合差距。 例如,要将 A1 与 C3 一起使用,我需要 Proxy P1=ssh-pageant,请参见下面的示例。 这有助于将多个客户端的密钥集中在一个代理中。 现在我的意思是为我的所有客户使用 A1(目前,只缺少 A1-C5 和 A1-C6)。

PS 5.1 中有没有办法重用 相同的 PuTTY 代理密钥? (即使用 A1 和 C5 的代理 Px)

可能有帮助https://superuser.com/a/1173570/245595


注释:

  1. 我没试过,但似乎 winssh-pageant 是 link A2 的代理,客户端应用程序直接理解 A1。

  2. 我目前正在尝试在 PS 中使用来自 msys2 的相同 ssh-pageant(它最终是一个 Windows 程序,而且他们经常这样做工作),手动替换 eval 在 msys2 中所做的(到目前为止没有运气,但我认为这是可以修复的):

    > cd <dir where ssh-pageant is>
    > .\ssh-pageant -r -a "$env:USERPROFILE\tmp\.ssh-pageant-$env:USERNAME"
    SSH_AUTH_SOCK='C:\Users\USER1\tmp\.ssh-pageant-USER1'; export SSH_AUTH_SOCK;
    SSH_PAGEANT_PID=714; export SSH_PAGEANT_PID;
    echo ssh-pageant pid 714;
    > $env:SSH_AUTH_SOCK='C:\Users\USER1\tmp\.ssh-pageant-USER1'
    > $env:SSH_PAGEANT_PID=714
    > ssh myserver
    Enter passphrase for key 'C:\Users\USER1/.ssh/id_rsa':
  1. 作为替代解决方法,是否有非管理员(我不想干涉它)方式将密钥加载到单独的代理中,这样当我开始一个 PS 会话,它使用那些其他键,这允许我继续使用我在 msys2 中重复使用的键? 这可能相当于同时使用两个不同的代理...

  2. weasel-pageant就是这样一个代理代理(基于Cygwin的ssh-pageant),对于WSL(A1-C7)...还在寻找[=149的解决方案=].

  3. ssh-agent-wslweasel-pageant 的一个分支,包括支持使用 Microsoft 的 SSH 代理服务(而不是 PuTTY Pageant)持有的密钥(A2-C7...我想 WSL 需要代理才能使用 Win OpenSSH 代理是很了不起的)。


关于如何使用“代理”代理的示例 ssh-pageant 到 link PuTTY 选美与 Cygwin bash

实现的步骤是:

  1. 当我在 Windows 开始我的会话时,便携式 PuTTY 代理 (pageant) 被执行,同时加载一个密钥。 为此,C:\Users\USER1\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 添加了快捷方式 pageant,指向 %myputty%\pageant.exe "%mykeys%\key1.ppk"
    这使得 PuTTY 和 WinSCP 可以使用密钥,例如 但是,如果我现在进入 PS 会话或 msys2/cygwin 终端,则不会使用这些密钥,并且系统会要求我提供这些密钥的密码。 所以如果我现在
    $ ssh myserver
    Enter passphrase for key 'C:\Users\USER1/.ssh/id_rsa':
  1. 在 msys2/cygwin 中,我可以使用 ssh-pageant(“Cygwin/MSYS 的 SSH 身份验证代理 links OpenSSH to PuTTY's Pageant”),这样它就可以重用任何东西先前加载的 PuTTY 代理具有的密钥。
    为此,我只是将 eval $(/usr/bin/ssh-pageant -r -a "/tmp/.ssh-pageant-$USERNAME") 添加到我的 msys2 的 ~/.bashrc 中。 现在,每当我启动 msys2 终端时,link PuTTY 的选美 -> ssh-pageant 都会建立,几个环境变量是已创建,我可以 ssh 无需输入密码
    $ env | grep -i ssh
    SSH_AUTH_SOCK=/tmp/.ssh-pageant-USER1
    SSH_PAGEANT_PID=960
    $ ssh myserver
    Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-40-generic x86_64)
    ...
  1. this来看,似乎Git bash.
  2. 也可以达到同样的效果

相关:

http://rabexc.org/posts/pitfalls-of-ssh-agents

https://superuser.com/questions/1327633/how-to-maintain-ssh-agent-login-session-with-windows-10s-new-openssh-and-powers

https://superuser.com/questions/1293725/gpg-agent-under-windows-as-ssh-agent-for-git-bash

我在 PS 会话中使用相同的 Cygwin 工具(即 ssh-pageant 和 Cygwin OpenSSH 客户端)完成了这项工作。

所以我会这样做(假设 ssh-pageant 已经是来自 Msys2 的 运行):

> cd <dir where ssh-pageant is>
> .\ssh-pageant -r -a "$env:USERPROFILE\tmp\.ssh-pageant-$env:USERNAME"
SSH_AUTH_SOCK='C:\Users\USER1\tmp\.ssh-pageant-USER1'; export SSH_AUTH_SOCK;
> $env:SSH_AUTH_SOCK='C:\Users\USER1\tmp\.ssh-pageant-USER1'
> .\ssh myserver
Logged in to myserver

我已将此添加到我的 profile.ps1(同样,当我开始 PS 会话时 ssh-pageant 已经 运行 时它会起作用)

$env:MSYS2_DIR=<mydir>
# Assuming a proxy ssh agent is already running
$env:SSH_AUTH_SOCK="$env:MSYS2_DIR\tmp\.ssh-pageant-$env:USERNAME"
# We have to make sure we use Msys2 OpenSSH ssh client, not Windows OpenSSH ssh client 
function ssh_msys2 {
    & $env:MSYS2_DIR\usr\bin\ssh.exe $args
}

如果 ssh-pageant 尚未激活,此 应该 工作(尚未测试;PID 编号可能不同):

> cd <dir where ssh-pageant is>
> .\ssh-pageant -r -a "$env:USERPROFILE\tmp\.ssh-pageant-$env:USERNAME"
SSH_AUTH_SOCK='C:\Users\USER1\tmp\.ssh-pageant-USER1'; export SSH_AUTH_SOCK;
SSH_PAGEANT_PID=714; export SSH_PAGEANT_PID;
echo ssh-pageant pid 714;
> $env:SSH_AUTH_SOCK='C:\Users\USER1\tmp\.ssh-pageant-USER1'
> $env:SSH_PAGEANT_PID=714
> .\ssh myserver
Logged in to myserver

还有几个要点要测试,自动化操作。
特别是,执行 ssh-pageant,检测返回的 PID #,如果是,则从 PS 设置环境变量 SSH_PAGEANT_PID。 这比在 Msys2 中要麻烦一点,因为 ssh-pageant 吐出一些可由 bash 直接执行的东西。