Java通过ftp上传文件,通过ssh操作远程服务器工具类

  1. maven
		<dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>
        <dependency>
            <groupId>ch.ethz.ganymed</groupId>
            <artifactId>ganymed-ssh2</artifactId>
            <version>build210</version>
        </dependency>
  1. ftp连接并上传文件
package com.siwei.os.app.utils;

import ch.ethz.ssh2.Connection;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.siwei.os.app.pojo.po.TerminalUploadConfig;
import org.apache.commons.net.ftp.FTPClient;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 处理应用包工具类
 */
public class FileUploadUtil {
    /**
     * Description: 向FTP服务器上传文件
     *
     * @param filename   上传到FTP服务器上的文件名
     * @param input      文件的输入流
     * @param terminalNo 终端英文名
     * @return 成功返回true,否则返回false
     */
    public static void uploadFile(String filename, InputStream input, String terminalNo) {
        FTPClient ftp = new FTPClient();
        Session sshSession = null;
        Channel channel = null;
        ChannelSftp sftp = null;
        Connection login = null;
        // ip
        String host = TerminalUploadConfig.getHost();
        // 用户名
        String userName = TerminalUploadConfig.getUserName();
        // 密码
        String password = TerminalUploadConfig.getPassword();
        // 文件储存路径
        String path = TerminalUploadConfig.getPath();
        try {
            JSch jsch = new JSch();
            // 获取sshSession  账号-ip-端口
            sshSession = jsch.getSession(userName, host, 22);
            // 添加密码
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            // 严格主机密钥检查
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            // 开启sshSession链接
            sshSession.connect();
            // 获取sftp通道
            channel = sshSession.openChannel("sftp");
            // 1. ftp上传文件
            // 开启
            channel.connect();
            sftp = (ChannelSftp) channel;
            //设置为被动模式
            ftp.enterLocalPassiveMode();
            // 设置上传文件的类型为二进制类型
            // 进入到要上传的目录
            sftp.cd(path);
            // 上传文件
            sftp.put(input, filename);
            input.close();
            // 2. ssh操作服务器
            // 登录
            login = ServerUtil.login(host, userName, password);
            // 删除原有文件
            String delOld = "rm -r" + path + terminalNo;
            ServerUtil.execCommand(login, delOld);
            // 解压压缩包
            String unzip = "unzip " + path + filename + " -d " + path + terminalNo;
            ServerUtil.execCommand(login, unzip);
            // 删除压缩包
            String delZip = "rm -rf " + path + filename;
            ServerUtil.execCommand(login, delZip);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sftp.isClosed()) {
                sftp.disconnect();
            }
            if (channel.isClosed()) {
                channel.disconnect();
            }
            if (sshSession.isConnected()) {
                sshSession.disconnect();
            }
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
            login.close();
        }
    }

    /**
     * 删除远程服务器文件
     *
     * @param fileName 文件名称
     */
    public static void deleteFile(String fileName) {
        String host = TerminalUploadConfig.getHost();
        String userName = TerminalUploadConfig.getUserName();
        String password = TerminalUploadConfig.getPassword();
        String path = TerminalUploadConfig.getPath();
        // 登录
        Connection login = ServerUtil.login(host, userName, password);
        // 删除文件
        String del = "rm -r " + path + fileName;
        ServerUtil.execCommand(login, del);
        login.close();
    }
}
  1. ssh登录并操作远程数据库
package com.siwei.os.app.utils;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

/**
 * Java通过ssh连接远程服务器工具类
 */
@Slf4j
public class ServerUtil {
    /**
     * 登录ssh
     *
     * @param ip
     * @param username
     * @param password
     * @return
     */
    public static Connection login(String ip, String username, String password) {
        boolean flag = false;
        Connection connection = null;
        try {
            connection = new Connection(ip);
            // 连接
            connection.connect();
            // 认证
            flag = connection.authenticateWithPassword(username, password);
            if (flag) {
               log.info("================" + ip + " 登录成功==================");
                return connection;
            }
        } catch (Exception e) {
            if (connection != null) {
                connection.close();
            }
            connection = null;
        }
        return connection;
    }

    /**
     * 远程执行shll脚本或者命令
     *
     * @param cmd 即将执行的命令
     * @return 命令执行完后返回的结果值
     */
    public static String execCommand(Connection connection, String cmd) {
        String result = "";
        try {
            if (connection != null) {
                // 打开一个会话
                Session session = connection.openSession();
                // 执行命令
                session.execCommand(cmd);
                result = processStdout(session.getStdout());
                log.info("================" + "操作命令:" + cmd);
                System.out.println(result);
                session.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 解析脚本执行返回的结果集
     *
     * @param in 输入流对象
     * @return 以纯文本的格式返回
     */
    private static String processStdout(InputStream in) {
        InputStream stdout = new StreamGobbler(in);
        StringBuffer buffer = new StringBuffer();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout, StandardCharsets.UTF_8));
            String line = null;
            while ((line = br.readLine()) != null) {
                buffer.append(line).append("\n");
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer.toString();
    }
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值