У меня есть две машины 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) Но это не похоже на работу
Может ли кто-нибудь помочь мне узнать, что здесь происходит не так.
Спасибо