You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.

火山引擎 最新活动