Flutter: как лучше всего использовать завершители в сеансе S SH Shell - PullRequest
0 голосов
/ 13 июля 2020

После поиска и попытки оптимизировать запросы оболочки я ищу руководство о том, как лучше всего использовать завершители для обработки команд оболочки. Ситуация следующая: мне нужно получить информацию с устройства через S SH. Процедура аутентификации / входа в систему занимает много времени, поэтому я пытался запустить один SSHclient, запустить оболочку и использовать client.writeToShell ("..."), чтобы достичь точки, когда я могу начать вводить команду и ждать его ответ.

Это отлично работает для одной команды, но поскольку мне нужно обрабатывать много команд последовательно, он теряет много времени, обрабатывая логин последовательно для каждой команды.

try {
  var client = SSHClient(
    host: activeIp,
    port: activePort,
    username: activeUser,
    passwordOrKey: activePwd,
  );
  await client.connect().then((_) async {
    await sshGetCommand1(client);
    await sshGetCommand2(client);
    await sshGetCommand3(client);
  });
} on TimeoutException catch (_) {
  
} on OperationCanceledError catch (_) {
  
} catch (e) {
  
}


Future<String> sshGetCommand1(SSHClient client) async {
await sshShellCommand(client, "command1").then((value) {
  /// Triggered by the completer 
  /// do some command specific processing 
});
return "resultvalue";
}

Future<String> sshGetCommand2(SSHClient client) async {
await sshShellCommand(client, "command2").then((value) {
  /// Triggered by the completer 
  /// do some command specific processing 
});
return "resultvalue";
}

Future sshShellCommand(SSHClient client, String command) async {
Completer _completer = new Completer();
if (client != null) {
  client
      .startShell(
          ptyType: "xterm", // defaults to vanilla
          callback: (dynamic e) {
            if (e.contains("COMMAND_DONE")) {
              _completer.complete(jsonDecode(commandResult));
              // _completer = new Completer();
              // client.closeShell();
            } else if (command == "command1" ) {
              // process commandResult
            } else if (command == "command2" ) {
              // process commandResult
            } else if (command == "commandx" ) {
              // process commandResult ...
            }
          })
      .then((value) async {
    if (value == "shell_started") {
      await client.writeToShell("$activeModemUserName\n");
      await client.writeToShell("$activeModemPassword\n");
      await client.writeToShell("$command\n");
    }
  });
} else {
  print("We have no client");
}
return _completer.future;
}

В идеале Я хотел бы открыть S SH, запустить оболочку, выполнить вход в систему, а затем иметь возможность отправлять отдельные команды в оболочку без необходимости передавать последовательность входа в систему, но я не могу заставить ее использовать оболочку / завершитель несколько раз без пройти весь процесс входа в систему. Логин имеет часть оболочки c, которая также требует обработки, так что это не просто S SH логин.

Любые мысли / исправления приветствуются

Спасибо Michaël

...