【问题标题】:How to get output from powershell script over ssh?如何通过 ssh 从 powershell 脚本获取输出?
【发布时间】:2024-12-14 21:20:01
【问题描述】:

由于某种原因,我似乎无法获得输出和重定向以通过 ssh 从 linux 工作到 Windows。我有一个 powershell 脚本,它只在每个流上输出一条消息。

从 powershell 终端看起来像这样:

$ ssh me@windows.box.com
PS C:\Users\me> C:/"Program Files"/App3/bin/script.ps1 2> $null
This is output
This is to host
WARNING: This is a warning!
PS C:\Users\me> C:/"Program Files"/App3/bin/script.ps1 *>&1 2> $null
This is output
This is to host
WARNING: This is a warning!
C:\"Program Files"\App3\bin\script.ps1 : This is an error
At line:1 char:1
+ C:/"Program Files"/App3/bin/script.ps1 *>&1 2> $null
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,script.ps1

但由于某种原因,通过 ssh 命令,我无法将其他流重定向到标准输出:

$ ssh me@windows.box.com "C:/\\\"Program Files\\\"/App3/bin/script.ps1" 2>/dev/null
This is output
This is to host
WARNING: This is a warning!
$ ssh me@windows.box.com "C:/\\\"Program Files\\\"/App3/bin/script.ps1 *>&1" 2>/dev/null
This is output
This is to host
WARNING: This is a warning!

并澄清这似乎是特定于脚本的问题:

$ ssh me@windows.box.com "Write-Host \\\"This is to host\\\""
This is to host
$ ssh me@windows.box.com "Write-Output \\\"This is output\\\""
This is output
$ ssh me@windows.box.com "Write-Warning \\\"This is a warning\!\\\""
WARNING: This is a warning\!
$ ssh me@windows.box.com "Write-Error \\\"This is an error\\\""
Write-Error "This is an error" : This is an error
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

关于如何重定向脚本输出的任何想法?

我确实遇到了另一个问题,即在运行脚本时获取输出是不同的目录,但这是另一天的战斗,另一个 Stack Overflow 帖子。我在运行RHEL,脚本内容是:

Write-Output "This is output"
Write-Host "This is to host"
Write-Verbose "This message is definitely more verbose"
Write-Debug "This is marked debug"
Write-Warning "This is a warning!"
Write-Error "This is an error"

【问题讨论】:

  • 本地机器在linux上吗?
  • 另外,如果 script.ps1 抛出一些错误,为什么在终端上看不到呢?也许发布该脚本的内容以更清晰
  • @MikeTwc 嘿,迈克,感谢您的关注。我试图在没有实际做任何跑腿的情况下说明一个观点,但事实证明我的一个假设是错误的。我现在更困惑了,但我已经用你指出的所有内容更新了这个问题。
  • 忘了提及 *>file 也不能与 ssh 一起使用,所以这就是我使用 >file 2>file 的原因。
  • 我刚刚意识到它的位置,部分。如果我从 C:/test 或我的主目录运行脚本,我不会得到任何输出。如果我从 C:/Program Files/App3/bin/ 运行它,我会得到输出。

标签: windows powershell ssh


【解决方案1】:

我无法快速重新创建您的环境(Linux 主机/Windows 远程)。我至少尝试模仿跨平台环境(Linux VM 上的 powershell,Windows 上的 ssh 客户端)。以下是一些可能有用的注释,至少如果您打算将这些流放在文件中

与你不同,我在终端上运行时得到了相同的输出

ssh mike@Ubuntu "/snap/bin/pwsh ./test.ps1 *>&1"  (on local)
pwsh ./test.ps1 *>&1  (on remote)

虽然我在尝试通过 ssh 将输出重定向到文件时遇到了类似的问题(但如果从 powershell 会话中调用它会起作用)

 ssh mike@Ubuntu "/snap/bin/pwsh ./test.ps1 *>&1 test.log" 
  #adds only original success to the file, and prints error on terminal

因此,如果通过 ssh 调用,流到流的重定向似乎不起作用。尽管以某种方式流式传输到文件似乎可以工作

 ssh mike@Ubuntu "/snap/bin/pwsh ./test.ps1 >test.log  2>>test.log" 
 ssh mike@Ubuntu "/snap/bin/pwsh ./test.ps1" &> test.log #redirection works again on local

所以可能是一些 ssh/powershell 交互的奇怪错误。您可能会尝试使用标准 ps 远程协议与 ssh(如 Invoke-Command {echo 'hi'} -ComputerName YourMachine -Credentials $creds )

【讨论】:

  • 我必须使用 ssh 有很多原因,其中最重要的是我的本地主机是 linux。我看到您调用 powershell (我假设这就是 pwsh )来运行您的脚本。这会改变任何功能吗?
  • 是的,pwsh 与 powershell.exe 相同(仅在 linux 上)。 pwsh 路径或 pwsh -c "command" 应该与进入交互式 ps shell 并从那里运行脚本/文件一样。尝试在命令中添加重定向到文件,看看文件是否会捕获错误流。
  • 重定向到文件可以正常工作,包括使用“*”,这对于您的环境是不同的。这一切都非常挑剔和特殊。
  • 我接受这个答案是因为它指出了重定向输出的替代方法,即通过将输出重定向到文件。除非有人知道问题是什么,否则我会这样做。