当我使用带有OpenSSH SCP可执行的System.Diagnostics.Process时,Standart输出不被重定向。
我正在管理的Windows PC上工作,必须将文件发送到一个仅受密码保护的SFTP服务器。由于我无法安装任何其他程序或库im与OpenSSH的默认客户端,没有密码参数。个人电脑背后是一个公司防火墙,无法访问互联网。但这就是我一直坚持的。
我的方法是使用System.Diagnostics.Process启动SCP命令,侦听密码提示,然后使用System.IO.StreamWriter发送它。
虽然这看起来确实适用于测试用例,在测试用例中,我听了ipconfig,然后发送了输入,但我正在与scp、sftp和其他程序进行斗争,因为DefaultOutput似乎没有被重定向。
简化守则:
Private Dim Output = ""
Public Function CreateAndStartProcess(FileName As String, Optional Arguments As String = "")
Dim targetProcess As New Process()
targetProcess.StartInfo.FileName = FileName
targetProcess.StartInfo.Arguments = Arguments
targetProcess.StartInfo.UseShellExecute = False
targetProcess.StartInfo.RedirectStandardInput = True
targetProcess.StartInfo.RedirectStandardOutput = True
targetProcess.StartInfo.CreateNoWindow = False
targetProcess.Start()
AddHandler targetProcess.OutputDataReceived, OutputHandler
return targetProcess
End Function
Sub OutputHandler(sender, e, process) //never gets called
If String.IsNullOrEmpty(e.Data) Then
Exit Sub
End If
Output = Output & Environment.NewLine & e.Data
End Sub
Dim targetProcess = CreateAndStartProcess("C:\\Windows\\Sysnative\\OpenSSH\\scp.exe", "C:\test.txt user@host:/test")
System.Threading.Thread.Sleep(2000) //just for simplification
Dim SW As System.IO.StreamWriter = targetProcess.StandardInput
SW.WriteLine("password")当我在OutputHandler中放置一个断点时,它就不会被调用。执行后,Output字符串为空
我遗漏了什么吗?当使用ipconfig时,它工作得很好。

发布于 2022-02-10 03:55:48
不知道你是怎么把它编译的。输出处理程序的方法签名错误.
根据您的VB代码,您可能正在尝试从https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.outputdatareceived?view=net-6.0重新创建https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.outputdatareceived?view=net-6.0示例。
我没有您想要连接的任何主机,所以它为我启动的OutputHandler是一个空字符串。但是,我在下面的代码中添加的ErrorHandler已经输出了这个过程。
我建议您阅读上面的文档链接。我用它们的示例代码中的几个关键点来修改您的代码:
。
次Main() Dim targetProcess = CreateAndStartProcess("C:\Windows\Sysnative\OpenSSH\scp.exe","C:\test.txt user@host:/test") targetProcess.BeginOutputReadLine() targetProcess.BeginErrorReadLine() Dim As System.IO.StreamWriter = targetProcess.StandardInput System.Threading.Thread.Sleep(2000) //只是为了简化SW.WriteLine(“密码”) targetProcess.WaitForExit() (如果不是String.IsNullOrEmpty(输出),那么Console.WriteLine(输出)如果不是String.IsNullOrEmpty(ErrorOutput)那么Console.WriteLine(ErrorOutput) )targetProcess.WaitForExit() targetProcess.Close() Console.WriteLine(Environment.NewLine & Environment.NewLine &“按任意键退出”)targetProcess.StartInfo.RedirectStandardOutput =“Console.ReadLine()子私有输出为String =”Private ErrorOutput As String = "“公共函数CreateAndStartProcess(FileName As String,可选参数为String = "")为Process Dim targetProcess As New Process() targetProcess.StartInfo.FileName = FileName targetProcess.StartInfo.Arguments =FileName targetProcess.StartInfo.UseShellExecute = False targetProcess.StartInfo.RedirectStandardInput = True targetProcess.StartInfo.RedirectStandardInput= True targetProcess.StartInfo.RedirectStandardError = True targetProcess.StartInfo.CreateNoWindow = False AddHandler targetProcess.ErrorDataReceived,AddressOf ErrorHandler AddHandler targetProcess.OutputDataReceived,AddressOf OutputHandler targetProcess.Start()返回targetProcess End函数Sub OutputHandler(发送方作为对象,e作为DataReceivedEventArgs)‘//如果String.IsNullOrEmpty( e.Data )那么退出Sub End,如果输出= Output &e.Data End Sub (发送方作为对象,‘//从不被调用,如果DataReceivedEventArgs( e.Data ),那么退出子结束,如果ErrorOutput = ErrorOutput & Environment.NewLine &e.Data End Sub
https://stackoverflow.com/questions/70953573
复制相似问题