Я написал небольшую программу на C#, используя ssh.net, которая подключается к серверу SSH, вносит некоторые изменения и перезапускает службу SSHD на сервере SSH.
К сожалению, сервер SSH работает на медленной встроенной системе, а служба SSHD не перезапускается достаточно быстро, чтобы сделать это плавно (без отключения клиента). На самом деле для перезапуска службы SSH требуется около минуты. Это отлично.
Мой код выглядит так:
Console.WriteLine("Restarting SSHD service on modem...");
try
{
using (var client = new SshClient(IPAddress, "root", "PASSWORD"))
{
client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(10);
client.Connect();
client.RunCommand("service sshd restart");
client.Disconnect();
}
}
catch (System.Net.Sockets.SocketException)
{
//We got disconnected because we just restarted the sshd service
//This is expected
Console.WriteLine("\tSuccess");
}
catch
{
//We got disconnected for some other reason
Console.WriteLine("\tIt appears there was a problem restarting the sshd service");
}
Проблема, с которой я сталкиваюсь, заключается в том, что клиенту ssh требуется до минуты, а иногда и больше, чтобы выяснить, что сервер SSH больше не отвечает, и выдать исключение System.Net.Sockets.SocketException. Есть ли способ сократить этот тайм-аут? Я не хочу, чтобы он переподключался - я просто хочу, чтобы он быстрее выдал исключение. Будет ли это какое-то конкретное значение тайм-аута ssh.net или тайм-аут System.Net.Sockets?
All I want is to send the "service sshd restart" command to the server, and disconnect as quickly as possible
- вы можете сделать"service sshd restart &"
или, в зависимости от дистрибутива на SSH-сервере, может быть"service sshd restart >/dev/null 2>&1 &"
- person Hang   schedule 26.03.2016&
кучу разных способов, но, как ни странно, теперь это сработало - вроде как. Я не думаю, что пытался избавиться от stdout и stderr раньше, как вы сделали выше. К сожалению, хотя это приводит к тому, что client.RunCommand возвращается очень быстро, затем он зависает в client.Disconnect() ровно на столько же времени (более минуты). Если я закомментирую client.Disconnect(), он зависнет, пытаясь вместо этого оставить оператор использования более чем на минуту. Я посмотрю, есть ли способ разорвать соединение сразу после client.RunCommand(). - person Tal   schedule 26.03.2016