Старайтесь не использовать канал "shell" в максимально возможной степени.Канал «оболочка» предназначен для реализации интерактивного сеанса, а не для автоматизации выполнения команды.С каналом "shell" вы столкнетесь со многими нежелательными побочными эффектами.
Чтобы автоматизировать выполнение команды, используйте канал "exec".
Обычно вы можете открыть столько "exec""каналы, как вам нужно, используя каждый для выполнения одной из ваших команд.Вы можете открывать каналы последовательно или даже параллельно.
Полный пример использования канала "exec" см. JSch Exec.java
пример .
Таким образомкаждая команда выполняется в изолированной среде.Это может быть преимуществом, но в некоторых случаях это также может быть нежелательно.
Если вам нужно выполнять команды так, чтобы предыдущие команды влияли на более поздние команды (например, изменение рабочего каталога или настройка средыпеременная), вы должны выполнить все команды в одном канале.Для этого используйте соответствующую конструкцию серверной оболочки.В большинстве систем вы можете использовать точки с запятой:
execChannel.setCommand("command1 ; command2 ; command3");
На * nix-серверах вы также можете использовать &&
, чтобы следующие команды выполнялись только при успешном выполнении предыдущих команд:
execChannel.setCommand("command1 && command2 && command3");
См. Также Выполнение списка команд из ArrayList с использованием JSch exec в Java .
Наиболее сложная ситуация возникает, когда команды зависят друг от друга, и вам нужно обрабатыватьрезультаты предыдущих команд, прежде чем переходить к другим командам.
Когда у вас есть такая необходимость, это обычно указывает на плохой дизайн.Подумайте, если это действительно единственное решение вашей проблемы.Или рассмотрите возможность реализации сценария оболочки на стороне сервера для реализации логики, вместо того чтобы делать это удаленно из кода Java.Сценарии оболочки имеют гораздо более мощные методы для проверки результатов предыдущих команд, чем при использовании SSH-интерфейса в JSch.
В любом случае, смотрите Канал оболочки JSch выполняет команды одну за другой, перед тем как продолжить .
Примечание: не используйте StrictHostKeyChecking=no
.См. Безопасность JSch SFTP с помощью session.setConfig («StrictHostKeyChecking», «no»); .