Как выполнить несколько операций с JSch - PullRequest
5 голосов
/ 14 сентября 2011

Я новичок в SSH и JSch.Когда я подключаюсь от своего клиента к серверу, я хочу выполнить две задачи:

  1. Загрузить файл (используя ChannelSFTP)
  2. Выполнить команды, такие как создание каталога и поискчерез базу данных MySQL

В настоящее время я использую два отдельных входа в систему оболочки для выполнения каждой задачи (на самом деле я еще не начал программировать запросы MySQL).

Для загрузкисоответствующий код:

session.connect();

Channel channel=session.openChannel("sftp");
channel.connect();
ChannelSftp c=(ChannelSftp)channel;
c.put(source, destination);

А для команды у меня есть

String command = "ls -l";//just an example 
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);

Должен ли я отключить сеанс после первого канала, а затем открыть второй канал?Или полностью закрыть сеанс и открыть новый сеанс?Как я уже сказал, я новичок в этом.

Ответы [ 2 ]

8 голосов
/ 14 сентября 2011

Один сеанс SSH может поддерживать любое количество каналов - как параллельно, так и последовательно. (Существует некоторый теоретический предел в размере идентификатора канала, но вы не достигнете его на практике.) Это также справедливо для JSch. Это экономит на повторном использовании дорогостоящих операций обмена ключами.

Таким образом, обычно нет необходимости закрывать сеанс и повторно подключаться перед открытием нового канала. Единственная причина, по которой я могу думать, - это когда вам нужно войти в систему с разными учетными данными для обоих действий.

Чтобы сохранить память, вы можете закрыть канал SFTP, прежде чем открывать канал exec.

3 голосов
/ 03 января 2013

Чтобы дать несколько команд через Jsch, используйте shell вместо exec.Оболочка поддерживает только собственные команды соединительной системы.Например, когда вы подключаете систему Windows, вы не можете давать такие команды, как dir, используя канал exec.Поэтому лучше использовать оболочку.

Следующий код можно использовать для отправки нескольких команд через Jsch

Channel channel = session.openChannel("shell");
OutputStream ops = channel.getOutputStream();
PrintStream ps = new PrintStream(ops, true);

channel.connect();
ps.println("mkdir folder");
ps.println("dir");
//give commands to be executed inside println.and can have any no of commands sent.
ps.close();

InputStream in = channel.getInputStream();
byte[] bt = new byte[1024];

while (true) {
    while (in.available() > 0) {
        int i = in.read(bt, 0, 1024);
        if (i < 0) {
            break;
        }
        String str = new String(bt, 0, i);
        //displays the output of the command executed.
        System.out.print(str);

    }
    if (channel.isClosed()) {
            break;
    }
    Thread.sleep(1000);
    channel.disconnect();
    session.disconnect();
}
...