jcraft from example ejecutar desde comando cliente java ssh sshj

from - sftp client java



ejecutar secuencia de comandos en sshj (2)

Por extraño que sea, la session solo se puede usar una vez. Por lo tanto, debe reiniciar la sesión cada vez.

Session session = ssh.startSession(); Session.Command cmd = session.exec("ls -l"); System.out.println(IOUtils.readFully(cmd.getInputStream()).toString()); cmd.join(10, TimeUnit.SECONDS); session = ssh.startSession(); Session.Command cmd2 = session.exec("ls -a"); System.out.println(IOUtils.readFully(cmd2.getInputStream()).toString());

O si el shell al que se está conectando admite comandos delimitados (y la situación lo permite), puede hacer esto (ejemplo bash):

session.exec("ls -l; <command 2>; <command 3>");

Necesito ejecutar una secuencia de comandos en el servidor remoto a través de ssh, usando la biblioteca sshj.

hago

Session session = ssh.startSession(); Session.Command cmd = session.exec("ls -l"); System.out.println(IOUtils.readFully(cmd.getInputStream()).toString()); cmd.join(10, TimeUnit.SECONDS); Session.Command cmd2 = session.exec("ls -a"); System.out.println(IOUtils.readFully(cmd2.getInputStream()).toString());

y me tira

net.schmizz.sshj.common.SSHRuntimeException: este canal de sesión está todo agotado

Pero no puedo volver a crear la sesión para cada comando, porque este ejemplo mostrará la lista del directorio principal, pero no la lista / some / dir.


Puede considerar usar una biblioteca de terceros de tipo Expect que simplifica el trabajo con servicios remotos y la captura de resultados. Esas bibliotecas están diseñadas para ejecutar una secuencia de comandos. Aquí hay un buen conjunto de opciones que puedes probar:

Sin embargo, cuando estaba a punto de resolver un problema similar, descubrí que estas bibliotecas son bastante antiguas. También introducen muchas dependencias no deseadas. Así que creé el mío y lo hice disponible para otros. Se llama ExpectIt . Las ventajas de mi biblioteca están indicadas en la página principal del proyecto. Puedes darle una oportunidad.

Aquí hay un ejemplo de interacción con un servicio público remoto de SSH que usa sshj:

SSHClient ssh = new SSHClient(); ... ssh.connect("sdf.org"); ssh.authPassword("new", ""); Session session = ssh.startSession(); session.allocateDefaultPTY(); Shell shell = session.startShell(); Expect expect = new ExpectBuilder() .withOutput(shell.getOutputStream()) .withInputs(shell.getInputStream(), shell.getErrorStream()) .build(); try { expect.expect(contains("[RETURN]")); expect.sendLine(); String ipAddress = expect.expect(regexp("Trying (.*)//.//.//.")).group(1); System.out.println("Captured IP: " + ipAddress); expect.expect(contains("login:")); expect.sendLine("new"); expect.expect(contains("(Y/N)")); expect.send("N"); expect.expect(regexp(": $")); expect.send("/b"); expect.expect(regexp("//(y///n//)")); expect.sendLine("y"); expect.expect(contains("Would you like to sign the guestbook?")); expect.send("n"); expect.expect(contains("[RETURN]")); expect.sendLine(); } finally { session.close(); ssh.close(); expect.close(); }

Aquí está el enlace al ejemplo viable completo.