cmd下载远程linux的文件,Java利用ssh协议实现从远程Linux服务器下载文件和文件夹...
近来应需求需要,做了服务器之间的文件传输,利用的ssh协议。查阅各种资料博客,基本都是下载文件的方法,找不到下载文件夹得方法。思索多日写了一个下载文件夹的简单方法,可能步骤繁琐,优化不大好。由于jsch不能得到服务器端文件的绝对路径,目前还没能想出怎么遍历下载文件夹和文件。只好利用ssh2 jar包的session方法操作Linux命令实现下载。话不多说,直接上代码。
一:导入的jar包,jar包在Apache可以自己下载
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ResourceBundle;
import java.util.zip.GZIPInputStream;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
二:类和方法
/**
*
* @param dataServerIp 服务器IP
* @param dataServerUsername 服务器用户名
* @param dataServerPassword 服务器登录密码
* @param srcFile 要下载的文件路径
* @param saveFile 保存路径
* @param port 端口号,null时为默认端口
*/
public static void downLoadFile(String dataServerIp,String dataServerUsername,String dataServerPassword,String srcFile,String saveFile,int port){
Connection conn = new Connection(dataServerIp);
Session session = null;
SCPClient client =null;
//session=(Session) getObject(dataServerIp, dataServerUsername, dataServerPassword, 0, "session");
//client=(SCPClient) getObject(dataServerIp, dataServerUsername, dataServerPassword, 0, "client");
conn=getConn(dataServerIp, dataServerUsername, dataServerPassword, 22);
try {
session=conn.openSession();
client=conn.createSCPClient();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
boolean flag=download(srcFile, saveFile, session, client);
//如果是打包文件,删除包裹
if (flag) {
System.out.println("文件打包下载完成!");
//解压tar.gz包
String fileName=srcFile.substring(srcFile.lastIndexOf("/")+1);
File file=new File(saveFile+"/"+fileName+".tar.gz");
unTarGz(file, saveFile);
System.out.println("文件解压完成!");
//解压完后删除本地压缩包
file.delete();
String cmdDel="rm -rf "+srcFile+".tar.gz";
session=(Session) getObject(dataServerIp, dataServerUsername, dataServerPassword, 0, "session");
//删除服务器生成的压缩包
session.execCommand(cmdDel);
}else {
System.out.println("文件下载完成!");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
session.close();
conn.close();
}
}
/**
* 根据不同的需求得到相应的连接
* @param ip
* @param userName
* @param pwd
* @param port
* @param whatWant 必须是client或者session
* @return
*/
public static Object getObject(String ip,String userName,String pwd,int port,String whatWant){
Connection conn = new Connection(ip);
Session session = null;
SCPClient client =null;
try {
conn.connect();
boolean isAuthenticated = conn.authenticateWithPassword(userName, pwd);
session=conn.openSession();
client = new SCPClient(conn);
if (isAuthenticated == false) {
throw new IOException("Authentication failed.文件scp到数据服务器时发生异常");
}
} catch (IOException e) {
e.printStackTrace();
}
if (whatWant!=null&&whatWant.equals("session")) {
return session;
}if (whatWant!=null&&whatWant.equals("client")) {
return client;
}
return null;
}
/**
* 获得连接
* @param ip
* @param userName
* @param pwd
* @param port
* @return
*/
public static Connection getConn(String ip,String userName,String pwd,int port){
Connection conn = new Connection(ip);
boolean blag=false;
try {
conn.connect();
boolean isAuthenticated = conn.authenticateWithPassword(userName, pwd);
//session=conn.openSession();
// client = new SCPClient(conn);
if (isAuthenticated) {
blag=true;
}
if (isAuthenticated == false) {
throw new IOException("Authentication failed.文件scp到数据服务器时发生异常");
}
} catch (IOException e) {
e.printStackTrace();
}
if (blag) {
return conn;
}else {
return null;
}
}
/**
*
* @param srcFile 要下载的文件
* @param saveFile 保存目录,必须是目录
* @param sessionSsh
* @param client
* @return
* @throws UnsupportedEncodingException
*/
public static boolean download(String srcFile, String saveFile, Session sessionSsh, SCPClient client
) throws UnsupportedEncodingException {
//String cdmTar="tar czf /var/ftp/upload/ruku/ruku.tar.gz –directory=/var/ftp/upload/ruku ruku";
boolean flag=false;
// 是文件,直接下载
try {
String filename=srcFile.substring(srcFile.lastIndexOf("/")+1);
if (filename.contains(".")) {
try {
client.get(srcFile, saveFile);
} catch (Exception e) {
//是文件夹,打包下载
String src=srcFile.substring(0, srcFile.lastIndexOf("/"));
String cmdGet = "tar -zcvf " + srcFile + ".tar.gz " + filename;
//String cmdGet="tar czf /home/"+filename+".tar.gz –directory="+src+"/"+filename+".";
// 执行压缩命令
sessionSsh.execCommand("cd "+src+";"+cmdGet);
InputStream stdout = new StreamGobbler(sessionSsh.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
// cmriots!@#
while (true) {
String line = br.readLine();
if (line == null)
break;
System.out.println(line);
}
System.out.println("ExitCode: " + sessionSsh.getExitStatus());
// 下载文件
client.get(src+"/"+filename+".tar.gz", saveFile);
flag=true;
e.printStackTrace();
}
}else {
//是文件夹,打包下载
String src=srcFile.substring(0, srcFile.lastIndexOf("/"));
String cmdGet = "tar -zcvf " + srcFile + ".tar.gz " + filename;
//String cmdGet="tar czf /home/"+filename+".tar.gz –directory="+src+"/"+filename+".";
// 执行压缩命令
sessionSsh.execCommand("cd "+src+";"+cmdGet);
InputStream stdout = new StreamGobbler(sessionSsh.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
// cmriots!@#
while (true) {
String line = br.readLine();
if (line == null)
break;
System.out.println(line);
}
System.out.println("ExitCode: " + sessionSsh.getExitStatus());
// 下载文件
client.get(src+"/"+filename+".tar.gz", saveFile);
//unGzipFile(saveFile+"/"+filename+".tar.gz");
flag=true;
}
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
//------------------------------------------------------------------------------------------------------
/**
* 解压tar.gz 文件
* @param file 要解压的tar.gz文件对象
* @param outputDir 要解压到某个指定的目录下
* @throws IOException
*/
public static void unTarGz(File file,String outputDir) throws IOException{
TarInputStream tarIn = null;
try{
tarIn = new TarInputStream(new GZIPInputStream(
new BufferedInputStream(new FileInputStream(file))),
1024 * 2);
createDirectory(outputDir,null);//创建输出目录
TarEntry entry = null;
while( (entry = tarIn.getNextEntry()) != null ){
if(entry.isDirectory()){//是目录
entry.getName();
createDirectory(outputDir,entry.getName());//创建空目录
}else{//是文件
File tmpFile = new File(outputDir + "/" + entry.getName());
createDirectory(tmpFile.getParent() + "/",null);//创建输出目录
OutputStream out = null;
try{
out = new FileOutputStream(tmpFile);
int length = 0;
byte[] b = new byte[2048];
while((length = tarIn.read(b)) != -1){
out.write(b, 0, length);
}
}catch(IOException ex){
throw ex;
}finally{
if(out!=null)
out.close();
}
}
}
}catch(IOException ex){
throw new IOException("解压归档文件出现异常",ex);
} finally{
try{
if(tarIn != null){
tarIn.close();
}
}catch(IOException ex){
throw new IOException("关闭tarFile出现异常",ex);
}
}
}
/**
* 构建目录
* @param outputDir
* @param subDir
*/
public static void createDirectory(String outputDir,String subDir){
File file = new File(outputDir);
if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空
file = new File(outputDir + "/" + subDir);
}
if(!file.exists()){
if(!file.getParentFile().exists())
file.getParentFile().mkdirs();
file.mkdirs();
}
}楼主亲测可用,建类复制方法即可。
cmd下载远程linux的文件,Java利用ssh协议实现从远程Linux服务器下载文件和文件夹...相关推荐
- 设计一个程序,要求新建一个名为“hello”的文件并利用write函数向其写入“linux下的c软件设计”。
问题描述 设计一个程序,要求新建一个名为"hello"的文件并利用write函数向其写入"linux下的c软件设计". 大致思路 首先,新建文件使用到函数fop ...
- linux系统局域网传输,利用ssh在linux系统之间在局域网内传输文件
利用ssh传输文件 在linux下一般用scp这个命令来通过ssh传输文件.而如果你的工作环境是windows的话,那么可以选择用 secure CRT,或者putty 这样的ssh登录工具来进行传输 ...
- Linux SCP 命令: 利用SSH传输文件
在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本 ...
- linux ssh 推送文件_利用ssh传输文件
在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本 ...
- 黑客利用SSH弱密码攻击控制Linux服务器,潜在目标约十万IP天
一.概述 本周腾讯安全服务中心接到客户求助,客户部署的腾讯御界高级威胁检测系统发现SSH服务失陷感知信息,该公司安全管理人员及时联络腾讯安全专家协助分析威胁来源. 腾讯安全工程师在征得客户同意后对客户 ...
- Linux操作系统下如何利用SSH进行远程控制
网络被攻击,很多情况是由于服务器提供了Telnet服务引起的.的确,对于UNIX系统,如果要远程管理它,必定要使用远程终端,而要使用远程终端,自然要在服务器上启动Telnet服务.但是Telnet服务 ...
- ssh 隧道 mysql_利用SSH隧道方式连接远程MySQL服务器
1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如 此,SSH还有另一项非常有用的功能,就是它的 ...
- ssh隧道远程mysql_利用SSH隧道方式连接远程MySQL服务器
1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如 此,SSH还有另一项非常有用的功能,就是它的 ...
- ssh 隧道 mysql_利用SSH隧道方式连接远程MySQL
1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如此,SSH还有另一项非常有用的功能,就是它的端 ...
最新文章
- 分享ShareSDK
- Python 多进程、协程异步抓取英雄联盟皮肤并保存在本地
- [9-1]磁盘基本知识、分区基本概念
- Java 理论与实践: 垃圾收集简史
- 强大的DataGrid组件[1]【转】
- 解决Win10不能访问共享文件夹的问题
- Android NDK学习笔记4:JNI访问Java构造函数
- 检索数据_17_按照指定的次序返回查询结果
- Android菜鸟的成长笔记(13)——异步任务(Async Task)
- Aeroplane chess HDU - 4405(期望dp)
- requestmapping里面的参数_golang web开发——参数绑定(上)之用Go实现简单的Trie
- MongoDB学习之在Linux下安装MongoDB
- 来点干货 | Android 常见内存泄漏与优化(二)
- 20200301:快乐数(leetcode202)
- 《『若水新闻』客户端开发教程》——12.代码编写(4)
- 16 计划稳定性与控制
- 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句...
- android应用程序在哪找,找不到应用程序的错误android
- CANCELLED: io.grpc.Context was canclled without error
- 计算机专业的梦想作文,我的梦想作文300字(通用15篇)
热门文章
- Apache Log4j漏洞学习笔记
- xctf攻防世界 CRYPTO高手进阶区 sherlock
- 【ML】评估一个分类器:精确率和召回率(Evaluation of Classifier)
- 国庆期间每类视频点赞量和转发量
- 重磅!继“智能+”120页PPT,阿里+毕马威发布4份智能经济报告(附免费下载)
- 考研英语二-阅读解题技巧:
- oracle函数lad,Support | Oracle and MICROS Systems | Oracle 中国
- 差分隐私理论入门科普
- 【案例6】NC安装部署常见问题
- 华为高级产品经理徐洪:高级产品经理的必经之路