cygwin + autossh

前言

Windows 平台上进行端口转发总是会莫名其妙的断连,即使已经在服务端和客户端修改对应的配置,在一段时间后仍然会断开。可能的原因是中间经过的交换机路由器防火墙等设备过滤了ssh心跳包。实在不想在这上面费时间了,直接用 autossh 进行自动重连。
Windows 使用 autossh 需要安装 Cygwin,这是一个开源的免费软件,可以在 Windows 操作系统中提供类 Unix 的环境和工具,可以将它理解为运行在 Microsoft Windows 上的流行 GNU 和其他开源工具的发行版,它可以让用户在 Windows 上运行类 Unix 的应用程序、Shell 脚本和命令行工具。Cygwin 的核心部分是 cygwin1.dll,它提供了这些程序所期望的 POSIX 系统调用和环境。

cygwin + autossh

配置

  1. cygwin官网 下载cygwin setup-x86_64.exe
  2. 点击运行,直接默认选择然后下一步,到了选择安装包时记得别忘了选择 autossh,然后等待下载安装完成。
  3. 打开 cygwin 的终端,输入端口转发的命令,只需把 ssh 换成 autossh 就行了。
    1
    autossh -M 12345:54321 -o ServerAliveInterval=60 -N -R 5000:192.168.5.4:8080 user@ip
    • 12345是本地监控端口。
    • 54321是远程服务器上的监控端口。
    • 设置为 -M 0 就是不使用监听端口。

注意事项

  1. 这篇博客中出现了 autossh 总是自动重连的问题,总结的经验是注意监听端口不要选择低位端口,否则可能会在远端启动失败,导致 ssh 总是被重启
  2. 当本地主机人为中断autossh,虽然关闭了,但服务器ssh主机的autossh监控端口仍然处于监听状态,要等到一段时间后才能停用监听端口,这样在autossh监听端口未超时之前,目的地主机重新启动autossh会导致创建ssh隧道失败。
  3. 此外,autossh将通过一对监控端口来回发送数据,以便跟踪已建立的连接,默认接收端口比发送端口大1,比如发送的端口30000,那么接收数据的端口就是30001

免密登录

  1. 生成密钥
    1
    ssh-keygen -t rsa
    生成的密钥可以在cygwin安装的路径下找到,我这里是D:\cygwin\home\WangZX\.ssh
  2. 将公钥文件导入给服务器
    1
    ssh-copy-id -i /home/WangZX/.ssh/id_rsa.pub user@ip
    完成后就不需要输入密码了。

开机自启动

  1. Cygwin的安装目录下创建脚本,我这里是D:\cygwin\home\user\mybat,然后在mybat文件夹创建一个start.sh,内容如下所示:
    1
    /usr/bin/autossh -M 12345:54321 -o ServerAliveInterval=60 -N -R 5000:192.168.5.4:8080 user@ip
  2. 赋予执行权限,在Cygwin终端中运行以下命令,赋予脚本执行权限:
    1
    chmod +x /home/user/mybat/start.sh
  3. 创建Windows批处理文件,例如start.bat,内容如下所示:
    1
    D:\cygwin\bin\mintty.exe /bin/bash -l -c "/home/usr/mybat/start.sh"
  4. start.bat放入启动文件夹C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp,这样系统启动时会自动执行该脚本。

另外,把自动打开Open WebUIbat脚本也添加进去,如下所示:

1
start cmd /k "conda activate py311 && open-webui serve"

更新

用了一段时间,确实好用。连续几天不关机,一次断联也没有。