JAVA远程读取服务器文件

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: JAVA远程读取服务器文件
<dependency>
    <groupId>ch.ethz.ganymed</groupId>
    <artifactId>ganymed-ssh2</artifactId>
    <version>build210</version>
</dependency>
  • 登录远程服务器
public boolean login(){
  //创建远程连接,默认连接端口为22,如果不使用默认,可以使用方法
  //new Connection(ip, port)创建对象
  Connection conn = new Connection(ip);        
  try {
    //连接远程服务器
    conn.connect();
    //使用用户名和密码登录
        return conn.authenticateWithPassword(usr, psword);
  } catch (IOException e) {   
    System.err.printf("用户%s密码%s登录服务器%s失败!", usr, psword, ip);
    e.printStackTrace();
  }
  return false;
}
/**
  * 上传本地文件到服务器目录下
  * @param conn Connection对象
  * @param fileName 本地文件
  * @param remotePath 服务器目录
  */
public void putFile(Connection conn, String fileName, String remotePath){
  SCPClient sc = new SCPClient(conn);
  try {
    //将本地文件放到远程服务器指定目录下,默认的文件模式为 0600,即 rw,
    //如要更改模式,可调用方法 put(fileName, remotePath, mode),模式须是4位数字且以0开头
    sc.put(fileName, remotePath);
  } catch (IOException e) {
    e.printStackTrace();
  }
}
/**
  * 下载服务器文件到本地目录
  * @param fileName 服务器文件
  * @param localPath 本地目录
  */
public void copyFile(Connection conn, String fileName,String localPath){
  SCPClient sc = new SCPClient(conn);
  try {
    sc.get(fileName, localPath);
  } catch (IOException e) {
    e.printStackTrace();
  }
}
    /**
     * 获得远程服务器文件夹下所有文件
     *
     * @param remoteDir
     * @param localTargetDirectory
     */
    public void getFiles(String remoteDir, String localTargetDirectory) {
        Connection conn = new Connection(ip, port);
        Connection conn2 = getConn2(ip, port, username, password);
        SFTPv3Client sft = null;
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);
            if (!isAuthenticated) {
                System.err.println("authentication failed");
            }
            SCPClient client = new SCPClient(conn);
            sft = new SFTPv3Client(conn2);
            //获取远程目录下文件列表
            Vector<?> v = sft.ls(remoteDir);
            for (int i = 0; i < v.size(); i++) {
                SFTPv3DirectoryEntry s = (SFTPv3DirectoryEntry) v.get(i);
                if (fileType(s.filename)) {
                    client.get(remoteDir + "/" + s.filename, localTargetDirectory);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (sft != null) {
                sft.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
/**
 * 在远程LINUX服务器上,在指定目录下,获取文件各个属性
 * @param[in] conn Conncetion对象
 * @param[in] remotePath 远程主机的指定目录
 */
public void getFileProperties(Conncetion conn, String remotePath){
  try {
    SFTPv3Client sft = new SFTPv3Client(conn);
    Vector<?> v = sft.ls(remotePath);
    for(int i=0;i<v.size();i++){
      SFTPv3DirectoryEntry s = new SFTPv3DirectoryEntry();
      s = (SFTPv3DirectoryEntry) v.get(i);
      //文件名
      String filename = s.filename;
      //文件的大小
      Long fileSize = s.attributes.size;
    }
    sft.close();
  } catch (Exception e1) {
    e1.printStackTrace();
  }
}
/**
 * 在远程LINUX服务器上,在指定目录下,删除指定文件
 * @param[in] fileName 文件名
 * @param[in] remotePath 远程主机的指定目录
 * @return
 */
public void delFile(String remotePath, String fileName){
  try {
    SFTPv3Client sft = new SFTPv3Client(conn);
    //获取远程目录下文件列表
    Vector<?> v = sft.ls(remotePath);
    for(int i=0;i<v.size();i++){
      SFTPv3DirectoryEntry s = new SFTPv3DirectoryEntry();
      s = (SFTPv3DirectoryEntry) v.get(i);
      //判断列表中文件是否与指定文件名相同
      if(s.filename.equals(fileName)){
        //rm()方法中,须是文件绝对路径+文件名称
        sft.rm(remotePath + s.filename);
      }
    sft.close();
  } catch (Exception e1) {
    e1.printStackTrace();
  }
}
/**
 * 执行脚本
 * @param conn Connection对象
 * @param cmds 要在linux上执行的指令
 */
public int exec(Connection conn, String cmds){
  InputStream stdOut = null;
  InputStream stdErr = null;
  int ret = -1;
  try {
    //在connection中打开一个新的会话
    Session session = conn.openSession();
    //在远程服务器上执行linux指令
    session.execCommand(cmds);
    //指令执行结束后的输出
    stdOut = new StreamGobbler(session.getStdout());
    //指令执行结束后的错误
    stdErr = new StreamGobbler(session.getStderr());
    //等待指令执行结束
    session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
      //取得指令执行结束后的状态
    ret = session.getExitStatus(); 
    conn.close();
  }catch(Exception e){
     e.printStackTrace();
  }
  return ret;
}
  • controller
package com.sun.redis.controller;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.sun.redis.util.FileUtil;
import com.sun.redis.util.LinuxLogin;
@RestController
@RequestMapping("/fileDownCtl")
public class FileDownController {
  @Autowired
  private FileUtil fileUtil;
  @Autowired
  private LinuxLogin linuxLogin;
  @RequestMapping(value="/getFile",method=RequestMethod.GET)
  public void getFile(HttpServletResponse response){
    String path = "D:/Games/WarCraft/BeeWind软件站说明.txt";
    fileUtil.getListFileList(path, response);
  }
  @RequestMapping(value="/getLinuxFile",method=RequestMethod.GET)
  public void getLinuxFile(HttpServletResponse response) throws IOException{
    String fileName = "linux.txt";
    String path = "/home/hadoop/text/";
    linuxLogin.login();
    response.reset();
        response.setContentType("bin");
        response.setContentType("octets/stream");
        response.addHeader("Content-Type", "text/html; charset=utf-8");
        response.addHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("UTF-8"),"ISO8859-1"));
    linuxLogin.copyFile(linuxLogin.conn, path+fileName,response.getOutputStream());
  }
}
  • 工具类
package com.sun.redis.util;
import java.io.IOException;
import java.util.Vector;
import javax.servlet.ServletOutputStream;
import org.springframework.stereotype.Component;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.SFTPv3Client;
import ch.ethz.ssh2.SFTPv3DirectoryEntry;
@Component
public class LinuxLogin {
  public static Connection conn = null;
  public  boolean login(){
    //创建远程连接,默认连接端口为22,如果不使用默认,可以使用方法
    //new Connection(ip, port)创建对象
    conn = new Connection("192.168.159.128");        
    try {
      //连接远程服务器
      conn.connect();
      //使用用户名和密码登录
          return conn.authenticateWithPassword("hadoop", "hadoop");
    } catch (IOException e) {   
      System.err.printf("用户%s密码%s登录服务器%s失败!", "hadoop", "hadoop", "192.168.159.128");
      e.printStackTrace();
    }
    return false;
  }
  /**
   * 复制到JAVA所在服务器
   * @param conn
   * @param fileName
   * @param localPath
   */
  public void copyFile(Connection conn, String fileName,String localPath){
    SCPClient sc = new SCPClient(conn);
    try {
      sc.get(fileName, localPath);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * 流式输出,用于浏览器下载
   * @param conn
   * @param fileName
   * @param outputStream
   */
  public void copyFile(Connection conn, String fileName,ServletOutputStream outputStream){
    SCPClient sc = new SCPClient(conn);
    try {
      sc.get(fileName, outputStream);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * 在远程LINUX服务器上,在指定目录下,获取文件各个属性
   * @param[in] conn Conncetion对象
   * @param[in] remotePath 远程主机的指定目录
   */
  public void getFileProperties(Connection conn, String remotePath){
    try {
      SFTPv3Client sft = new SFTPv3Client(conn);
      Vector<?> v = sft.ls(remotePath);
      for(int i=0;i<v.size();i++){
        SFTPv3DirectoryEntry s = new SFTPv3DirectoryEntry();
        s = (SFTPv3DirectoryEntry) v.get(i);
        //文件名
        String filename = s.filename;
        //文件的大小
        Long fileSize = s.attributes.size;
      }
      sft.close();
    } catch (Exception e1) {
      e1.printStackTrace();
    }
  }
  public static void main(String args[]){
    LinuxLogin log = new LinuxLogin();
    System.out.println(log.login());
  }
}


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
Java Linux API
Java读取Excel表格中的数据
Java读取Excel表格中的数据
Java读取Excel表格中的数据
|
缓存 JSON Java
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
451 1
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
|
Java 应用服务中间件 Linux
基于IDEA Java 项目远程DEBUG调试
基于IDEA Java 项目远程DEBUG调试
881 0
基于IDEA Java 项目远程DEBUG调试
|
Java
java手动实现远程执行
当服务器上发生了bug,但是却因为某一两处日志没有打印,而最终无法定位到具体问题时,是很烦恼的,远程执行可以在不修改服务器程序的前提下为程序提供动态增强的功能,打印出自己想要的信息。
167 0
java手动实现远程执行
|
网络协议 安全 Java
如何远程Debug内网(或者防火墙后)的Java服务
如何远程Debug内网(或者防火墙后)的Java服务
如何远程Debug内网(或者防火墙后)的Java服务
Java-读取本地txt文件的问题
Java-读取本地txt文件的问题
214 0
|
Java 数据库
java语言读取Excel文件信息
最近项目中有一个表信息过大,需要手动删除,因为信息量比较大手动删除较为麻烦,所以采用使用excel读取数据的方式,然后操作数据库删除数据,其实只要是想要从Excel中获取信息都可以使用这种方式进行操作Excel,代码很简单。
209 0
|
存储 Java 数据安全/隐私保护
Java远程下载zip文件
Java远程下载zip文件
Java远程下载zip文件
关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案
关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案
253 0
关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案