JSch: выполнить команду после многоуровневого ssh

Я использую JSch для запуска некоторых команд после многоуровневого ssh:

public static void main(String[] args) {

    String user="User0";
    String ip="IP0";
    int port=22;
    String password="Password0";
            JSch jsch= new JSch();
            Session session=null;
            ChannelExec channel=null;
            try {
                session=(jsch.getSession(user, ip, port));
                session.setConfig("StrictHostKeyChecking", "no");
                session.setPassword(password);
                session.connect();
                String dir=Reomte_DIR;  
                String cmd1=SomeComplexCommand;
                String cmd2=SomeMoreComplexCommand;
                channel = (ChannelExec) session.openChannel("exec");
                channel.setInputStream(null);
                channel.setCommand("ssh User1@IP1_PasswordLessLogin;ssh User2@IP2_PasswordLessLogin; "+cmd1+" ; "+cmd2+" ;");
                channel.setPty(true);
                channel.connect(4000);
                String res = null;
                    BufferedReader input = new BufferedReader(new InputStreamReader(channel.getInputStream()));
                    BufferedReader error = new BufferedReader(new InputStreamReader(channel.getErrStream()));
                    if ((res = error.readLine()) == null) {
                        res = input.readLine()+input.readLine()+input.readLine()+input.readLine();
                    } else {

                        res = "-1";
                    }
                System.out.println("result:"+res);

            } catch (JSchException e) {
                e.printStackTrace();
            }catch (IOException e) {
                e.printStackTrace();
            }finally {
                channel.disconnect();
                session.disconnect();
            }       
        }

но это не дает желаемого результата.

Фактически channel.getInputStream() зависает. Если я удалю многоуровневый ssh, все будет нормально! Я делаю что-то неправильно??

Я получил подсказку от: Многоуровневый вход по SSH в Java и Несколько команд с использованием JSch, но я не могу запустить свой код.


person Rohan Karn    schedule 05.11.2016    source источник
comment
Ваша команда неверна, вы сначала пробовали ее в командной строке?   -  person Martin Prikryl    schedule 05.11.2016


Ответы (1)


Ваша команда неверна.

Ваша команда выполнит первую команду ssh User1@IP1_PasswordLessLogin.

И затем он будет ждать его завершения перед выполнением второй команды.

  • Первая ssh команда никогда не завершается, так как она всегда будет ждать, пока пользователь наберет команды.
  • Даже если первый ssh когда-либо закончится, второй ssh будет выполнен на начальном хосте, а не на IP1.

Вам понадобится что-то вроде этого:

ssh User1@IP1_PasswordLessLogin ssh User2@IP2_PasswordLessLogin "<cmd1> ; <cmd2>"

Это указывает первому ssh выполнить второй ssh на IP1; и второй ssh для выполнения <cmd1> ; <cmd2> на IP2.

person Martin Prikryl    schedule 05.11.2016