C#通过Renci.SSH实现远程ssh在linux执行命令后异步读取较大的输出内容,并检测输出结果如果存在"发布成功"字段则运行通过并返回.,netframework版本为4.6
时间: 2024-09-25 13:06:41 浏览: 20
在C#中,特别是在.NET Framework 4.6及以后版本中,可以使用第三方库Renci.SshNet来实现SSH连接并执行远程Linux命令。若需要异步读取大输出并在检测到特定字段"发布成功"时返回结果,你可以按照以下步骤操作:
首先,你需要安装Renci.SshNet库,可以在NuGet包管理器中搜索并添加它。然后编写一个方法,示例如下:
```csharp
using Renci.SshNet;
using System;
using System.Threading.Tasks;
public class SshHelper
{
private readonly SshClient _sshClient;
public SshHelper(string host, string username, string password)
{
_sshClient = new SshClient(host);
_sshClient.Connect(username, password);
}
public async Task<string> ExecuteCommandAsyncWithFilter(string command, Func<string, bool> filter)
{
using (var session = await _sshClient.OpenSessionAsync())
{
// 设置流为异步非阻塞
session.StreamDataReceived += (_, data) => ProcessOutput(session, data);
try
{
await session.RunShellCommandAsync(command);
// 等待命令完成并接收所有输出
await session.DisconnectAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Error executing command: {ex.Message}");
return null;
}
string output = await GetAllOutput(session);
return filter(output) ? "发布成功:" + output : "未找到'发布成功'字段";
}
}
private async Task<string> GetAllOutput(SshSession session)
{
var allOutput = "";
while (!session.IsConnected)
{
if (session.DataAvailable)
{
var data = await session.ReadAsync(1024);
allOutput += data;
}
else
{
break;
}
}
return allOutput;
}
private void ProcessOutput(SshSession session, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data);
// 这里可以根据实际情况更新回调函数,检查输出内容
// 如果找到“发布成功”,你可以在这里返回true并结束异步任务
// 比如:
// if (e.Data.Contains("发布成功"))
// TaskCompletionSource<bool>.Create().SetResult(true);
}
}
```
在这个例子中,`ExecuteCommandAsyncWithFilter`方法接收一个命令字符串和一个自定义过滤函数,当接收到的输出满足`filter`函数条件时,就会认为命令成功。注意,实际应用中,你需要根据需要调整`ProcessOutput`方法的逻辑。