我有一个C#代码,我在Visual Studio 2017上执行该代码。我的目的是并行启动多个线程,并通过SSH连接到不同的IP,在这些设备上执行命令,并将输出返回控制台。使用IP连接到这样的设备的一个示例:192.168.46.126如下:
Thread myNewThread = new Thread(() => sendCommand("192.168.46.126", command));
myNewThread.Start();
sendcommand函数如下:
void sendCommand(string IPaddr, string command)
{
using (var sshClient = new SshClient(IPaddr, username, password))
{
sshClient.Connect();
sshClient.Runcommand(command); //Takes a lot of time to execute
}
}
sshclient.runcommand(命令)需要大量时间来执行。我需要并行运行所有这些线程以连接到每个设备并将其状态打印到控制台。如果线程需要太长,我需要有一个超时选项。我在线搜索,但它们似乎不是RunCommand功能上的超时选项。唯一的超时选项似乎是通过以下代码实现的连接()函数:
client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(10);
我可以为runcommand of Code插入Timout吗?
@user2819245是正确的。我遇到了相同的问题,因此我更改代码以使用createCommand(),定义命令时间量,然后调用execute()。注意:围绕execute()捕获SshoperationTimeOutException需要尝试/捕获。我曾期望将命令结果和/或错误用于捕获超时错误,但可惜。
这是您的代码应该如何更新为
void sendCommand(string IPaddr, string command)
{
using (var sshClient = new SshClient(IPaddr, username, password))
{
sshClient.Connect();
Renci.SshNet.SshCommand command = sshClient.CreateCommand(command);
command.CommandTimeout = TimeSpan.FromSeconds(10); // 10sec timeout
try
{
command.Execute();
}
catch (Renci.SshNet.Common.SshOperationTimeoutException)
{
// however you want to handle it
}
client.Disconnect();
}
}