SSH.NET执行命令无输出问题求助:C# SSH控制台应用开发
解决SSH.NET执行命令无输出的问题
嘿,我看了你的代码,发现几个可能导致控制台没输出的问题,咱们一个个来修正:
1. 主机名配置明显错误
你把Hostname常量设成了"somePort",这完全不对——这个参数应该填服务器的IP地址或者域名(比如"192.168.1.100"或者"your-server-domain.com"),端口已经通过PortNumber单独指定为22了,这个配置错误可能直接导致命令执行异常,却没让你看到有效错误信息。
2. 重复执行命令+错误处理不当
你连续调用了两次command.Execute():
var result = command.Execute(); command.Execute();
第一次执行已经把命令的标准输出存在result变量里了,第二次执行完全多余。另外,你的catch块里用throw exp;会丢失原始的堆栈跟踪信息,应该直接写throw;来保留完整的错误上下文,方便排查问题。
3. 未捕获命令的错误输出
如果ls命令执行出错(比如权限不足、路径不存在),错误信息会存在command.Error属性里,只打印result会错过这些关键排查信息,建议同时输出错误内容。
修复后的完整代码
using Renci.SshNet; using System; class Program { // 修正主机名配置,替换成你的服务器IP/域名 const string Hostname = "192.168.1.100"; const int PortNumber = 22; const string Username = "username"; const string Password = "root"; static void Main(string[] args) { // 处理交互式认证 var kauth = new KeyboardInteractiveAuthenticationMethod(Username); var pauth = new PasswordAuthenticationMethod(Username, Password); kauth.AuthenticationPrompt += HandleKeyEvent; var connectionInfo = new ConnectionInfo(Hostname, PortNumber, Username, pauth, kauth); using (var client = new SshClient(connectionInfo)) { try { client.Connect(); Console.WriteLine("Connection successful"); var command = client.CreateCommand("ls"); // 只执行一次命令,获取标准输出 var result = command.Execute(); // 打印标准输出和错误输出 Console.WriteLine("=== 命令输出 ==="); Console.WriteLine(result); if (!string.IsNullOrEmpty(command.Error)) { Console.WriteLine("=== 错误信息 ==="); Console.WriteLine(command.Error); } client.Disconnect(); } catch (Exception exp) { // 先打印错误信息再抛出,方便调试 Console.WriteLine($"执行出错:{exp.Message}"); throw; } } } static void HandleKeyEvent(object sender, Renci.SshNet.Common.AuthenticationPromptEventArgs e) { foreach (var prompt in e.Prompts) { if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1) { prompt.Response = Password; } } } }
额外建议
如果需要执行一组命令,你可以用分号串联命令(比如"cd /home && ls -l && pwd"),或者使用client.CreateShellStream()来模拟交互式shell执行批量操作。另外,一定要确保你的账号有执行目标命令的权限,这也是无输出的常见原因之一。
内容的提问来源于stack exchange,提问作者carlos E.




