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

如何通过Windows服务(C#)获取Linux服务器时间?

Windows环境下获取Linux服务器系统时间的可行方案

你之前用CliWrap调用bash的方式没跑起来,大概率是这几个问题:Windows默认不带bash.exe(得装WSL或Git Bash才有)、SSH命令需要手动输密码导致程序卡住,还有没指定bash的完整路径让系统找不到。下面给你几个靠谱的方案,按需选择:

方案一:修正CliWrap调用(依赖WSL/Git Bash)

如果你的Windows已经装了WSL(比如Ubuntu子系统)或者Git Bash,那可以调整代码,同时提前配置无密码SSH登录(不然命令会卡在等待输入密码的环节):

public string GetLinuxServerTime()
{
    // 替换成你实际的bash路径:比如Git Bash是C:\Program Files\Git\bin\bash.exe,WSL是C:\Windows\System32\bash.exe
    using (var cli = new Cli(@"C:\Program Files\Git\bin\bash.exe"))
    {
        // 用-c参数传递要执行的ssh命令,-T避免分配终端,防止交互阻塞
        var output = cli.Execute("-c \"ssh -T user@10.104.12.114 date\"");
        // 返回命令输出的时间,处理空值或异常情况
        return output.StandardOutput?.Trim() ?? "时间获取失败";
    }
}

关键前提:配置无密码SSH登录

  1. 在Windows上生成SSH密钥:打开Git Bash/WSL终端,执行ssh-keygen一路回车生成密钥对;
  2. 把公钥(默认在~/.ssh/id_rsa.pub)传到Linux服务器的~/.ssh/authorized_keys文件里,确保权限正确(chmod 600 ~/.ssh/authorized_keys)。

方案二:用.NET专用SSH库(最可靠,无外部依赖)

直接用.NET的SSH客户端库,不用依赖外部bash或ssh命令,代码更可控也更稳定。推荐用SSH.NET这个库:

  1. 先通过NuGet安装包:Install-Package SSH.NET
  2. 编写代码:
using Renci.SshNet;

public string GetLinuxServerTime()
{
    // 用密码认证(推荐换成密钥认证更安全)
    var connectionInfo = new PasswordConnectionInfo(
        "10.104.12.114",
        "user",
        "your_server_password"
    );

    // 如果用密钥认证,替换成下面的代码:
    // var privateKey = new PrivateKeyFile(@"C:\Users\YourName\.ssh\id_rsa");
    // var connectionInfo = new PrivateKeyConnectionInfo("10.104.12.114", "user", privateKey);

    using (var sshClient = new SshClient(connectionInfo))
    {
        try
        {
            sshClient.Connect();
            // 执行date命令获取服务器时间
            var commandResult = sshClient.RunCommand("date");
            sshClient.Disconnect();

            // 根据命令执行状态返回结果
            return commandResult.ExitStatus == 0 
                ? commandResult.Result.Trim() 
                : $"获取失败:{commandResult.Error}";
        }
        catch (Exception ex)
        {
            return $"连接异常:{ex.Message}";
        }
    }
}

这个方案不用管Windows上有没有bash,直接通过.NET代码建立SSH连接,还能方便处理错误和认证问题。

方案三:通过HTTP接口获取(无需SSH权限)

如果Linux服务器不能开SSH,或者你不想配置SSH,可以在服务器上搭个简单的HTTP接口返回时间:

  1. 在Linux服务器上创建一个脚本,比如/var/www/html/get_time.sh
#!/bin/bash
# 返回UTC时间,也可以去掉-u用本地时间
date -u +"%Y-%m-%d %H:%M:%S"
  1. 给脚本加执行权限:chmod +x /var/www/html/get_time.sh
  2. 用nginx或apache把这个目录设为静态服务,确保能通过http访问;
  3. Windows端用HttpClient请求:
using System.Net.Http;
using System.Threading.Tasks;

public async Task<string> GetLinuxServerTimeAsync()
{
    using (var httpClient = new HttpClient())
    {
        try
        {
            var response = await httpClient.GetStringAsync("http://10.104.12.114/get_time.sh");
            return response.Trim();
        }
        catch (Exception ex)
        {
            return $"请求失败:{ex.Message}";
        }
    }
}

这个方案适合没有SSH权限的场景,只要服务器能开HTTP服务就行。

内容的提问来源于stack exchange,提问作者K132221 Zaheer Abbas

火山引擎 最新活动