s sh на удаленный сервер внутри удаленного сервера с помощью jsch (перейти с сервера на машину разработки) - PullRequest
1 голос
/ 11 марта 2020

У меня есть две машины dev-сервер и сервер журналов, в которых хранятся журналы, я хочу сначала s sh для разработки сервера, а затем оттуда я хочу сделать s sh для входа в сервер для выполнения какого-либо сценария. Ниже приведен код, который я пытался использовать с помощью jsch:

Получить jschSession:

private Session getSSHSession(String user,String host,String password) {
    java.util.Properties config = new java.util.Properties(); 
    config.put("StrictHostKeyChecking", "no");
    Session session = null;
    try {
    JSch jsch = new JSch();
    session=jsch.getSession(user, host, 22);
    session.setPassword(password);
    session.setConfig(config);

        session.connect();
    } catch (JSchException e) {
        e.printStackTrace();
    }
    return session;
}

Выполнить команду

private String execute(Session session, String cmd) {
    StringBuffer sb = new StringBuffer();
    try{
        Channel channel=session.openChannel("exec");
        ((ChannelExec) channel).setPty(true);
        ((ChannelExec)channel).setCommand(cmd);
        channel.setInputStream(null);
        ((ChannelExec)channel).setErrStream(System.err);
        channel.connect();
        BufferedReader br  =  new BufferedReader(new InputStreamReader(channel.getInputStream()));
        String msg = null;
        while ((msg = br.readLine())!=null) {
                sb.append(msg);
        }
        System.out.println("------------msg: -----------"+sb.toString());
        while(true){
            System.out.println("channel.getExitStatus(): "+channel.getExitStatus());
          if(channel.isClosed()){
            System.out.println("exit-status: "+channel.getExitStatus());
            if(channel.getExitStatus()==0) {
                System.out.println("script executed successfully..........");
            }
            break;
          }
          try{Thread.sleep(1000);}catch(Exception ee){}
        }
        channel.disconnect();
        session.disconnect();
    }catch(Exception e){
        e.printStackTrace();
    }
    return sb.toString();
}

вызвать команду execute

public String audit(AuditRequest request) {
    Session session = getSSHSession(user,host,password);
    String cmd = "ssh user@server; cd /mmt/test;ls -ltr";
    String result = execute(session,cmd);
    System.out.println("cmd1: "+cmd+"  result: -------------"+result);
    return result;
}

Итак, в основном я сначала подключаюсь к dev-серверу, а затем, используя его сеанс, пытаюсь выполнить команду s sh для подключения к серверу журналов. По опубликованному коду я могу подключиться к моей машине разработчика, но оттуда не могу сделать s sh для регистрации машины.

Если я удаляю ((ChannelExec) channel).setPty(true); ниже, это ошибка, которую я получаю:

Pseudo-terminal will not be allocated because stdin is not a terminal. Permission denied, please try again. Permission denied, please try again.

И если я поставлю setPty для псевдотерминала, он застрянет в channel.connect();

Прочитать несколько сообщений / вопросов, о которых многие люди упоминали, используя channel.setPty (true) Но это не похоже на работу

Может ли кто-нибудь помочь мне узнать, что здесь происходит не так.

Спасибо

...