Carga y descarga del archivo del servidor a través de SSH
Palabras escritas en el frente
Anteriormente grabé un método para cargar y descargar archivos del servidor utilizando el componente de código abierto FTP de Apache, pero luego descubrí que habrá algunos problemas de permiso al eliminar, lo que llevará a la incapacidad de eliminar archivos en el servidor. Aunque no hay problema después de configurar los permisos de lectura y escritura utilizando el servidor Filezilla en Windows, todavía es un poco difícil de usar en el lado del servidor.
Debido a que necesito implementar funciones de administración de recursos, además del almacenamiento de archivos únicos FastDFS, todavía se planea almacenar un almacenamiento de recursos específicos para almacenarse temporalmente en el servidor. Los colegas del equipo del proyecto dijeron que no abrirían servicios FTP específicamente en el servidor más tarde, por lo que cambiaron al modo SFTP para operar.
Cómo usar esta cosa
Primero, debe descargar el paquete JSCH JAR, la dirección es: http://www.jcraft.com/jsch/. El sitio web también escribe muy claramente: JSCH es una implementación pura de Java de SSH2. Esta es una implementación pura de Java de SSH2. Use IP y puerto, ingrese el nombre de usuario y la contraseña y puede usarlo normalmente, que es el mismo que el método de uso de Secure CRT. Entonces, ¿cómo usas esta herramienta útil?
En realidad, no importa si no puedes escribirlo. El funcionario también dio un ejemplo. El enlace es: http://www.jcraft.com/jsch/examples/shell.java. Echemos un vistazo:
/* -* -Modo: Java; C-Básico-Compensación: 2; Modo de tabs de sangría: nil-*-*// ***Este programa le permite conectarse al servidor SSHD y obtener el indicador de shell. * $ Classpath =.: ../ Build javac shell.java * $ classpath =.: ../ build java shell * Se le pedirá nombre de usuario, nombre de host y passwd. * Si todo funciona bien, obtendrá la solicitud de shell. La salida puede * ser fea debido a la falta de emulación terminal, pero puede emitir comandos. **/import com.jcraft.jsch.*; import java.awt.*; import javax.swing.*; public class shell {public static void main (string [] arg) {try {jsch jsch = new jsch (); //jsch.set conocida a los que habían String host = null; if (arg.length> 0) {host = arg [0]; } else {host = joptionPane.ShowInputDialog ("Ingrese a los username@hostname", system.getProperty ("user.name")+ "@LocalHost"); } String user = host.substring (0, host.indexof ('@')); host = host.substring (host.indexof ('@')+1); Sesión sesión = jsch.getSession (usuario, host, 22); Cadena passwd = jOptionPane.showInputDialog ("Ingrese la contraseña"); session.setPassword (passwd); UserInfo ui = new myUserInfo () {public void showMessage (string Message) {joptionPane.ShowMessEdialog (nulo, mensaje); } public boolean apuryesno (mensaje de cadena) {objeto [] options = {"sí", "no"}; int foo = jOptionPane.ShowOptionDialog (NULL, MENSAJE, "ADVERTENCIA", JOPTIONPANE.DEFAULT_OPTION, JOPTIONPANE.WARNING_MESSAGE, NULL, OPCIONES, OPCIONES [0]); return foo == 0; } // Si no se da la contraseña antes de la invocación de la sesión#Connect (), // Implementar también los siguientes métodos, // * UserInfo#getPassword (), // * UserInfo#apurpassword (mensaje de cadena) y // * uikeyBoardinteractive#apotkeyboardinteractive ()}; session.setUserInfo (ui); // no debe recomendarse, pero si desea omitir la cheque de tecla de host, // Invoke siguiendo, // session.setConfig ("stricthostKeyChecking", "no"); //session.connect (); session.connect (30000); // haciendo una conexión con el tiempo de espera. Canal canal = session.openchannel ("shell"); // habilitar el agente-forwarding. //(((Channelshell)channel).setAgentForwarding(true); Channel.SetInputStream (System.in); /* // Un hack para la solicitud de MS-DOS en Windows. Channel.setInputStream (nuevo FilterInputStream (System.in) {public int Read (byte [] b, int OfF, int len) lanza ioexception {return in.read (b, off, (len> 1024? 1024: len));}}); */ canal.setOutputStream (System.out); /* // Elija el "VT102" Pty-Type. ((ChannelShell) canal) .SetPtyType ("VT102"); * / /* // Establecer variable de entorno "lang" como "ja_jp.eucjp". ((ChannelShell) canal) .setenv ("lang", "ja_jp.eucjp"); *///channel.connect (); Channel.connect (3*1000); } catch (Exception e) {System.out.println (e); }} clase pública de clase abstracta estática myUserInfo implementa UserInfo, uikeyBoardInteractive {public String getPassword () {return null; } public boolean apuryesno (string str) {return false; } public String getPassPhrase () {return null; } public boolean prompassphrase (mensaje de cadena) {return false; } public boolean apurpassword (mensaje de cadena) {return false; } public void showMessage (mensaje de cadena) {} public String [] promplyboardInteractive (destino de cadena, nombre de cadena, instrucción de cadena, cadena [] solicit, boolean [] echo) {return null; }}}En este código, básicamente podemos ver lo que necesitamos. Primero, necesitamos crear información del usuario. Esto se usa principalmente para la autenticación. Simplemente implementa las dos interfaces de UserInfo y Uikeyboardinteractive. Luego, creando una sesión de sesión, configure UserInfo y finalmente conecte.
Carga y descarga de archivos encapsulados
Lo anterior es el método de uso básico de JSCH, es decir, algunas rutinas básicas. Encapsulemos las funciones que queremos usar, implementemos una serie de operaciones, como cargar y descargar archivos.
Primero, cree un UserInfo:
MyUserInfo de clase pública implementa UserInfo, uikeyboardinteractive {public string getPassword () {return null; } public boolean apuryesno (string str) {return true; } public String getPassPhrase () {return null; } public boolean prompassphrase (mensaje de cadena) {return true; } public boolean apurpassword (mensaje de cadena) {return true; } public void showMessage (mensaje de cadena) {} @Override public String [] prompkOyboardInteractive (String arg0, string arg1, string arg2, string [] arg3, boolean [] arg4) {return null; }}Aquí está la clase de implementación:
paquete com.tfxiaozi.common.utils; import java.io.inputstream; import java.util.arrayList; import java.util.iterator; import java.util.list; import java.util.vector; import org.apache.log4j.logger; com.jcraft.jsch.channel; importar; import com.jcraft.jsch.channelExec; import com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; import com.jcraft.jsch.jschexception; import com.jcraft.jsch.session; import.jcraft.jsch.sftpexception; import com.jcraft.jsch.sfpfpResitor; @author tfxiaozi * */public class ssh {logger logger = logger.getLogger (this.getClass ()); string private host = ""; String private String user = ""; Private Int Port = 22; String private Password = ""; Protocolo de cadena final estática privada = "Sftp"; Jsch jsch = new JSch (); sesión de sesión privada; canal privado canal; canales privadosftp sftp; public String gethost () {return host; } public void sethost (host de cadena) {this.host = host; } public String getUser () {return user; } public void setUser (user de cadena) {this.user = user; } public ssh () {} public ssh (string host, int port, string user, string contraseña) {this.host = host; this.user = usuario; this.password = contraseña; this.port = puerto; } / ** * Connect ssh * @throws jschexception * / public void conecte () lanza jschexception {if (session == null) {session = jsch.getSession (usuario, host, puerto); MyUserInfo ui = new myUserInfo (); session.setUserInfo (ui); session.setPassword (contraseña); session.connect (); canal = session.openchannel (protocolo); Channel.connect (); sftp = (Channelsftp) canal; }} / ** * Desconnect ssh * / public void disconnect () {if (session! = null) {session.disconnect (); sesión = nulo; }} / ** * cargar * @param localFileName * @param remotosfileName * @return * / public boolean upload (string localFileName, string remoteFileName) lanza la excepción {boolean bsucc = false; intente {sftpProgressMonitor monitor = new MyProgressMonitor (); int mode = channelsftp.overwrite; sftp.put (localFileName, remotoFileName, monitor, modo); bSucc = verdadero; } capt (excepción e) {logger.error (e); } finalmente {if (null! = canal) {channel.disconnect (); }} return bSucc; } / ** * Eliminar archivo * @param directorio * @param filename * @return * / public boolean detectefile (directorio de cadena, string filename) {boolean flag = false; intente {sftp.cd (directorio); sftp.rm (nombre de archivo); bandera = verdadero; } catch (sftpexception e) {flag = false; logger.error (e); } Bandera de retorno; } / ** * Eliminar directorio * @param directorio dir para ser eliminado * @param Asegúrese de eliminar * @return * / public string deletedir (directorio de cadena, boolean seguro) {string command = "rm -rf" + directorio; String result = execCommand (comando, true); resultado de retorno; }/** * comprimir los archivos y el subdir del directorio en un zip llamado CompressName * @param Directory El directorio de contenido será compresión * @param compressname el nombre en el directorio después de que esté comprimido * @throws sftpexception * @usage ssh.compressdir ("/home/tfxiaozi/webapp", "test.zip"); */public void compressDir (directorio de cadena, string compressname) lanza sftpexception {string command = "cd" + directorio + "/nzip -r" + compressname + "./" + compressname.substring (0, compressname.lastindexof (".")); execCommand (comando, true); } / ** * Descargar * @param localFileName * @param RemoteFileName * @return * / public boolean Descargar (String localFileName, string RemoteFileName) {boolean bsucc = false; Canal canal = nulo; intente {sftpProgressMonitor monitor = new MyProgressMonitor (); sftp.get (remotoFileName, localFileName, monitor, channelsftp.overwrite); bSucc = verdadero; } capt (excepción e) {logger.error (e); } finalmente {if (null! = canal) {channel.disconnect (); }} return bSucc; } / ** * Ejecutar comando * @param comando * @param bandera * @return * / public string execCommand (comando de cadena, bandera boolean) {canal de canal = null; InputStream in = null; StringBuffer sb = new StringBuffer (""); intente {canal = session.openchannel ("exec"); System.out.println ("comando:" + comando); ((ChannelExec) canal) .SetCommand ("Export Term = ANSI &&" + comando); ((ChannelExec) canal) .SetErrStream (System.err); in = channel.getInputStream (); Channel.connect (); if (flag) {byte [] tmp = new Byte [10240]; while (true) {while (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (nueva cadena (tmp, 0, i)); } if (channel.isClosed ()) {break; }}} in.close (); } capt (excepción e) {logger.error (e); } finalmente {if (canal! = null) {channel.disconnect (); }} return sb.ToString (); } / ** * Obtener información CPU * @return * / public String [] getCpuinfo () {canal de canal = null; InputStream in = null; StringBuffer sb = new StringBuffer (""); intente {canal = session.openchannel ("exec"); ((ChannelExec) canal) .SetCommand ("Export Term = ANSI && Top -Bn 1"); // Ansi debe agregar = canal.getInputStream (); ((ChannelExec) canal) .SetErrStream (System.err); Channel.connect (); byte [] tmp = nuevo byte [10240]; while (true) {while (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (nueva cadena (tmp, 0, i)); } if (channel.isClosed ()) {break; }}} capt (excepción e) {logger.error (e); } finalmente {if (canal! = null) {channel.disconnect (); }} String buf = sb.ToString (); if (buf.indexof ("swap")! = -1) {buf = buf.substring (0, buf.indexof ("swap")); } if (buf.indexof ("cpu")! = -1) {buf = buf.substring (buf.indexof ("cpu"), buf.length ()); } buf.replaceall ("", ""); return buf.split ("// n"); } / ** * Obtener información de disco duro * @return * / public String gethardDiskinfo () lanza excepción {canal canal = null; InputStream in = null; StringBuffer sb = new StringBuffer (""); intente {canal = session.openchannel ("exec"); ((ChannelExec) canal) .SetCommand ("DF -LH"); in = channel.getInputStream (); ((ChannelExec) canal) .SetErrStream (System.err); Channel.connect (); byte [] tmp = nuevo byte [10240]; while (true) {while (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (nueva cadena (tmp, 0, i)); } if (channel.isClosed ()) {break; }}} Catch (Exception e) {Throw New RuntimeException (e); } finalmente {if (canal! = null) {channel.disconnect (); }} String buf = sb.ToString (); Cadena [] info = buf.split ("/n"); if (info.length> 2) {// Primera línea: tamaño del sistema de archivos utilizado disponible use% montado en string tmp = ""; for (int i = 1; i <info.length; i ++) {tmp = info [i]; Cadena [] tmParr = tmp.split ("%"); if (tmParr [1] .trim (). Equals ("/")) {boolean flag = true; while (flag) {tmp = tmp.replaceAll ("", ""); if (tmp.indexof ("") == -1) {flag = false; }} String [] resultado = tmp.split (""); if (resultado! = null && result.length == 6) {buf = resultado [1] + "total", + resultado [2] + "usado", + resultado [3] + "libre"; romper; } else {buf = ""; }}}} else {buf = "" "; } return buf; } / ** * Devuelve el número de bytes gratuitos * @return * @throws excepción * / public doble getFreedisk () lanza excepción {String hardDiskInfo = gethardDiskInfo (); if (harddiskinfo == null || harddiskinfo.equals ("")) {logger.error ("obtener el espacio de harddisk gratis fallado ......"); regreso -1; } String [] diskinfo = harddiskinfo.replace ("", "") .split (","); if (diskinfo == null || diskinfo.length == 0) {logger.error ("Obtener información de disco gratuita fallida ......"); regreso -1; } String free = diskinfo [2]; gratis = free.substring (0, free.indexof ("free")); //System.out.println("Free Space: " + gratis); String unit = free.substring (free.length ()-1); //System.out.println("unit: " + unidad); String freespace = free.substring (0, free.length ()-1); doble freespacel = double.parsedOuble (freespace); //System.out.println("Free Spacel: " + Freespacel); if (unit.equals ("k")) {return freespacel*1024; } else if (unit.equals ("m")) {return freespacel*1024*1024; } else if (unit.equals ("g")) {return freespacel*1024*1024*1024; } else if (unit.equals ("t")) {return freespacel*1024*1024*1024*1024; } else if (unit.equals ("p")) {return freespacel*1024*1024*1024*1024; } return 0; } / ** * Obtenga todos los subdirectorios y archivos en el directorio especificado * @param Directory * @return * @throws Exception * / @SupessWarnings ("RawTypes") Public List <String> ListFiles (String Directory) lanza Exception {vector fileList = null; List <String> filenAmelist = new ArrayList <String> (); filelist = sftp.ls (directorio); Iterator it = fileList.iterator (); while (it.hasnext ()) {string filename = ((channelsftp.lsentry) it.next ()). getFileName (); if (filename.startswith (".") || filename.startswith ("..")) {continuar; } FileNAmelist.Add (nombre de archivo); } return filenAmelist; } public boolean mkdir (ruta de cadena) {Boolean Flag = false; intente {sftp.mkdir (ruta); bandera = verdadero; } catch (sftpexception e) {flag = false; } Bandera de retorno; }}Probarlo
public static void main (string [] arg) lanza la excepción {ssh ssh = new ssh ("10.10.10.83", 22, "prueba", "prueba"); intente {ssh.connect (); } catch (jschexception e) {E.PrintStackTrace (); }/*String remotePath = "/home/tfxiaozi/" + "webapp/"; intente {ssh.listfiles (remotePath); } catch (excepción e) {ssh.mkdir (remotePath); }*//*boolean b = ssh.upload ("d: /test.zip", "webapp/"); System.out.println (b);*/// string [] buf = ssh.getcpuinfo (); //System.out.println("CPU: " + buf [0]); //System.out.println("Memo: " + buf [1]); //System.out.println(ssh.getharddiskinfo (). Reemplazar ("", "")); //System.out.println (ssh.getfreedisk ()); /*List <string> list = ssh.listfiles ("webapp/test"); for (cadena s: list) {system.out.println (s); }* / /*boolean b = ssh.detelefile ("webapp", "test.zip"); System.out.println (b);*//*try {String s = ssh.execCommand ("ls -l/home/tfxiaozi/webapp1/test", true); System.out.println (s); } catch (Exception e) {System.out.println (e.getMessage ()); }*///ssh.sftp.setfilenameEncoding("UTF-8 "); /*try {String ss = ssh.execcommand ("unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1/", true); System.out.println (SS); } catch (Exception e) {System.out.println (e.getMessage ()); }*//*String path = "/home/tfxiaozi/webapp1/test.zip"; intente {list <string> list = ssh.listfiles (ruta); for (cadena s: list) {system.out.println (s); } System.out.println ("ok"); } capt (excepción e) {system.out.println ("extraer fallido ..."); }*//*String command = "rm -rf/home/tfxiaozi/webapp1/" + "tinta y lavado de estudios chinos"; Cadena sss = ssh.execcommand (comando, true); System.out.println (SSS);*//*String FindCommand = "Find/Home/Tfxiaozi/WebApp1/Ink and Wash Chinese Studies-Name 'index.html'"; String result = ssh.execcommand (findCommand, true); System.out.println (resultado);* / /*string path = ""; ssh.listfiles (remotePath);*//* ssh.deletedir ("/home/tfxiaozi/webapp1", true); */// El siguiente se descomprimirá en el Directorio WebApp1, WebApp1/test/xxx //ssh.execcommand("unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1 ", true); // lo siguiente se descomprimirá en/webapp1/test/test/xxx //ssh.execcommand("unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1 ", true); //ssh.compressdir("/home/tfxiaozi/webapp1 "," test.zip "); //ssh.sftp.cd("/home/tfxiaozi/webapp1 "); //ssh.compressdir("/home/tfxiaozi/webapp1 "," test.zip "); /*boolean b = ssh.download ("d: /temp/test.zip", "webapp/test.zip"); System.out.println (b);*///ssh.getharddiskinfo (); System.out.println (ssh.getfreedisk ()); ssh.disconnect (); } Lo anterior es usar Linux para operar directamente, pero debe tenerse en cuenta que para los archivos chinos, al descomprimir, puede haber código confuso al pasar, y se deben agregar parámetros, como Unzip -O CP936 test.zip -d/home/tfxiaozi/test.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.