像管理 Linux 一样 SSH 到 Windows:OpenSSH Server 与 Git Bash 实战

在 Linux 运维中,ssh user@host 几乎是最自然的远程管理方式。登录之后,我们可以执行命令、查看日志、修改配置、拉取代码、运行脚本。问题是:如果目标主机是 Windows,能不能也像管理 Linux 一样,通过 SSH 进入一台 Windows 主机,并获得一个类似 Bash 的远程 Shell?

答案是:可以,但要分清"能用"和"适合怎么用"。

Windows 官方提供 OpenSSH Server,可以让 Windows 主机作为 SSH 服务端接收远程连接;同时,OpenSSH Server 还支持配置默认 Shell。也就是说,我们既可以让 SSH 登录后进入 PowerShell,也可以配置成进入 Git Bash。微软文档说明,Windows OpenSSH Server 可安装为系统组件,并通过 sshd 服务提供远程连接能力;其 Windows 专属配置也支持通过注册表配置默认 Shell。(Microsoft Learn)

不过,Git Bash 并不是完整 Linux 环境。Git for Windows 官方说明,它本质上是基于 MSYS2 的一个子集,提供 Git、Bash 以及部分 Unix 风格工具。(Git for Windows) 因此,Git Bash 更适合提供"类 Bash 的 Windows 远程操作体验",而不是把 Windows 变成一台 Linux。

一、Windows 上有哪些远程 Shell 方案

在 Windows 上,常见远程管理方式主要有三类。

第一类是 OpenSSH Server。这是最接近 Linux SSH 习惯的方案。客户端仍然使用:

bash 复制代码
ssh foo@windows-host

登录后进入 Windows 上配置的默认 Shell。这个 Shell 可以是 Windows PowerShell、PowerShell 7,也可以是 Git Bash。

第二类是 PowerShell Remoting 。这是 Windows 更传统的原生远程管理方案,基于 WS-Management。微软文档说明,Enable-PSRemoting 会配置计算机接收远程 PowerShell 命令。(Microsoft Learn) 在域环境、批量 Windows 运维、企业内网管理中,它依然很常见。

第三类是 RDP 远程桌面。它适合图形界面排障,但不是 Shell 方案,也不适合自动化脚本管理。

如果目标是"像 Linux 那样 ssh 进去执行命令",优先考虑 OpenSSH Server。

二、推荐架构:OpenSSH Server + PowerShell 或 Git Bash

一个典型结构如下:

text 复制代码
客户端 Linux/macOS/Windows
        |
        | ssh foo@windows-host
        v
Windows OpenSSH Server
        |
        v
默认 Shell:PowerShell / PowerShell 7 / Git Bash

其中,OpenSSH Server 负责认证、加密和会话管理;PowerShell 或 Git Bash 负责提供命令行交互环境。

如果你想要稳定、原生、适合生产的 Windows 管理体验,推荐默认 Shell 使用 PowerShell 7。

如果你想要更接近 Linux 的 Bash 操作习惯,可以把默认 Shell 配成 Git Bash,但要接受它的兼容性边界。

三、安装并启用 Windows OpenSSH Server

在目标 Windows 主机上,以管理员身份打开 PowerShell,安装 OpenSSH Server:

powershell 复制代码
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

启动 sshd 服务并设置开机自启:

powershell 复制代码
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

如果防火墙没有自动创建入站规则,可以手动放行 22 端口:

powershell 复制代码
New-NetFirewallRule `
  -Name "OpenSSH-Server-In-TCP" `
  -DisplayName "OpenSSH Server (sshd)" `
  -Enabled True `
  -Direction Inbound `
  -Protocol TCP `
  -Action Allow `
  -LocalPort 22

微软文档中的 OpenSSH Server 入门步骤也包含安装 Server 组件、启动服务和配置防火墙规则等内容。(Microsoft Learn)

然后在客户端测试连接:

bash 复制代码
ssh foo@windows-host

这里的 foo 是脱敏示例用户名,实际使用时替换为你的 Windows 本地账户或域账户。

四、默认进入 PowerShell:更适合生产运维

如果不额外修改默认 Shell,Windows OpenSSH 通常会进入 Windows 的默认命令环境。对于生产环境,我更推荐显式配置 PowerShell 7 作为默认 Shell。

示例:

powershell 复制代码
New-ItemProperty `
  -Path "HKLM:\SOFTWARE\OpenSSH" `
  -Name DefaultShell `
  -Value "C:\Program Files\PowerShell\7\pwsh.exe" `
  -PropertyType String `
  -Force

Restart-Service sshd

之后远程登录:

bash 复制代码
ssh foo@windows-host

登录后就是 PowerShell 7 环境。这样做的好处是,Windows 服务管理、注册表、事件日志、权限、网络配置等操作都更自然。

例如:

powershell 复制代码
Get-Service sshd
Get-EventLog -LogName System -Newest 20
Get-ChildItem C:\Users

如果你的目标是管理 Windows,而不是模拟 Linux,那么 PowerShell 是更稳妥的选择。

五、默认进入 Git Bash:获得类 Linux 体验

如果你已经安装 Git for Windows,就可以使用 Git Bash 作为 OpenSSH 登录后的默认 Shell。

常见的 Bash 路径是:

text 复制代码
C:\Program Files\Git\bin\bash.exe

以管理员身份执行:

powershell 复制代码
New-ItemProperty `
  -Path "HKLM:\SOFTWARE\OpenSSH" `
  -Name DefaultShell `
  -Value "C:\Program Files\Git\bin\bash.exe" `
  -PropertyType String `
  -Force

New-ItemProperty `
  -Path "HKLM:\SOFTWARE\OpenSSH" `
  -Name DefaultShellCommandOption `
  -Value "-lc" `
  -PropertyType String `
  -Force

Restart-Service sshd

微软文档说明,Windows OpenSSH Server 的默认 Shell 可以通过 HKLM:\SOFTWARE\OpenSSH\DefaultShell 配置;DefaultShellCommandOption 可用于控制远程命令传递给 Shell 时使用的命令参数。(Microsoft Learn)

配置完成后,从客户端登录:

bash 复制代码
ssh foo@windows-host

进入后可以测试:

bash 复制代码
pwd
whoami
git --version
ls

你可能会看到类似路径:

bash 复制代码
/c/Users/foo

这就是 Git Bash 对 Windows 路径的 Unix 风格映射。

六、Git Bash 远程 Shell 能做什么

Git Bash 作为 Windows SSH Shell,适合这些场景:

text 复制代码
Git 仓库操作
轻量文件管理
执行 Bash 风格脚本
调用 Windows 可执行文件
在 Linux/macOS 客户端上统一使用 ssh 入口

例如:

bash 复制代码
cd /c/Users/foo/project
git pull
./build.sh

也可以从 Git Bash 调用 Windows 命令:

bash 复制代码
ipconfig.exe
powershell.exe -NoProfile -Command "Get-Service sshd"
cmd.exe /c ver

这类混合操作很实用:外层是 Bash 风格,底层仍然可以调用 Windows 能力。

七、Git Bash 不是 Linux:必须理解边界

Git Bash 最大的误区,是把它当成完整 Linux。

它不是。它没有 Linux 内核语义,没有 systemd,没有 apt/yum/dnf,也不具备完整 Linux 文件权限模型。Git for Windows 官方也明确说明,它是 MSYS2 的一个子集,而不是完整 Linux 发行版。(Git for Windows)

因此,下面这些脚本很可能不能直接工作:

bash 复制代码
systemctl restart nginx
apt install foo
journalctl -u sshd
chmod +x some-service && systemctl enable some-service

路径也需要注意。Git Bash 中的:

bash 复制代码
/c/Users/foo/project

对应 Windows 中的:

text 复制代码
C:\Users\foo\project

这种路径转换对日常使用很方便,但在 Docker、rsync、复杂脚本参数、Windows 原生命令参数中,可能产生兼容性问题。

八、不要把 Git Bash 入口配置得太"花"

很多人会在 .bashrc.bash_profile 中加入欢迎语、彩色输出、自动检查更新、复杂 prompt。这在本地终端没问题,但在 SSH 场景中可能影响自动化工具。

尤其是 scpsftp、VS Code Remote-SSH、CI/CD 探测命令等,往往要求远程 Shell 在非交互模式下保持安静。建议在 .bashrc 顶部增加判断:

bash 复制代码
case $- in
  *i*) ;;
  *) return ;;
esac

然后把 alias、prompt、欢迎信息等只放在交互式 Shell 中:

bash 复制代码
alias ll='ls -alF'
alias gs='git status'

九、密钥认证与安全建议

SSH 暴露的是远程控制入口,不应该随意开放。

建议至少做到:

text 复制代码
优先使用 SSH 密钥认证
限制允许登录的用户或用户组
禁止弱密码
仅在可信内网或 VPN 后暴露 22 端口
按需关闭密码登录

可以在 C:\ProgramData\ssh\sshd_config 中配置:

text 复制代码
PubkeyAuthentication yes
PasswordAuthentication no
AllowUsers foo

修改后重启服务:

powershell 复制代码
Restart-Service sshd

微软文档说明,Windows OpenSSH Server 的配置文件通常位于 C:\ProgramData\ssh\sshd_config,配置变更后需要重启 sshd 服务才能生效。(Microsoft Learn)

十、PowerShell、Git Bash、WSL 怎么选

可以按目标选择:

目标 推荐方案
管理 Windows 服务、权限、事件日志、注册表 OpenSSH + PowerShell 7
像 Linux 一样用 ssh 登录并执行简单 Bash 命令 OpenSSH + Git Bash
运行真实 Linux 工具链 WSL、Linux VM 或真实 Linux 主机
企业域环境批量管理 Windows PowerShell Remoting
图形界面排障 RDP

我的建议是:

text 复制代码
生产 Windows 服务器:
    默认 Shell 使用 PowerShell 7。

开发机或内网工具机:
    可以尝试默认 Shell 使用 Git Bash。

需要真实 Linux 环境:
    不要用 Git Bash 硬模拟,直接使用 WSL、虚拟机或 Linux 主机。

十一、一个更稳妥的折中方案

如果你既想保留稳定的 Windows 运维能力,又想偶尔使用 Bash,可以把默认 Shell 保持为 PowerShell,然后在需要时手动启动 Git Bash。

默认 Shell 配成 PowerShell 7:

powershell 复制代码
New-ItemProperty `
  -Path "HKLM:\SOFTWARE\OpenSSH" `
  -Name DefaultShell `
  -Value "C:\Program Files\PowerShell\7\pwsh.exe" `
  -PropertyType String `
  -Force

Restart-Service sshd

登录后手动进入 Git Bash:

powershell 复制代码
& "C:\Program Files\Git\bin\bash.exe" -l

也可以远程执行一次性 Bash 命令:

bash 复制代码
ssh foo@windows-host '"C:\Program Files\Git\bin\bash.exe" -lc "pwd && git status"'

这种方式的好处是:默认入口稳定,Git Bash 作为辅助工具存在,不会影响所有 SSH 会话。

十二、结论

Windows 可以像 Linux 一样通过 SSH 远程登录和管理。实现方式是安装并启用 Windows OpenSSH Server,然后选择合适的默认 Shell。

如果目标是标准 Windows 运维,推荐使用 PowerShell 7。 如果目标是获得类 Linux 的 Bash 操作体验,可以结合 Git Bash。 但 Git Bash 不是完整 Linux,只适合轻量 Bash 风格操作、Git 工作流和简单自动化,不建议承担生产级 Linux 兼容环境的角色。

一句话总结:

text 复制代码
OpenSSH Server 让 Windows 可以被 ssh 进去;
PowerShell 适合真正管理 Windows;
Git Bash 适合提供类 Linux 的操作手感;
需要真实 Linux 时,应使用 WSL、虚拟机或 Linux 主机。
相关推荐
我是Superman丶1 小时前
Docker 镜像加速
运维·docker·容器
白緢1 小时前
二、Linux 开发工具
linux·运维·服务器
爱喝水的鱼丶1 小时前
SAP-ABAP:SAP 系统变量 SY-INDEX 学习笔记:从 1 开始的循环计数器
运维·开发语言·数据库·sap·abap
非凡ghost1 小时前
完美解码最新版(完美解码播放器)
windows·智能手机·pdf·firefox·软件需求
Lw老王要学习1 小时前
Windows 11 安装配置 Docker Desktop 并部署 sqlbot 完整指南
windows·docker·容器·agent·sqlbot
深蓝易网1 小时前
工厂目视化实操手册,告别形式主义
运维·网络·数据库·人工智能·汽车
songx_991 小时前
Linux基础3
linux·运维·服务器
半壶清水1 小时前
windows环境下,bmv2虚拟交换机的部署与使用方法
网络·windows·python·网络协议
拾光Ծ2 小时前
【Linux系统】进程信号(下):信号处理与“操作系统运行原理”
linux·运维·服务器·信号处理·操作系统原理