SSH ControlMaster在Windows上使用Cygwin是否可行?

34

有人能否在Windows上使用cygwin和control master创建多个会话而不必重复登录?我需要自动化一系列SSH步骤,但不能要求用户每次输入所需的令牌密码。

我已经在我的cygwin ssh_config中配置了以下内容:

Host *
    ControlMaster auto
    ControlPath /tmp/%r@%h:%p

当我启动第二个需要输入密码的连接时,主机会出现以下错误信息:

mm_receive_fd: no message header
process_mux_new_session: failed to receive fd 0 from slave

我看到其他人也遇到了这个问题,但是似乎找不到任何解决方法。

有人让它正常工作了吗?


3
虽然这与问题无关,但是使用 ControlPath /tmp/... 可能会让别人先将可预测的文件名写入 /tmp 以发起攻击。建议改用相对路径 ControlPath %r@%h:%p,这将把它放在您的 ~/.ssh 目录下。请注意不要更改原意。 - clacke
4
对于本机 Win32 OpenSSH,它在待办事项列表中(https://github.com/PowerShell/Win32-OpenSSH/issues/405)。对于 WSL,它可以直接运行。 - OrangeDog
4个回答

30

经过大量搜索后,显然结论是当前不可能实现此功能。以下是我找到的唯一与此相关的链接:

https://stackoverflow.com/questions/17140457/imitating-a-shared-ssh-session-for-scripts-on-windows “...但目前并没有适用于 Windows 的 OpenSSH 实现此功能(在Cygwin中通过Unix套接字传递文件描述符无法工作)。” 和

http://gcc.gnu.org/wiki/SSH_connection_caching "遗憾的是,如果您正在使用Cygwin上的OpenSSH,则不能利用连接缓存,因为Cygwin当前不支持通过Unix域套接字传递文件描述符。"


1
我喜欢这个2008年的回复:“计划是有的,长期存在。但更新则没有。” http://www.cygwin.com/ml/cygwin/2008-06/msg00280.html - clacke
10
这里有2015年的确认信息,表明仍然不可能。很遗憾。 - Andrew Schulman

5
对于Cygwin似乎仍不可行,但在Windows中是可以的。我在Windows上使用wsl-ssh-pageant和Windows Ubuntu Bash/WSL成功地实现了这一点。
在bash下安装socat。然后按照它所说的运行wsl-ssh-pageant,再用while循环和export命令。如果您正确设置了.ssh下的controlmaster并创建了ControlPath目录,则应该可以正常工作。

1
我不确定你想描述什么,但是wsl-ssh-pageant是一种工具,可以从WSL中访问PuTTY的ssh-agent。它与ssh多路复用无关,在WSL上可以直接使用。 - OrangeDog
WSL 实际上是 Linux...所以当然它会工作。不工作的是任何形式的 openssh 多路复用...无论是 cygwin 还是其他方式 - 因为没有人以除了套接字之外的任何方式实现它,而 Windows 没有套接字。最接近的轻量级解决方案就是使用 Putty 并启用其“重用连接”功能...我将发布一个单独的答案作为替代解决方案。 - dagelf

5

错误 1278 - CYGWIN 控制主连接不起作用。 描述了在2016年12月时部分实现的 ControlMaster/ControlPersist 在 Cygwin 下使用情况,但有个限制,它仅适用于需要远程命令而非需要伪终端的连接。

虽然此答案未经 Cygwin 的确认,但在 MSYS2 中验证为真(基于 Cygwin)。MSYS2 下的 openssh 支持 ControlMaster/ControlPersist 连接远程命令,但不支持交互式会话。

$ cygcheck -V | head -3
cygcheck (msys) 3.0.7
System Checker for Msys
Copyright (C) 1998 - 2019 Cygwin Authors

$ ssh -V
OpenSSH_8.1p1, OpenSSL 1.1.1d  10 Sep 2019

$ pacman -Qi openssh
Name            : openssh
Version         : 8.1p1-1
Description     : Free version of the SSH connectivity tools
Architecture    : i686
URL             : https://www.openssh.com/portable.html
Licenses        : custom:BSD
Groups          : net-utils
Provides        : None
Depends On      : heimdal  libedit  libcrypt  openssl
Optional Deps   : None
Required By     : sshpass
Optional For    : None
Conflicts With  : None
Replaces        : None
Installed Size  : 4.55 MiB
Packager        : Alexey Pavlov <alexpux@gmail.com>
Build Date      : Mon, Oct 14, 2019 1:12:28 AM
Install Date    : Thu, Oct 24, 2019 8:38:48 PM
Install Reason  : Explicitly installed
Install Script  : No
Validated By    : Signature

在未指定远程命令时运行ssh会产生以下错误:
mm_send_fd: sendmsg(2): Broken pipe
mux_client_request_session: send fds failed

当指定了远程命令时,错误就不会发生。


0

不,不是Cygwin,也不是OpenSSH或Dropbear - 但在Windows上有另一种轻量级的ssh多路复用选项:PuTTY支持“在可能的情况下共享SSH连接”

enter image description here

如果您需要控制台版本,我建议您按照以下列表逐步进行:https://en.wikipedia.org/wiki/Comparison_of_SSH_clients#Platform SSH多路复用可以大大降低初始连接延迟,因为初始握手已经完成。从技术上讲,在Cygwin上实现完整的UNIX套接字功能是可能的,并且非常有用,但要正确地执行这项任务需要付出一定的努力。其中一些功能已经存在,但不太可能安全,并且是一种hack,请参见What mechanism is used by MSYS/Cygwin to emulate Unix domain sockets?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接