Recentemente, encontrei a necessidade de fazer upload de arquivos para servidores Linux durante a reconstrução e agora resolvi as notas de código.
Esse método de conexão leva em consideração o problema de simultaneidade e, ao criar uma conexão FTP, cada objeto de conexão é armazenado em
Threadlocal <FTP> para garantir que cada thread não tenha efeito na abertura e fechamento do FTP.
pacote com.test.utils; importar java.io.BufferEnputStream; importar java.io.file; importar java.io.filefilter; importar java.io.fileInputStream; importla.ut.io.InputStream; import java.util.arraylist; importla.utilIlilIlilIlIlilil.Davata; importar; org.apache.commons.logging.log; importar org.apache.commons.logging.logfactory; importar com.jcraft.jsch.channelsftp; importar com.jcraft.jsch.jsch; import stantl stantl stantl.jcraft.jsch.sessionger; public class; data estática privada last_push_date = null; SSHSession de sessão particular; canal privado canal; Threadlocal estático privado <ftp> sftplocal = new ThreadLocal <FTP> (); FTP privado (host de string, porta int, nome de usuário de string, senha de string) lança a exceção {jsch jsch = new jsch (); jsch.getSession (nome de usuário, host, port); // obtém sessão sshsession = jsch.getSession (nome de usuário, host, porta); sshSession.setPassword (senha); // Modifique o valor da GSSAPIAuthentication no servidor/etc/ssh/sshd_config para sim para não, que resolve a incapacidade do usuário de efetuar login remotamente sshsession.setConfig ("userauth.gssapi-with-mic", "não"); // Defina propriedades para o objeto de sessão. Ao acessar o servidor pela primeira vez, você não precisa inserir sim sshsession.setConfig ("stricThostKeyChecking", "não"); sshSession.Connect (); // Obtenha o canal SFTP canal = (canaisftp) sshsession.openchannel ("sftp"); canal.Connect (); Logger.info ("FTP conectado com sucesso!" + SSHSession); } / ** * está conectado * * @return * / private boolean isConnected () {return null! = Canal && Channel.isconnected (); } /** * Obtenha o cliente SFTP armazenado no thread local * * @return * @throws Exception * /public static ftp getSftputil (string host, porta int, string username, string senha) lança exceção {// obtenha o thread local ftp sftputil = sftplocal.get (); if (null == sftputil ||! sftputil.isconnected ()) {// impedem a nova conexão para impedir o thread local e implementar o processamento simultâneo sftplocal.set (novo FTP (host, porta, nome de usuário, senha)); } return sftplocal.get (); } / *** Libere o cliente SFTP que armazena o thread local* / public static void release () {if (null! = Sftplocal.get ()) {sftplocal.get (). CloseChannel (); logger.info ("conexão fechada" + sftplocal.get (). sshSession); sftplocal.set (nulo); }} / ** * Feche o canal * * @THOWSOws Exception * / public void CloseChannel () {if (null! = Canal) {try {Channel.disconnect (); } Catch (Exceção e) {Logger.error ("Exceção ocorreu ao fechar o canal SFTP:", e); }} if (null! = sshSession) {tente {sshsession.disconnect (); } Catch (Exceção e) {Logger.error ("SFTP Fecht Session Exception:", e); }}} /*** Diretório @param O diretório para fazer upload do diretório de arquivos local FTP* @param uploadFile** /public void upload (diretório de string, string uploadfile) lança exceção {Try {<br> // Execute List exibir LS Channel.ls (diretório); <br> // excute List <File> arquivos = getFiles (uploadfile, novo ArrayList <File> ()); for (int i = 0; i <files.size (); i ++) {arquivo file = files.get (i); InputStream input = new bufferInputStream (new FileInputStream (arquivo)); canal.put (entrada, file.getName ()); tente {if (input! = null) input.close (); } catch (Exceção e) {e.printStackTrace (); Logger.error (file.getName () + "Exceção ao fechar o arquivo ... exceção!" + E.GetMessage ()); } if (file.exists ()) {boolean b = file.delete (); Logger.info (file.getName () + "Arquivo carregado! Excluir ID:" + b); }}}} catch (Exceção e) {Logger.error ("[Subdirectory está sendo criado]:", e); // crie canal de subdiretório.mkdir (diretório); }} // Obtenha o arquivo Public List <File> getFiles (String realPath, List <File> arquivos) {file realfile = new File (RealPath); if (realfile.isdirectory ()) {file [] subfiles = realfile.listfiles (new FileFilter () {@Override public boolean Acep (arquivo file) {if (null == last_push_date) {return; }}); para (arquivo de arquivo: subfiles) {if (file.isdirectory ()) {getfiles (file.getabsolutepath (), arquivos); } else {files.add (file); } 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); }}}} retornar arquivos; }}Resumir
O exposto acima está a conexão remota Java ao servidor Linux, execute os comandos e upload de arquivos introduzidos pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem. O editor responderá a todos a tempo!