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 终端执行:
| |
交互过程中的关键选择:
- 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):
| |
查看状态:
| |
确认状态为 Running。
也可以使用 Windows 命令:
| |
4. 在 Termux 中连接
安装 SSH 客户端并连接:
| |
登录成功后:
- 提示符应为 Cygwin 的 bash。
- 可用命令为 ls、grep、vim 等 Unix 工具,而非 Windows 原生命令。
- 可用 which ls 验证,应指向 /usr/bin/ls。
5. 配置免密登录(可选)
目标:在 Termux 中生成密钥对,把公钥写入 Cygwin 的 authorized_keys, 之后 ssh 连接不再需要输入密码。
第一步,在 Termux 中生成密钥(若已有可跳过):
| |
一路回车,默认生成在 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub。
第二步,使用 ssh-copy-id 复制公钥:
| |
第三步,测试免密登录:
| |
不再提示输入密码即成功。
若 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 终端未以管理员权限运行,无法安装系统服务。
解决:
- 关闭当前 Cygwin 终端。
- 右键 Cygwin 图标 -> “以管理员身份运行”。
清理可能残留的服务:
1 2cygrunsrv -R sshd cygrunsrv -R cygsshd- 重新运行 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:
| |
错误 3:cygrunsrv 选项写法错误
症状:
$ cygrunsrv -start sshd cygrunsrv: --termsig is only allowed with --install
原因:cygrunsrv 的长选项必须用双横线 –, 单横线 - 会被解析成短选项(如 -s 被当作 –termsig)。
正确写法:
| 错误写法 | 正确写法 |
|---|---|
| cygrunsrv -start | cygrunsrv –start |
| cygrunsrv -stop | cygrunsrv –stop |
| cygrunsrv -query | cygrunsrv –query |
| cygrunsrv -R | cygrunsrv -R(短选项,合法) |
常用命令速查:
| |
错误 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 2 3 4# 正确 ssh-copy-id -i ~/.ssh/id_rsa.pub user@host # 错误:主机名后还有选项 ssh-copy-id user@host -i ~/.ssh/id_rsa.pub- 不要复制粘贴,手动重新输入整条命令,排除隐藏字符。
先尝试省略 -i,让工具使用默认公钥:
1ssh-copy-id user@host若 Termux 的 ssh-copy-id 仍不可用,改用手动方式:
在 Termux 中查看公钥内容:
1cat ~/.ssh/id_rsa.pub复制整行输出。用密码 SSH 登录到 Cygwin:
1ssh user@host在 Cygwin 中执行(替换为复制的公钥内容):
1 2 3 4mkdir -p ~/.ssh echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys退出后重新 ssh,应不再要求密码。
错误 7:密钥登录不生效(仍要求密码)
症状:authorized_keys 已写入,但 ssh 仍提示输入密码。
原因:Cygwin 的 Windows 权限映射常使 sshd 认为密钥文件权限“过宽”, 在 StrictModes 开启时拒绝使用该密钥。
解决:
检查 Cygwin 中 /etc/sshd_config 的 StrictModes 设置, 可尝试改为 no:
1 2# 编辑 /etc/sshd_config StrictModes no重启服务使配置生效:
1 2cygrunsrv --stop cygsshd cygrunsrv --start cygsshd- 也可检查 ~/.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 不再要求密码
命令速查表
| 操作 | 命令 |
|---|---|
| 配置 sshd | ssh-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。 只需注意以下几点即可稳定使用:
- 用管理员身份运行 Cygwin 完成配置;
- 服务名是 cygsshd 而非 sshd;
- 停用 Windows 自带 OpenSSH 服务,让 cygsshd 占用 22 端口, 并放行防火墙;
- 配置免密登录时,若 ssh-copy-id 报错则手动写入 authorized_keys;
- 密钥登录不生效时,检查 StrictModes 与文件权限。