有没有办法在powershell的stdout/stdin上输出和使用二进制文件?

问题描述 投票:0回答:1

我遇到了 powershell 脚本无法工作的问题,而使用相同命令的 dotnet 应用程序却可以工作。我相信问题与编码有关,我认为在 powershell 中编码是不同的,这会导致字节对象标记或解码/编码本身出现一些不透明的问题。

一点背景知识,我在 ssh 中使用代理命令来自动执行设置隧道的一些步骤。我有一个工作原型,它使用一个基于 dotnet 的小型可执行文件,将 stdin 和 stdout 转发到 tcp 套接字。不过,如果可能的话,我希望使用普通的 powershell 脚本。

应通过 stdin/stdout 转发的信息应按原样保留,无需任何编码转换,当我使用 dotnet 应用程序时,它完全可以工作,但是当我使用具有等效代码的 powershell 脚本时,ssh 基本上有时会报告数据包大小不同/意想不到的大。

任何人都知道我可以执行什么类型的调用来重置 powershell 以不编码 stdin/stdout 但映射数据 1:1?

    Host XXYYZZWW
        User server
        HostName 127.0.0.1
        Port 2222
        StrictHostKeyChecking no
        NumberOfPasswordPrompts 0
        PasswordAuthentication no
        BatchMode yes
        IdentityFile ~/.ssh/id_rsa
        ProxyCommand powershell -File D:/Workspaces/liquid/maintenancw/rustdesk-ssh.ps1 -LocalPort 2222 -RemotePort 22 -RemoteHost 127.0.0.1 -RustdeskId XXYYZZWW
param ($RustdeskId, $IdentityFile, $User, $LocalPort, $RemotePort, $RemoteHost, $RemoteUser)
Add-Type -AssemblyName @("System.Net", "System.Threading", "System.Collections")
[System.Net.Sockets.TcpClient] $tcpClient = [System.Net.Sockets.TcpClient]::new("localhost", "2222")
$tcpClient.NoDelay = $true
$tcpStream = $tcpClient.GetStream()
$stdin = [System.Console]::OpenStandardInput()
$stdout = [System.Console]::OpenStandardOutput()
[System.Threading.Tasks.Task]::WaitAll($tcpStream.CopyToAsync($stdout, 1), $stdin.CopyToAsync($tcpStream, 1))
powershell text encoding binary-data openssh
1个回答
0
投票
  • Windows PowerShellPowerShell(核心)7 直至版本 7.3.x,在向外部(本机)程序发送数据时始终仅“说出文本” stdin 流)以及从 接收数据(stdout 流)时。 数据

    发送
      (通过管道传送到)到外部程序是基于
    • $OutputEncoding首选项变量进行编码
      收到的数据
      根据存储在
    • [Console]::OutputEncoding
    • 中的编码进行解码
    PowerShell 7
  • 从版本 7.4 开始
  • ,现在支持原始字节流,但有限制: 您可以

    发送
      (通过管道)
    • [byte[]]

      数据到外部程序,这会导致后者接收此字节数组中包含的原始字节(您也可以通过管道传输数据逐字节

      [byte]
      ) ,但效果更差)。
      您可以从外部程序

      接收
    • 原始字节数据
    • 如果您使用

      >将其重定向到文件,即通过重定向

       - 没有直接的方法可以将数据作为
      [byte[]]数组接收记忆
      此外,管道现在隐式充当

      外部程序之间的原始字节管道。也就是说,如果数据从一个外部程序通过管道传送到另一个程序,则后者接收原始字节。
© www.soinside.com 2019 - 2024. All rights reserved.