我遇到了 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))
Windows PowerShell 和 PowerShell(核心)7 直至版本 7.3.x,在向外部(本机)程序发送数据时始终仅“说出文本” stdin 流)以及从 接收数据(stdout 流)时。 数据
发送$OutputEncoding
首选项变量进行编码收到的数据根据存储在[Console]::OutputEncoding
,现在支持原始字节流,但有限制: 您可以
发送