Recientemente, encontré la necesidad de cargar archivos a los servidores de Linux durante la reurbanización, y ahora he ordenado las notas del código.
Este método de conexión tiene en cuenta el problema de concurrencia, y al crear una conexión FTP, cada objeto de conexión se almacena en
ThreadLocal <ftp> para garantizar que cada hilo no tenga ningún efecto en la apertura y el cierre de FTP.
paquete com.test.utils; import java.io.bufferedInputStream; import java.io.file; import java.io.fileFilter; import java.io.fileInputStream; import java.io.inputstream; import java.util.arraylist; import java.util.date; import.util.list; org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; import com.jcraft.jsch.session; clase pública ftp {// log log log logger logger = log factorory.getLog (factory.getLog (ftp.class); fecha estática privada last_push_date = null; Session de sesión privada; Canal de canales privadosftp; PRIVADO STICTLOCAL <FTP> SFTPLOCAL = new ThreadLocal <ftp> (); private ftp (string host, int port, string UserName, String Password) lanza la excepción {jsch jsch = new jsch (); jsch.getSession (nombre de usuario, host, puerto); // Get Session sshsession = jsch.getSession (nombre de usuario, host, puerto); sshsession.setPassword (contraseña); // Modificar el valor de GSSAPIAuthentication en el servidor/etc/ssh/sshd_config a sí a no, que resuelve la incapacidad del usuario para iniciar sesión // Establecer propiedades para el objeto de sesión. Al acceder al servidor por primera vez, no necesita ingresar YES sshsession.setConfig ("stricthostKeyChecking", "no"); sshsession.connect (); // Obtenga el canal SFTP Channel = (Channelsftp) sshsession.openchannel ("sftp"); Channel.connect (); logger.info ("¡FTP conectado con éxito!" + Sshsession); } / ** * ¿Está conectado * * @return * / private boolean isconnected () {return null! = Canal && channel.isconnected (); } /** * Obtenga el cliente SFTP almacenado en el hilo local * * @return * @throws Exception * /public static ftp getSftputil (string host, int port, string username, string contraseña) lanza excepción {// Obtener el hilo local ftp sftputil = sftplocal.get (); if (null == sftputil || } return sftplocal.get (); } / *** Release el cliente SFTP que almacena el hilo local* / public static void libeS () {if (null! = Sftplocal.get ()) {sftplocal.get (). CloseChannel (); logger.info ("Close Connection" + sftplocal.get (). sshsession); sftplocal.set (nulo); }} / ** * Cerrar canal * * @throws Exception * / public void CloseChannel () {if (null! = Canal) {try {channel.disconnect (); } capt (excepción e) {logger.error ("La excepción ocurrió al cerrar el canal SFTP:", e); }} if (null! = sshsession) {try {sshsession.disconnect (); } catch (Exception e) {logger.error ("SFTP Close Session Exception:", e); }}} /*** @Param Directory El directorio para cargar ftp* @param uploadFile Directorio de archivos locales** /public void upload (directorio de cadenas, string uploadFile) lanza la excepción {try {<br> // ejecutar list visual visual ls channel.ls (directorio); <br> // ejecute la letra de la unidad cambia de comando cd List <Sche> files = getFiles (uploadFile, new ArrayList <File> ()); for (int i = 0; i <files.size (); i ++) {file file = files.get (i); InputStream Input = new BufferedInputStream (new FileInputStream (File)); channel.put (input, file.getName ()); intente {if (input! = null) input.close (); } catch (Exception e) {E.PrintStackTrace (); logger.error (file.getName () + "Excepción al cerrar el archivo ... ¡excepción!" + E.getMessage ()); } if (file.exists ()) {boolean b = file.delete (); logger.info (file.getName () + "archivo cargado! Eliminar id:" + b); }}}} capt (excepción e) {logger.error ("[se está creando subdirectorio]:", e); // crear channel.mkdir (directorio); }} // Obtener File Public List <Sche> GetFiles (String RealPath, List <File> archivos) {file realFile = new File (RealPath); if (realFile.isDirectory ()) {file [] subfiles = realFile.ListFiles (new FileFilter () {@Override public Boolean Acepter (archivo File) {if (null == last_push_date) {return true;} más {longifyDate = file.lastModmode }}); for (archivo archivo: subfiles) {if (file.isDirectory ()) {getFiles (file.getabsolutePath (), archivos); } else {files.add (archivo); } if (null == last_push_date) {last_push_date = new Date (file.lastModified ()); } else {Long ModifyDate = File.lastModified (); if (modifyDate> last_push_date.gettime ()) {last_push_date = new Date (ModifyDate); }}}} retorno archivos; }}Resumir
El anterior es la conexión remota Java al servidor Linux, ejecutar comandos y cargar archivos introducidos por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje. ¡El editor responderá a todos a tiempo!