美文网首页
java基于Scp实现Linux下远程获取、上传文件

java基于Scp实现Linux下远程获取、上传文件

作者: 话尔loony | 来源:发表于2019-05-29 13:53 被阅读0次
  • 前不久在项目开发中遇上的一个需求:需要在B机器上将A机器某路径下的文件拷贝到B机器上做保存。
    简单分析下来,自己的理解就是:一个RPC,主要就是解决跨域传输文件的问题。在提前能拿到A机器的IP、Port、userName、Pwd的情况下还是很好解决的。
    参考下Linux下,实现方式:
将本机文件上传到远程服务器
#scp /usr/local/news.txt root@192.168.1.1:/etc/opt

** /usr/local/** 本地文件的绝对路径
news.txt 要复制到服务器上的本地文件
root 通过root用户登录到远程服务器(也可以使用其他拥有同等权限的用户)
192.168.6.129 远程服务器的ip地址(也可以使用域名或机器名)
/etc/opt 将本地文件复制到位于远程服务器上的路径

将远程服务器文件下载到本机
#scp root@192.168.1.1:/usr/local/news.txt  /usr/local

root 通过remote用户登录到远程服务器(也可以使用其他拥有同等权限的用户)
192.168.1.1 远程服务器的IP地址(当然也可以使用该服务器域名)
/usr/local/news.txt 欲复制到本机的位于远程服务器上的文件
/usr/local 将远程文件复制到本地的绝对路径

  • java 实现的方式参照上述就简单了,如下:
    需要导入Jar包:
<!-- https://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2 -->
        <dependency>
            <groupId>ch.ethz.ganymed</groupId>
            <artifactId>ganymed-ssh2</artifactId>
            <version>build210</version>
        </dependency>

工具类:

public class Scpclient {
    private static final FileLog logger = new FileLog(Scpclient.class.getName());
    static private Scpclient instance;

    static synchronized public Scpclient getInstance(String IP, int port,
                                                     String username, String passward) {
        if (instance == null) {
            instance = new Scpclient(IP, port, username, passward);
        }
        return instance;
    }

    public Scpclient(String IP, int port, String username, String passward) {
        this.ip = IP;
        this.port = port;
        this.username = username;
        this.password = passward;
    }

    /**
     * 远程拷贝文件
     * @param remoteFile  远程源文件路径
     * @param localTargetDirectory 本地存放文件路径
     */
    public Map<String,Object> getFile(String remoteFile, String localTargetDirectory) {
        Connection conn = new Connection(ip,port);
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username,
                    password);
            if (isAuthenticated == false) {
             logger.log(Level.ERROR_INT,"authentication failed");
             return Common.pageMap(NetMsgUtil.INVOKING_SERVER_EXCEPTION,"authentication failed");
            }
            SCPClient client = new SCPClient(conn);
            client.get(remoteFile, localTargetDirectory);
            conn.close();
        } catch (IOException e) {
            logger.log(Level.ERROR_INT,e.getMessage());
            return Common.pageMap(NetMsgUtil.INVOKING_SERVER_EXCEPTION,e.getMessage());
        }
        return Common.pageMap(NetMsgUtil.NET_NORMAL_MSG,"Document Success");
    }

  

   /**
     * 远程上传文件
     * @param localFile 本地文件路径
     * @param remoteTargetDirectory  远程存放文件路径
     */
    public void putFile(String localFile, String remoteTargetDirectory) {
        Connection conn = new Connection(ip,port);
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username,
                    password);
            if (isAuthenticated == false) {
                logger.log(Level.ERROR_INT,"authentication failed");
            }
            SCPClient client = new SCPClient(conn);
            client.put(localFile, remoteTargetDirectory);
            conn.close();
        } catch (IOException e) {
            logger.log(Level.ERROR_INT,e.getMessage());
        }
    }

  /**
     * 远程上传文件并对上传文件重命名
     * @param localFile 本地文件路径
      *@param remoteFileName远程文件名
     * @param remoteTargetDirectory  远程存放文件路径
     *@param mode 默认"0600",length=4
     */
    public void putFile(String localFile, String remoteFileName,String remoteTargetDirectory,String mode) {
        Connection conn = new Connection(ip,port);
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username,
                    password);
            if (isAuthenticated == false) {
                logger.log(Level.ERROR_INT,"authentication failed");
            }
            SCPClient client = new SCPClient(conn);
            if((mode == null) || (mode.length() == 0)){
                mode = "0600";
            }
            client.put(localFile, remoteFileName, remoteTargetDirectory, mode);

            //重命名
            Session sess = conn.openSession();
            String tmpPathName = remoteTargetDirectory + File.separator+ remoteFileName;
            String newPathName = tmpPathName.substring(0, tmpPathName.lastIndexOf("."));
            sess.execCommand("mv " + remoteFileName + " " + newPathName);

            conn.close();
        } catch (IOException e) {
            logger.log(Level.ERROR_INT,e.getMessage());
        }
    }

    private String ip;
    private int port;
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

}

调用姿势:

Scpclient scpclient = Scpclient.getInstance(String IP, int port,String username, String passward);
// 拷贝
scpclient .getFile(...);
// 上传
scpclient .putFile(...);
  • 最后,只想说一句,我们不生产代码,我们只是代码搬运工。

相关文章

  • java基于Scp实现Linux下远程获取、上传文件

    前不久在项目开发中遇上的一个需求:需要在B机器上将A机器某路径下的文件拷贝到B机器上做保存。简单分析下来,自己的理...

  • scp 上传 下载 文件

    linux: scp 上传 下载 文件 linux 中的ssh命令: scp 可以用来上传本地文件到远程服务器 或...

  • scp的使用

    scp是什么? scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件...

  • scp 和 screen

    scp命令可以实现在linux系统之间安全的传输文件 scp [参数] 本地文件 远程主机账户@远程主机地址:远程...

  • linux 使用scp命令从一台机器复制文件到另一台linux机

    scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。lin...

  • SCP命令

    scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。usa...

  • Mac本地文件上传到云服务器

    一、put命令 1、put 本地文件路径 远程路径 二、scp命令 1、mac上传文件到Linux服务器scp 文...

  • scp命令 Linux和Windows文件互传

    scp 本地Windows获取远程Linux文件,需要本地Windows有bash命令工具,执行:scp -P 8...

  • linux之间的文件互传-scp命令

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件或目录的命令,基于ssh登陆进行安全的远程...

  • Linux部署代码

    Linux机器通过SCP上传文件 Linux机器可通过以下命令向Linux云服务器上传文件:scp 本地文件地址 ...

网友评论

      本文标题:java基于Scp实现Linux下远程获取、上传文件

      本文链接:https://www.haomeiwen.com/subject/qkietctx.html