java实现两个服务器间文件复制


前言

在做项目的时候,需要使用一些测试集,一些测试集在另外服务器上,并且比较杂乱,所以要将一部分需要的测试集复制到现在正在使用的服务器上,最后使用ssh2实现两个服务器之间的文件拷贝。


提示:以下是本篇文章正文内容,下面案例可供参考

二、使用java实现通信

1.引入库

代码如下(示例):

        <dependency>
            <groupId>ch.ethz.ganymed</groupId>
            <artifactId>ganymed-ssh2</artifactId>
            <version>262</version>
        </dependency>

2.整体代码

代码如下(示例):

    private static String  DEFAULTCHART="UTF-8";

    /**
     * 登录主机
     * @return
     *      登录成功返回true,否则返回false
     */
    public static Connection login(String ip,
                                   String userName,
                                   String userPwd){

        boolean flg=false;
        Connection conn = null;
        try {
            conn = new Connection(ip);
            conn.connect();//连接
            flg=conn.authenticateWithPassword(userName, userPwd);//认证
            if(flg){
                return conn;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 远程执行shll脚本或者命令
     * @param cmd
     *      即将执行的命令
     * @return
     *      命令执行完后返回的结果值
     */
    public static String execute(Connection conn,String cmd){
        String result="";
        try {
            if(conn !=null){
                Session session= conn.openSession();//打开一个会话
                session.execCommand(cmd);//执行命令
                result=processStdout(session.getStdout(),DEFAULTCHART);
                //如果为得到标准输出为空,说明脚本执行出错了
                System.out.println("执行的命令:"+cmd);
                conn.close();
                session.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 解析脚本执行返回的结果集
     * @param in 输入流对象
     * @param charset 编码
     * @return
     *       以纯文本的格式返回
     */
    private static String processStdout(InputStream in, String charset){
        InputStream  stdout = new StreamGobbler(in);
        StringBuffer buffer = new StringBuffer();;
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));
            String line=null;
            while((line=br.readLine()) != null){
                buffer.append(line+"\n");
            }
        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer.toString();
    }
//拷贝代码的命令,这里使用scp命令。用于scp命令每次传输都要输入命令,使用sshpass命令高效完成密码输入操作
sshpass -p goal-password scp -r filepath goal-root@goal-ip:goal-path 

三、服务器与服务器通信

在使用过程中,发现大规模的运用rcp进行通信是不可行的,因为大量占用端口进行rcp传输会导致我们建立的连接中断,其实可以直接在服务器运行rcp就可以了。


public static void main(String[] args) {
	String[] cmd = {"sshpass", "-p", goal-password, "scp", "-r", file, goal-root@goal-ip:goal-path };
            execute(cmd);
            //爬一次休眠一会儿,防止服务器端口占满,无法连接。
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }

}

private static void execute(String[] cmd) {
    Process process = null;
    ProcessBuilder builder;
    builder = new ProcessBuilder(cmd);
    builder.redirectErrorStream(true);
    try {
        process =  builder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Scanner s = new Scanner(process.getInputStream());
    StringBuilder text = new StringBuilder();
    while (s.hasNextLine()) {
        text.append(s.nextLine());
        text.append("\n");
    }

    s.close();

    try {
        process.waitFor();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

总结

这样就可以实现批量的传输功能啦~~

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值