通过SSH执行CMD中的PowerShell命令报错Sort-Object不识别如何解决
问题原因
- 核心是命令解析时的引号转义和管道符归属问题:你通过SSH传递命令时,外层包裹PowerShell指令的双引号会先被本地SSH客户端所在的shell(不管是Linux shell还是Windows CMD/PowerShell)解析移除,导致最终发送到Windows服务器的指令被拆分。
- Windows SSH服务默认的登录初始shell是CMD,因此当引号被移除后,命令里的
|管道符会被CMD优先识别处理,CMD会尝试把管道前的输出传给后面的Sort-Object,但CMD本身没有这个命令,就会抛出你看到的报错。
解决方案
- 对PowerShell命令外层的引号做嵌套转义,确保整个PowerShell指令块被完整传递到远程的powershell进程解析,而不是被CMD拆分:
- 如果你的SSH客户端运行在Linux/macOS shell环境下,用单引号包裹整个PowerShell命令块:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [username]@[server] 'powershell -command "Get-Childitem -Path [my source path] -Include *.bak -File -Recurse | Sort-Object -Descending -Property LastWriteTime | Select-Object -First 1 | Compress-Archive -Force -DestinationPath [my target path].zip"'- 如果你的SSH客户端运行在Windows CMD环境下,用连续双引号做嵌套转义:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [username]@[server] powershell -command """Get-Childitem -Path [my source path] -Include *.bak -File -Recurse | Sort-Object -Descending -Property LastWriteTime | Select-Object -First 1 | Compress-Archive -Force -DestinationPath [my target path].zip""" - (可选长期方案)修改Windows SSH服务的默认登录shell为PowerShell,后续传递PowerShell命令就不需要处理复杂转义:
登录到Windows服务器,在管理员权限的PowerShell中运行以下命令修改SSH默认shell配置:
配置完成后重启sshd服务生效:New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -ForceRestart-Service sshd
内容的提问来源于stack exchange,提问作者mohabbati
相关产品推荐
相关产品推荐

