Java远程连接Linux服务器并执行命令及上传文件功能
程序员文章站
2023-12-19 09:59:58
最近再开发中遇到需要将文件上传到linux服务器上,至此整理代码笔记。
此种连接方法中有考虑到并发问题,在进行创建ftp连接的时候将每一个连接对象存放至
t...
最近再开发中遇到需要将文件上传到linux服务器上,至此整理代码笔记。
此种连接方法中有考虑到并发问题,在进行创建ftp连接的时候将每一个连接对象存放至
threadlocal<ftp> 中以确保每个线程之间对ftp的打开与关闭互不影响。
package 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 java.util.list; import 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; public class ftp { //打印log日志 private static final log logger = logfactory.getlog(ftp.class); private static date last_push_date = null; private session sshsession; private channelsftp channel; private static threadlocal<ftp> sftplocal = new threadlocal<ftp>(); private ftp(string host, int port, string username, string password) throws exception { jsch jsch = new jsch(); jsch.getsession(username, host, port); //根据用户名,密码,端口号获取session sshsession = jsch.getsession(username, host, port); sshsession.setpassword(password); //修改服务器/etc/ssh/sshd_config 中 gssapiauthentication的值yes为no,解决用户不能远程登录 sshsession.setconfig("userauth.gssapi-with-mic", "no"); //为session对象设置properties,第一次访问服务器时不用输入yes sshsession.setconfig("stricthostkeychecking", "no"); sshsession.connect(); //获取sftp通道 channel = (channelsftp)sshsession.openchannel("sftp"); channel.connect(); logger.info("连接ftp成功!" + sshsession); } /** * 是否已连接 * * @return */ private boolean isconnected() { return null != channel && channel.isconnected(); } /** * 获取本地线程存储的sftp客户端 * * @return * @throws exception */ public static ftp getsftputil(string host, int port, string username, string password) throws exception { //获取本地线程 ftp sftputil = sftplocal.get(); if (null == sftputil || !sftputil.isconnected()) { //将新连接防止本地线程,实现并发处理 sftplocal.set(new ftp(host, port, username, password)); } return sftplocal.get(); } /** * 释放本地线程存储的sftp客户端 */ public static void release() { if (null != sftplocal.get()) { sftplocal.get().closechannel(); logger.info("关闭连接" + sftplocal.get().sshsession); sftplocal.set(null); } } /** * 关闭通道 * * @throws exception */ public void closechannel() { if (null != channel) { try { channel.disconnect(); } catch (exception e) { logger.error("关闭sftp通道发生异常:", e); } } if (null != sshsession) { try { sshsession.disconnect(); } catch (exception e) { logger.error("sftp关闭 session异常:", e); } } } /** * @param directory 上传ftp的目录 * @param uploadfile 本地文件目录 * */ public void upload(string directory, string uploadfile) throws exception { try {<br> //执行列表展示ls 命令 channel.ls(directory);<br> //执行盘符切换cd 命令 channel.cd(directory); list<file> 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()); try { if (input != null) input.close(); } catch (exception e) { e.printstacktrace(); logger.error(file.getname() + "关闭文件时.....异常!" + e.getmessage()); } if (file.exists()) { boolean b = file.delete(); logger.info(file.getname() + "文件上传完毕!删除标识:" + b); } } }catch (exception e) { logger.error("【子目录创建中】:",e); //创建子目录 channel.mkdir(directory); } } //获取文件 public list<file> getfiles(string realpath, list<file> files) { file realfile = new file(realpath); if (realfile.isdirectory()) { file[] subfiles = realfile.listfiles(new filefilter() { @override public boolean accept(file file) { if (null == last_push_date ) { return true; } else { long modifydate = file.lastmodified(); return modifydate > last_push_date.gettime(); } } }); for (file file : subfiles) { if (file.isdirectory()) { getfiles(file.getabsolutepath(), files); } 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); } } } } return files; } }
总结
以上所述是小编给大家介绍的java远程连接linux服务器并执行命令及上传文件,希望对大家有所帮助如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!