После поиска и попытки оптимизировать запросы оболочки я ищу руководство о том, как лучше всего использовать завершители для обработки команд оболочки. Ситуация следующая: мне нужно получить информацию с устройства через 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