Seguinte, to usando o JSch p conectar via ssh num servidor Linux e executar comandos numa app aqui.
A boa pratica nos diz p/ evitarmos sempre ta abrindo e fechando objetos q requerem mto tempo/memoria p carregar. Entao tava querendo fazer isso com o objeto ChannelExec desta biblioteca, ele serve p executar comandos e sera usados mtas vezes, por isso seria interessante so criar uma vez. Contudo, pelos testes q fiz, n to conseguindo fazer com q apenas 1 instanciacao fique executando varios comandos. So consegui executar varios comanods instanciando varias vezes o objeto Channel (ChannelExec). Queria saber se alguem ja fez isso utilizando 1 instancia dele apenas. La vai o codigo.
public static void main(String[] arg){
try{
JSch jsch=new JSch();
String host=null;
host=JOptionPane.showInputDialog("Enter username@hostname",
System.getProperty("user.name")+
"@localhost");
String user=host.substring(0, host.indexOf('@'));
host=host.substring(host.indexOf('@')+1);
Session session=jsch.getSession(user, host, 22);
session.setPassword("senha");
// username and password will be given via UserInfo interface.
UserInfo ui=new MyUserInfo();
session.setUserInfo(ui);
session.connect();
String command=JOptionPane.showInputDialog("Enter command",
"set|grep SSH");
//AQUI ABRE O "CHANNELEXEC"
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in=channel.getInputStream();
channel.connect();
//retorna resposta do servidor
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
System.out.print(new String(tmp, 0, i));
}
if(channel.isClosed()){
System.out.println("exit-status: "+channel.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
channel.disconnect();
session.disconnect();
}
catch(Exception e){
System.out.println(e);
}
}
Tipo, tentei mudar o comando e dps dar connect novamente, tentei dar outros comandos como start() e run(), sem exito. So pegou dando um Channel channel=session.openChannel(“exec”); a cada novo comando.
Pelo q testei aqui, n consegui rodar varios comandos usando apenas uma instancia, ou seja, tive q abrir o channel td vez q quis executar um comando (e to c medo disso “pesar” a app). Possa ser q o modo d execucao d comandos dele seja assim msm (abrindo channel td vez) e nem pese, mas por duvida eu vim saber aqui se alguem ja conseguiu fazer isso utilizando apenas uma instancia.