#c# #ssh
#c# #ssh
Вопрос:
Я пытаюсь выполнить строки командной строки после подключения к удаленному серверу unix с помощью кода C #. Я использовал приведенный ниже код, и он работает. Однако я хочу, чтобы команды выполнялись полностью до того, как будет запущена следующая командная строка. в настоящее время выполнение строк происходит быстрее, и из-за этого результат, который я получаю, неверен.
Каждая команда должна завершить обработку, а затем перейти к следующей команде. В моем веб-приложении на C # у меня есть приведенный ниже код для события нажатия кнопки
SshClient sshclient = new SshClient(hostname, username, pwd);
sshclient.Connect();
ShellStream stream = sshclient.CreateShellStream("cmsd", 80, 24, 800, 600, 1024);
objclass.sendCommand("command1", stream).ToString();
objclass.sendCommand("command2", stream).ToString();
Файл класса содержит методы, указанные ниже:
public StringBuilder sendCommand(string customCMD, ShellStream stream)
{
StringBuilder answer = new StringBuilder();
answer.Clear();
var reader = new StreamReader(stream);
var writer = new StreamWriter(stream);
writer.AutoFlush = true;
WriteStream(customCMD, writer, stream);
answer = ReadStream(reader);
return answer;
}
private void WriteStream(string cmd, StreamWriter writer, ShellStream stream)
{
writer.WriteLine(cmd);
while (stream.Length == 0)
{
Thread.Sleep(500);
}
}
private StringBuilder ReadStream(StreamReader reader)
{
StringBuilder result = new StringBuilder();
string line;
while ((line = reader.ReadLine()) != null)
{
result.AppendLine(line);
}
return resu<
}
//Попробовал новый код
public StringBuilder sendCommand(string customCMD, ShellStream stream)
{
StringBuilder answer = new StringBuilder();
answer.Clear();
answer.Length = 0;
var reader = new StreamReader(stream);
var writer = new StreamWriter(stream);
writer.AutoFlush = true;
while (!stream.DataAvailable)
{
WriteStream(customCMD, writer, stream);
Thread.Sleep(5000);
}
answer = ReadStream(reader);
return answer;
}
Ответ №1:
Вы можете попробовать что-то похожее на следующий код :
using (var client = new SshClient(hostname, username, pwd))
{
client.Connect();
var cmd = client.CreateCommand("sleep 15s;echo 123");
var asynch = cmd.BeginExecute();
while (!asynch.IsCompleted)
{
// Waiting for command to complete...
Thread.Sleep(2000);
}
result = cmd.EndExecute(asynch);
client.Disconnect();
}
Комментарии:
1. Я не могу видеть параметр как BeginExecute. Я вижу начало. Ожидайте
2. Какое пространство имен вы используете для SSHClient? Я пробовал через Renci. Пространство имен SshNet, и оно предоставляет метод BeginExecute.
3. я использую Renci. Но я не получаю этого
4. Теперь я вспоминаю, что я установил Renci. SshNet. Асинхронный пакет от nuget, который добавил Renci. SshNet и Renci. SshNet. Асинхронные пространства имен в ссылках. Возможно, вы можете попробовать установить Renci. SshNet. Асинхронный
5. Пока нет. Я добавил новый код в свой первоначальный пост. не могли бы вы, пожалуйста, просмотреть, может ли это помочь решить эту проблему. Проблема в том, что мне нужно дождаться, пока приглашение перейдет к следующему пустому приглашению, а затем прочитать данные и отобразить в пользовательском интерфейсе браузера, а затем написать следующую команду