近来应需求需要,做了服务器之间的文件传输,利用的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服务器下载文件和文件夹...相关推荐

  1. 设计一个程序,要求新建一个名为“hello”的文件并利用write函数向其写入“linux下的c软件设计”。

    问题描述 设计一个程序,要求新建一个名为"hello"的文件并利用write函数向其写入"linux下的c软件设计". 大致思路 首先,新建文件使用到函数fop ...

  2. linux系统局域网传输,利用ssh在linux系统之间在局域网内传输文件

    利用ssh传输文件 在linux下一般用scp这个命令来通过ssh传输文件.而如果你的工作环境是windows的话,那么可以选择用 secure CRT,或者putty 这样的ssh登录工具来进行传输 ...

  3. Linux SCP 命令: 利用SSH传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本 ...

  4. linux ssh 推送文件_利用ssh传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本 ...

  5. 黑客利用SSH弱密码攻击控制Linux服务器,潜在目标约十万IP天

    一.概述 本周腾讯安全服务中心接到客户求助,客户部署的腾讯御界高级威胁检测系统发现SSH服务失陷感知信息,该公司安全管理人员及时联络腾讯安全专家协助分析威胁来源. 腾讯安全工程师在征得客户同意后对客户 ...

  6. Linux操作系统下如何利用SSH进行远程控制

    网络被攻击,很多情况是由于服务器提供了Telnet服务引起的.的确,对于UNIX系统,如果要远程管理它,必定要使用远程终端,而要使用远程终端,自然要在服务器上启动Telnet服务.但是Telnet服务 ...

  7. ssh 隧道 mysql_利用SSH隧道方式连接远程MySQL服务器

    1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如 此,SSH还有另一项非常有用的功能,就是它的 ...

  8. ssh隧道远程mysql_利用SSH隧道方式连接远程MySQL服务器

    1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如 此,SSH还有另一项非常有用的功能,就是它的 ...

  9. ssh 隧道 mysql_利用SSH隧道方式连接远程MySQL

    1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如此,SSH还有另一项非常有用的功能,就是它的端 ...

最新文章

  1. 分享ShareSDK
  2. Python 多进程、协程异步抓取英雄联盟皮肤并保存在本地
  3. [9-1]磁盘基本知识、分区基本概念
  4. Java 理论与实践: 垃圾收集简史
  5. 强大的DataGrid组件[1]【转】
  6. 解决Win10不能访问共享文件夹的问题
  7. Android NDK学习笔记4:JNI访问Java构造函数
  8. 检索数据_17_按照指定的次序返回查询结果
  9. Android菜鸟的成长笔记(13)——异步任务(Async Task)
  10. Aeroplane chess HDU - 4405(期望dp)
  11. requestmapping里面的参数_golang web开发——参数绑定(上)之用Go实现简单的Trie
  12. MongoDB学习之在Linux下安装MongoDB
  13. 来点干货 | Android 常见内存泄漏与优化(二)
  14. 20200301:快乐数(leetcode202)
  15. 《『若水新闻』客户端开发教程》——12.代码编写(4)
  16. 16 计划稳定性与控制
  17. 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句...
  18. android应用程序在哪找,找不到应用程序的错误android
  19. CANCELLED: io.grpc.Context was canclled without error
  20. 计算机专业的梦想作文,我的梦想作文300字(通用15篇)

热门文章

  1. Apache Log4j漏洞学习笔记
  2. xctf攻防世界 CRYPTO高手进阶区 sherlock
  3. 【ML】评估一个分类器:精确率和召回率(Evaluation of Classifier)
  4. 国庆期间每类视频点赞量和转发量
  5. 重磅!继“智能+”120页PPT,阿里+毕马威发布4份智能经济报告(附免费下载)
  6. 考研英语二-阅读解题技巧:
  7. oracle函数lad,Support | Oracle and MICROS Systems | Oracle 中国
  8. 差分隐私理论入门科普
  9. 【案例6】NC安装部署常见问题
  10. 华为高级产品经理徐洪:高级产品经理的必经之路