Termux 远程连接 Windows Cygwin 终端

Termux 远程连接 Windows Cygwin 终端

目标概述

在 Android 上的 Termux 中,通过 SSH 远程登录 Windows 机器, 但登录后进入的是 Cygwin 的 bash 终端,而不是 Windows 原生的 cmd 或 PowerShell。

核心思路:

  • 不在 Windows 上使用自带的 OpenSSH 服务(它默认拉起 cmd/PowerShell)。
  • 改为在 Cygwin 环境内单独运行一套 sshd,登录后即进入 Cygwin 的 Unix 环境。
  • Termux 使用标准 SSH 客户端连接即可。

前置条件

  • Windows 主机(已安装 Cygwin)。
  • Android 设备(已安装 Termux)。
  • 两台设备处于同一网络,或 Windows 可被 Termux 访问(同一局域网最简单)。
  • 知道 Windows 的 IP 地址与登录用户名。
  • 必须以管理员身份运行 Cygwin 终端,否则无法安装系统服务(见下方“权限问题”)。

操作步骤

1. 在 Cygwin 中安装必要组件

运行 Cygwin 安装程序(setup-x86_64.exe),在包选择界面确保勾选:

  • openssh
  • cygrunsrv

安装完成后,右键 Cygwin 图标 -> “以管理员身份运行” 打开终端。

2. 配置 Cygwin 的 sshd 服务

在管理员身份的 Cygwin 终端执行:

1
ssh-host-config

交互过程中的关键选择:

  • Overwrite existing /etc/ssh_config file? -> yes
  • Overwrite existing /etc/sshd_config file? -> yes
  • Should StrictModes be used? -> yes(推荐)
  • “Do you want to install sshd as a service?” -> yes
  • Enter the value of CYGWIN for the daemon: [] -> 直接回车留空

配置成功后,终端会输出类似提示:

*** Info: The sshd service has been installed under the LocalSystem
*** Info: account (also known as SYSTEM). To start the service now, call
*** Info: `net start cygsshd' or `cygrunsrv -S cygsshd'.  Otherwise, it
*** Info: will start automatically after the next reboot.

注意服务名是 cygsshd,不是 sshd(见下方“服务名变更”)。

3. 启动 Cygwin 的 sshd 服务

启动服务(注意服务名 cygsshd):

1
cygrunsrv --start cygsshd

查看状态:

1
cygrunsrv --query cygsshd

确认状态为 Running。

也可以使用 Windows 命令:

1
net start cygsshd

4. 在 Termux 中连接

安装 SSH 客户端并连接:

1
2
pkg install openssh
ssh 你的Windows用户名@Windows的IP地址

登录成功后:

  • 提示符应为 Cygwin 的 bash。
  • 可用命令为 ls、grep、vim 等 Unix 工具,而非 Windows 原生命令。
  • 可用 which ls 验证,应指向 /usr/bin/ls。

5. 配置免密登录(可选)

目标:在 Termux 中生成密钥对,把公钥写入 Cygwin 的 authorized_keys, 之后 ssh 连接不再需要输入密码。

第一步,在 Termux 中生成密钥(若已有可跳过):

1
ssh-keygen -t rsa -b 4096

一路回车,默认生成在 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub。

第二步,使用 ssh-copy-id 复制公钥:

1
ssh-copy-id 你的Windows用户名@Windows的IP地址

第三步,测试免密登录:

1
ssh 你的Windows用户名@Windows的IP地址

不再提示输入密码即成功。

若 ssh-copy-id 在 Termux 中报错(见下方“错误 6”), 可改用手动方式复制公钥。

常见错误与解决方案

错误 1:权限不足(Non-admin)

症状:

*** Warning: Running this script typically requires administrator privileges!
*** Warning: However, it seems your account does not have these privileges.

原因:当前 Cygwin 终端未以管理员权限运行,无法安装系统服务。

解决:

  1. 关闭当前 Cygwin 终端。
  2. 右键 Cygwin 图标 -> “以管理员身份运行”。
  3. 清理可能残留的服务:

    1
    2
    
    cygrunsrv -R sshd
    cygrunsrv -R cygsshd
  4. 重新运行 ssh-host-config。

错误 2:服务名错误 – Win32 error 1060

症状:

$ cygrunsrv --start sshd
cygrunsrv: Error starting a service: OpenService:  Win32 error 1060:
(服务未安装)

原因:Cygwin 新版本的 sshd 服务名已改为 cygsshd, 继续用 sshd 操作会提示“服务未安装”。

解决:所有命令把 sshd 换成 cygsshd:

1
2
3
4
cygrunsrv --start cygsshd
cygrunsrv --query cygsshd
cygrunsrv --stop  cygsshd
cygrunsrv -R      cygsshd   # 卸载服务

错误 3:cygrunsrv 选项写法错误

症状:

$ cygrunsrv -start sshd
cygrunsrv: --termsig is only allowed with --install

原因:cygrunsrv 的长选项必须用双横线 –, 单横线 - 会被解析成短选项(如 -s 被当作 –termsig)。

正确写法:

错误写法正确写法
cygrunsrv -startcygrunsrv –start
cygrunsrv -stopcygrunsrv –stop
cygrunsrv -querycygrunsrv –query
cygrunsrv -Rcygrunsrv -R(短选项,合法)

常用命令速查:

1
2
3
4
5
cygrunsrv --start  cygsshd   # 启动
cygrunsrv --stop   cygsshd   # 停止
cygrunsrv --query  cygsshd   # 查询状态
cygrunsrv -R       cygsshd   # 卸载服务
cygrunsrv -L                 # 列出所有 cygrunsrv 服务

错误 4:端口冲突

症状:cygrunsrv –start cygsshd 失败,日志中提示端口被占用。

原因:Windows 自带的 OpenSSH 服务(sshd)默认占用 22 端口。

解决:停用 Windows 自带服务。在“服务”管理器中将 OpenSSH SSH Server 停止,并将其启动类型设为“手动”或“禁用”。 这样 Cygwin 的 cygsshd 就能正常占用 22 端口,Termux 直接 ssh 用户名@IP 即可,无需指定端口。

错误 5:防火墙拦截

症状:Termux 连接超时或 Connection refused。

解决:

  • 确保 Windows 防火墙允许 22 端口的入站连接。
  • 在“高级安全 Windows Defender 防火墙” -> “入站规则” 中新增规则。
  • 或临时关闭防火墙测试(仅调试用,勿长期关闭)。

错误 6:ssh-copy-id 报 “Too many arguments”

症状:

/data/data/com.termux/files/usr/bin/ssh-copy-id: ERROR: Too many arguments.
Expecting a target hostname, got:

报错末尾 got: 后面为空,说明 ssh-copy-id 在解析参数时收到了 它无法识别的额外参数(可能是不可见字符、多余空格,或选项位置不当)。

排查与解决:

  1. 确认主机名是最后一个参数,选项都在主机名之前:

    1
    2
    3
    4
    
    # 正确
    ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
    # 错误:主机名后还有选项
    ssh-copy-id user@host -i ~/.ssh/id_rsa.pub
  2. 不要复制粘贴,手动重新输入整条命令,排除隐藏字符。
  3. 先尝试省略 -i,让工具使用默认公钥:

    1
    
    ssh-copy-id user@host
  4. 若 Termux 的 ssh-copy-id 仍不可用,改用手动方式:

    在 Termux 中查看公钥内容:

    1
    
    cat ~/.ssh/id_rsa.pub

    复制整行输出。用密码 SSH 登录到 Cygwin:

    1
    
    ssh user@host

    在 Cygwin 中执行(替换为复制的公钥内容):

    1
    2
    3
    4
    
    mkdir -p ~/.ssh
    echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

    退出后重新 ssh,应不再要求密码。

错误 7:密钥登录不生效(仍要求密码)

症状:authorized_keys 已写入,但 ssh 仍提示输入密码。

原因:Cygwin 的 Windows 权限映射常使 sshd 认为密钥文件权限“过宽”, 在 StrictModes 开启时拒绝使用该密钥。

解决:

  1. 检查 Cygwin 中 /etc/sshd_config 的 StrictModes 设置, 可尝试改为 no:

    1
    2
    
    # 编辑 /etc/sshd_config
    StrictModes no
  2. 重启服务使配置生效:

    1
    2
    
    cygrunsrv --stop cygsshd
    cygrunsrv --start cygsshd
  3. 也可检查 ~/.ssh 与 authorized_keys 的权限是否确实为 700 / 600。

注意:关闭 StrictModes 会降低安全性,仅在受信任的局域网环境使用。

验证清单

  • Cygwin 中 openssh、cygrunsrv 已安装
  • Cygwin 终端以管理员身份运行
  • ssh-host-config 已完成,服务以 cygsshd 名称安装
  • Windows 自带 OpenSSH 服务已停用,22 端口空闲
  • cygrunsrv –query cygsshd 显示 Running
  • Windows 防火墙放行 22 端口
  • Termux 中 ssh 用户名@IP 成功登录
  • 登录后 which ls 指向 Cygwin 路径(如 /usr/bin/ls)
  • (可选)免密登录生效,ssh 不再要求密码

命令速查表

操作命令
配置 sshdssh-host-config
启动服务cygrunsrv –start cygsshd
停止服务cygrunsrv –stop cygsshd
查询状态cygrunsrv –query cygsshd
卸载服务cygrunsrv -R cygsshd
列出所有服务cygrunsrv -L
Windows 启动服务net start cygsshd
生成密钥ssh-keygen -t rsa -b 4096
复制公钥ssh-copy-id 用户名@IP
Termux 连接ssh 用户名@IP

小结

通过让 Cygwin 自己运行 sshd(服务名 cygsshd),Termux 远程登录后 得到的是完整的 Cygwin Unix 环境,而非 Windows 的 cmd/PowerShell。 只需注意以下几点即可稳定使用:

  1. 用管理员身份运行 Cygwin 完成配置;
  2. 服务名是 cygsshd 而非 sshd;
  3. 停用 Windows 自带 OpenSSH 服务,让 cygsshd 占用 22 端口, 并放行防火墙;
  4. 配置免密登录时,若 ssh-copy-id 报错则手动写入 authorized_keys;
  5. 密钥登录不生效时,检查 StrictModes 与文件权限。