PowerShell over SSH 是什么
这是把 PowerShell 远程执行的传输层从 WinRM 换成 SSH:目标机上以 SSH 子系统的方式启动 pwsh,客户端用 -SSHTransport 建立会话。好处是跨平台、跨网段、不依赖域信任——Windows 与 Linux 混在一起的环境里,只要 22 端口通就能用同一套命令管理。代价是只支持 SSH 传输自己的参数,WinRM 专有的能力在它上面用不了。
基本信息
| 适用平台 | PowerShell 7 为主的跨平台环境(Windows / Linux / macOS) |
|---|---|
| 服务端配置 | 在 sshd_config 里以 Subsystem powershell 指定 pwsh 可执行文件 |
| 客户端语法 | New-PSSession -HostName 用户@主机 -SSHTransport |
| 前置条件 | SSH 服务已运行、端口可达、密钥或口令认证可用 |
| 传输差异 | 不支持 CredSSP 等 WinRM 专有参数 |
| 相关命令 | ssh user@host 'hostname' 可先做冒烟测试 |
典型使用场景
- 无法开启 WinRM 的受限网络里仍要批量执行 PowerShell
- Windows 与 Linux 混合环境中用同一套脚本跨平台管理
- 跨域或跨信任边界时避开 Kerberos 信任依赖
- 临时跳板排障:先 ssh 通再建会话扩展为脚本执行
- 作为远程通道的兜底方案,在 WinRM 全线故障时保持可运维
常用示例
常用示例
# 服务端 %ProgramData%\ssh\sshd_config 增加一行(路径按实际安装位置)
# Subsystem powershell C:/Progra~1/PowerShell/7/pwsh.exe -sshs -NoLogo
Restart-Service sshd # 改完重启 SSH 服务
ssh user@web01 'hostname' # 先冒烟验证 SSH 通
ssh user@web01 'pwsh -v' # 确认子系统与版本
$s = New-PSSession -HostName user@web01 -SSHTransport # 建立 PowerShell 会话
Invoke-Command -Session $s { $PSVersionTable.PSVersion }
Remove-PSSession $s # 用完释放WinRM 与 SSH 传输对比
| 对比项 | WinRM | SSH 传输 |
|---|---|---|
| 默认端口 | 5985 / 5986 | 22 |
| 域信任依赖 | 有 | 无 |
| 跨平台 | Windows 为主 | Windows 与 Linux 通用 |
| 专有参数 | 支持 CredSSP | 不支持 |
| 配置位置 | WinRM 服务与监听器 | sshd_config 子系统 |
sshd_config 里的路径含空格时容易出问题:用 8.3 短名(如 C:/Progra~1)或给整段加引号,否则子系统起不来,客户端会报找不到子系统。
SSH 传输不支持 WinRM 专有认证机制,二次跳转类的需求无法照搬既有方案;涉及多跳访问的场景要重新设计路径,不要假设换掉传输层就能原样跑通。
别只顾着看 PowerShell 侧的报错:Windows 上 SSH 的登录失败与子系统启动异常会写进事件日志或 %ProgramData%\ssh 下的日志文件,客户端提示含糊时去那里通常能看到确切原因。