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();
}
}
总结
这样就可以实现批量的传输功能啦~~