Обзор различий и сходств между этими потоками вы можете найти в » Shell, Exec или Subsystem Channel « в вики JSch.Вот некоторые подробности для вашего варианта использования.
В канале exec
команды приходят из командной строки, которую вы дали с помощью setCommand()
.Сервер SSH сразу же передаст их оболочке (используя что-то вроде bash -c '<command>'
).
Все они будут выполнены, если по какой-то причине оболочка по каким-либо причинам не завершится.(Вы можете отправить здесь целый сценарий оболочки, который реализует некоторую логику, используя if
и аналогичные, если это необходимо.)
Таким образом, чтобы выполнить несколько команд, вы можете передать их в канал exec, разделив ихс ;
или переводом строки (\n
).Поскольку вы не можете дождаться результатов, прежде чем дать все команды, здесь вы можете использовать только несколько каналов exec (но, поскольку каждый канал порождает новую оболочку, они не сохраняют состояние между ними, например, рабочий каталог или переменные оболочки).
В канале shell
оболочка будет считывать ввод из потока и интерпретировать первую строку как команду (или несколько).
Тогда он выполнит эту команду.Сама команда может прочитать дополнительные входные данные из потока, если она этого захочет.
Затем оболочка прочитает следующую строку, интерпретирует ее как команду и выполнит.
(В некоторых случаяхОболочка должна прочитать более одной строки, например, для длинных строк или составных команд, таких как циклы if или.)
Это будет продолжаться до конца потока (например, stream.close () на вашей стороне).) или выполнение явной команды выхода.
Если вы не отправляете какой-либо ввод в оболочку через канал ввода / вывода каналов, оболочка просто будет ждать, пока вы не отправите еще или закроете поток.Таким образом, вы можете спокойно прочитать вывод одной команды, выполнить некоторые вычисления на стороне клиента и затем решить, какую команду отправлять следующей.
Просто убедитесь, что вы не смешиваете ввод одной команды с текстом команды.следующая команда - желательно не использовать команды, которые будут считываться со стандартного ввода.