如何通过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登录
- 在Windows上生成SSH密钥:打开Git Bash/WSL终端,执行
ssh-keygen一路回车生成密钥对; - 把公钥(默认在
~/.ssh/id_rsa.pub)传到Linux服务器的~/.ssh/authorized_keys文件里,确保权限正确(chmod 600 ~/.ssh/authorized_keys)。
方案二:用.NET专用SSH库(最可靠,无外部依赖)
直接用.NET的SSH客户端库,不用依赖外部bash或ssh命令,代码更可控也更稳定。推荐用SSH.NET这个库:
- 先通过NuGet安装包:
Install-Package SSH.NET - 编写代码:
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接口返回时间:
- 在Linux服务器上创建一个脚本,比如
/var/www/html/get_time.sh:
#!/bin/bash # 返回UTC时间,也可以去掉-u用本地时间 date -u +"%Y-%m-%d %H:%M:%S"
- 给脚本加执行权限:
chmod +x /var/www/html/get_time.sh; - 用nginx或apache把这个目录设为静态服务,确保能通过http访问;
- 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




