You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#应用中通过SSH持续追踪Linux日志文件

在C#中通过SSH执行tail -f并持续获取日志输出

替代WinSCP的方案选择

WinSCP主打文件传输场景,对tail -f这类持续输出的交互式命令支持有限,推荐使用SSH.NET——一款专门针对SSH交互设计的客户端库来实现需求。

实现步骤

  1. 安装SSH.NET依赖
    在NuGet包管理器中搜索安装SSH.NET,或者通过命令行执行:

    Install-Package SSH.NET
    
  2. 编写核心实现代码
    以下代码完成SSH连接、执行tail命令并实时读取日志内容:

    using Renci.SshNet;
    using System;
    using System.Threading.Tasks;
    
    class SshTailTracker
    {
        static async Task Main(string[] args)
        {
            // 配置主机信息
            var host = "你的Linux主机IP";
            var username = "username";
            var password = "你的登录密码"; // 也可替换为密钥认证
            var port = 22;
    
            using var sshClient = new SshClient(host, port, username, password);
            try
            {
                sshClient.Connect();
                Console.WriteLine("SSH连接成功");
    
                // 执行从首行开始跟踪日志的命令
                var tailCommand = sshClient.CreateCommand("tail -f -n +1 /home/username/log/mylog.log");
                var asyncExecuteResult = tailCommand.BeginExecute();
    
                // 异步读取持续输出的日志内容
                await Task.Run(() =>
                {
                    using var outputReader = tailCommand.StandardOutput;
                    string logLine;
                    while ((logLine = outputReader.ReadLine()) != null)
                    {
                        Console.WriteLine($"[实时日志] {logLine}");
                        // 此处可扩展:将日志写入本地文件、推送至监控系统等
                    }
                });
    
                tailCommand.EndExecute(asyncExecuteResult);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"操作出错: {ex.Message}");
            }
            finally
            {
                if (sshClient.IsConnected)
                {
                    sshClient.Disconnect();
                    Console.WriteLine("SSH连接已断开");
                }
            }
        }
    }
    

补充说明

  • 密钥认证替代密码:若不想使用明文密码,可改用私钥文件认证:
    var privateKey = new PrivateKeyFile("你的私钥文件路径");
    var sshClient = new SshClient(host, port, username, new[] { privateKey });
    
  • 主动停止跟踪:如果需要中断日志监听,调用tailCommand.Cancel()即可终止命令执行。
  • 错误捕获:可通过tailCommand.StandardError流读取命令执行过程中的错误信息,完善异常处理逻辑。

内容的提问来源于stack exchange,提问作者eek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:42:35