当前位置: 首页 > 编程语言 > C#

如何写入stdin-从SSH连接的远程进程的stdout读取?(Renci.SshNet)分享

时间:2023-04-10 19:09:56 C#

如何使用SSH连接写入/读取远程进程的stdin?(Renci.SshNet)我想连接到SSH服务器,在连接时,它运行一个自定义命令,该命令将XML作为输入(UTF-8编码,多行,每行在XML文档标记的末尾它的末尾有一个特殊的行)和输出XML(UTF-8编码,多行,末尾有相同的特殊行,表示文档结束)。目前有一种机制(意思是:服务器端确实按规定工作)使用plink.exe(PuTTy名声),但我消除了对外部进程的需要。我正在试用Renci.SshNet库,但我发现文档不充分并且无法找到我需要的示例。我到目标前停止的尝试:使用系统;使用Renci.SshNet;namespaceServerConnect{publicclassServerConnection{privateconststringEOC="*-*COMMANDDELIMITER*-*";私有SshClientscon;私有System.IO.Stream标准输入、标准输出、标准错误;私有System.IO.StreamWriterstdin_writer;私有System.IO.StreamReaderstdout_reader;私有壳壳;publicServerConnection(stringkeyFileName,stringkeyFilePassphrase){ConnectionInfoci=newConnectionInfo("my.server.local",22,"datamgr",newPrivateKeyAuthenticationMethod("datamgr",newPrivateKeyFile(keyFileName,keyFilePassphrase)));this.scon=newSshClient(ci);}publicServerConnection(stringkeyFilePassphrase):this("client_id_rsa",keyFilePassphrase){}publicvoidConnect(){this.scon.Connect();this.stdin=newSystem.IO.MemoryStream();this.stdin_writer=newSystem.IO.StreamWriter(stdin);this.stdout=newSystem.IO.MemoryStream();this.stdout_reader=newSystem.IO.StreamReader(stdout);你s.stderr=newSystem.IO.MemoryStream();this.shell=this.scon.CreateShell(this.stdin,this.stdout,this.stderr);这个.shell.Start();}publicvoidDisconnect(){this.scon.Disconnect();}publicstringCommand(stringtext){Console.WriteLine("发送命令");this.stdin_writer.WriteLine(文本);Console.WriteLine("发送EOC");this.stdin_writer.WriteLine(EOC);this.stdin_writer.Flush();对于(;;){字符串行;line=this.stdout_reader.ReadLine();if(line==null){Console.WriteLine("gotnull");休息;}Console.WriteLine("READ");控制台.WriteLine(线);如果(line.StartsWith(EOC))中断;}返回””;//是的,这应该返回构建的输出}}}鉴于这是一个程序集,我正处于尝试连接到服务器的阶段(使用booish测试很容易):>>>importServerConnect>>>a=ServerConnection("passphrase")ServerConnect.ServerConnection>>>a.Connect()>>>a.Command("")发送命令发送EOC得到空''我可以看到(在服务器的auth.log中)连接在a.Connect()调用后建立但是,似乎我写入的任何stdin_writer都没有发送到服务器。我怎样才能完成这个机制?将数据发送到服务器,然后发送分隔符,然后读取数据,直到我读取分隔符?在连接过程中,这个循环会重复几次。请注意,我不是经验丰富的C#程序员,因此我可能缺乏对C#流模型的基本了解。PS我已经看到了这个答案,但似乎CreateShellStream调用块,可能在PseudoTty分配中(该过程不需要伪ttys,只需要输入/输出)。PS2我从codeplex.com下载并编译了最新版本的Renci.SshNet,现在我正处于这一点(取自Connect方法):this.scon.Connect();this.stream=this.scon.CreateShellStream("哑巴",80,24,800,600,1024);this.stdin_writer=newSystem.IO.StreamWriter(this.stream);this.stdout_reader=newSystem.IO.StreamReader(this.stream);this.shell=this.scon.CreateShell(this.stream,this.stream,this.stream);这个.shell.Start();但是,对stdin_writer的任何写入(随后的刷新)似乎都没有通过。抱歉,输入后我注意到我发布了necro...您可以使用此处给出的解决方案,这是我在想做与您类似的事情时使用的解决方案:Rencissh.net-从连接时的表单创建控制台屏幕可以使用任何System.IO对象,并使用ShellStream对象来操作SSH会话IO。ShellStream.Expect将读取输出,寻找特定的字符串。ShellStream.WriteLine将输入发送到shell。字符串回复=string.Empty;ShellStreamss=scon.CreateShellStream("dumb",80,24,800,600,1024);reply=ss.Expect("Pressentertocontinue");//登录后的提示ParseOutput(reply);ss.WriteLine("./myscript.sh")回复=ss.Expect("$");//我的提示,当脚本完成时。解析输出(回复);ParseOutput是我编写的一个例程,它在每个换行处拆分“回复”字符串并将每一行添加到表单上的列表框。Renci.SshNet(还)这是不可能的。第一个响应没有解决将数据传输到远程执行命令的标准输入的原始问题。一个典型的例子是将压缩文件的内容流式传输到解压缩器以在目标主机上执行。此增强功能是最近(2016年9月11日)才针对GitHub中的SSH.NET项目提出的。可以在这里看到:Supportforwritingtostdinwhenexecutingremotecommands以上是C#学习教程:如何对通过SSH连接的远程进程的stdin写入/从stdout读取?(Renci.SshNet)分享了全部内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: