首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.NET过程标准输出重定向不适用于OpenSSH SCP

VB.NET过程标准输出重定向不适用于OpenSSH SCP
EN

Stack Overflow用户
提问于 2022-02-02 09:58:24
回答 1查看 80关注 0票数 0

当我使用带有OpenSSH SCP可执行的System.Diagnostics.Process时,Standart输出不被重定向。

我正在管理的Windows PC上工作,必须将文件发送到一个仅受密码保护的SFTP服务器。由于我无法安装任何其他程序或库im与OpenSSH的默认客户端,没有密码参数。个人电脑背后是一个公司防火墙,无法访问互联网。但这就是我一直坚持的。

我的方法是使用System.Diagnostics.Process启动SCP命令,侦听密码提示,然后使用System.IO.StreamWriter发送它。

虽然这看起来确实适用于测试用例,在测试用例中,我听了ipconfig,然后发送了输入,但我正在与scpsftp和其他程序进行斗争,因为DefaultOutput似乎没有被重定向。

简化守则:

代码语言:javascript
复制
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时,它工作得很好。

EN

回答 1

Stack Overflow用户

发布于 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已经输出了这个过程。

我建议您阅读上面的文档链接。我用它们的示例代码中的几个关键点来修改您的代码:

  1. 您必须调用process.BeginOutputReadLine()才能使OutputHandler方法触发.

  1. 您需要调用process.WaitForExit()或设置process.EnableRaiseEvents = True并添加退出事件处理程序,否则您将永远不知道进程何时结束。

  1. 输出事件处理程序只有在将换行符(CR、LF或CR+LF)发送到StandardOutput流时才会调用。可能是这一行写着' Password:‘正在等待输入,所以新行已经发送,所以密码:还没有发送到我们的OutputHandler。因此,与OutputHandler方法不同,您可能需要直接访问StandardOutput流来读取,而无需等待换行符.

  1. ,您可能希望添加ErrorHandler方法(或类似的方法),以防收到错误消息到StandardError流,而不是输出流。

次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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70953573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档