java技术用ssh从linux服务器下载数据
通常需要从linux服务器获取数据文件,而通常能有的访问方式只有ssh,所以就可以用ssh进行数据下载。
java连接远程主机的方式有多种,这里和大家分享的是通过ssh方式连接远程主机,使用的是jsch这个jar包,资源在这里。
package com.app.pt.backup.util; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Vector; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import com.app.common.util.FileUtil;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException; /**
* SFTP帮助类
* @author wangbailin
*
*/
public class SFTPUtil { private static Log log = LogFactory.getLog(SFTPUtil.class); /**
* 连接sftp服务器
* @param host 远程主机ip地址
* @param port sftp连接端口,null 时为默认端口
* @param user 用户名
* @param password 密码
* @return
* @throws JSchException
*/
public static Session connect(String host, Integer port, String user, String password) throws JSchException{
Session session = null;
try {
JSch jsch = new JSch();
if(port != null){
session = jsch.getSession(user, host, port.intValue());
}else{
session = jsch.getSession(user, host);
}
session.setPassword(password);
//设置第一次登陆的时候提示,可选值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
//30秒连接超时
session.connect(30000);
} catch (JSchException e) {
e.printStackTrace();
System.out.println("SFTPUitl 获取连接发生错误");
throw e;
}
return session;
} /**
* sftp上传文件(夹)
* @param directory
* @param uploadFile
* @param sftp
* @throws Exception
*/
public static void upload(String directory, String uploadFile, ChannelSftp sftp) throws Exception{
System.out.println("sftp upload file [directory] : "+directory);
System.out.println("sftp upload file [uploadFile] : "+ uploadFile);
File file = new File(uploadFile);
if(file.exists()){
//这里有点投机取巧,因为ChannelSftp无法去判读远程linux主机的文件路径,无奈之举
try {
Vector content = sftp.ls(directory);
if(content == null){
sftp.mkdir(directory);
}
} catch (SftpException e) {
sftp.mkdir(directory);
}
//进入目标路径
sftp.cd(directory);
if(file.isFile()){
InputStream ins = new FileInputStream(file);
//中文名称的
sftp.put(ins, new String(file.getName().getBytes(),"UTF-8"));
//sftp.setFilenameEncoding("UTF-8");
}else{
File[] files = file.listFiles();
for (File file2 : files) {
String dir = file2.getAbsolutePath();
if(file2.isDirectory()){
String str = dir.substring(dir.lastIndexOf(file2.separator));
directory = FileUtil.normalize(directory + str);
}
upload(directory,dir,sftp);
}
}
}
} /**
* sftp下载文件(夹)
* @param directory 下载文件上级目录
* @param srcFile 下载文件完全路径
* @param saveFile 保存文件路径
* @param sftp ChannelSftp
* @throws UnsupportedEncodingException
*/
public static void download(String directory,String srcFile, String saveFile, ChannelSftp sftp) throws UnsupportedEncodingException {
Vector conts = null;
try{
conts = sftp.ls(srcFile);
} catch (SftpException e) {
e.printStackTrace();
log.debug("ChannelSftp sftp罗列文件发生错误",e);
}
File file = new File(saveFile);
if(!file.exists()) file.mkdir();
//文件
if(srcFile.indexOf(".") > -1){
try {
sftp.get(srcFile, saveFile);
} catch (SftpException e) {
e.printStackTrace();
log.debug("ChannelSftp sftp下载文件发生错误",e);
}
}else{
//文件夹(路径)
for (Iterator iterator = conts.iterator(); iterator.hasNext();) {
LsEntry obj = (LsEntry) iterator.next();
String filename = new String(obj.getFilename().getBytes(),"UTF-8");
if(!(filename.indexOf(".") > -1)){
directory = FileUtil.normalize(directory + System.getProperty("file.separator") + filename);
srcFile = directory;
saveFile = FileUtil.normalize(saveFile + System.getProperty("file.separator") + filename);
}else{
//扫描到文件名为".."这样的直接跳过
String[] arrs = filename.split("\\.");
if((arrs.length > 0) && (arrs[0].length() > 0)){
srcFile = FileUtil.normalize(directory + System.getProperty("file.separator") + filename);
}else{
continue;
}
}
download(directory, srcFile, saveFile, sftp);
}
}
}
}
调用方法:
ChannelSftp sftp = null;
Session session = null;
try {
session = SFTPUtil.connect(host, port, username, password);
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
SFTPUtil.upload(destDir, srcfile.getAbsolutePath(), sftp);
} catch (Exception e) {
e.printStackTrace();
logger.debug(e);
return UtilMisc.toMap("flag","failure","msg","备份文件到远程主机发生错误");
}finally{
if(sftp != null)sftp.disconnect();
if(session != null)session.disconnect();
}
原文博客地址:http://blog.csdn.net/wangbailin2009/article/details/20232999#L51
java技术用ssh从linux服务器下载数据的更多相关文章
- 使用Java管理千台规模Linux服务器_入门
http://www.oschina.net/code/snippet_222919_11734 代码分享 当前位置: 代码分享 » Java » 网络编程 搜 索 [饶过] 使用Java管理千 ...
- 从Linux服务器下载文件到本地命令
从Linux服务器下载文件夹到本地1.使用scp命令 scp /home/work/source.txt work@192.168.0.10:/home/work/ #把本地的source.txt文件 ...
- Python ssh连接Linux服务器报Incompatible ssh peer (no acceptable kex algorithm) 解决方法
python通过ssh连接linux服务器,部分服务器出现如下异常 03:50:48.725 FAIL ftp operation failed, Incompatible ssh peer (no ...
- 从Linux服务器下载文件夹到本地
从Linux服务器下载文件夹到本地 1.使用scp命令 scp /home/work/source.txt work@192.168.0.10:/home/work/ #把本地的source.txt文 ...
- ssh连接linux服务器只显示-bash-4.1#不显示路径解决方法
ssh连接linux服务器只显示-bash-4.1#不显示路径时,我们只需要修改 ~/.bash_profile文件,如果不存在这个文件,那么新建一个,增加内容 export PS1='[\u@\ ...
- Python 实现批量从不同的Linux服务器下载文件
基于Python实现批量从不同的Linux服务器下载文件 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/file_for_downl ...
- Java Web实现使用浏览器从服务器下载文件(后台)
Java Web实现 使用浏览器从服务器下载文件. 下面实现两种情况的下载,需求如下: 需求(一):1.用户在页面填写表单. 2.填写完成后,选择下载,将表单内容发往后台. 3.后台根据内容生产一个文 ...
- 【工具大道】ssh登录Linux服务器,并显示图形化界面
本文地址 点击关注微信公众号 "程序员的文娱情怀" 分享提纲: 1. 概述 2. mac版实现ssh登录,显示图形化 1. 概述 平时ssh登录到Linux服务器都是在命令行下进行 ...
- 从Linux服务器下载上传文件
首先要确定好哪两种的连接:Linux常用的有centors和unbantu两种版本,PC端Mac和Windows 如果在两个Linux之间传输,或Linux和Mac之间传输可以使用scp命令,类似于s ...
随机推荐
- 微信公众平台开发(99) 自定义菜单获取OpenID
关键字 微信公众平台 自定义菜单 OpenID作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇微信 ...
- Android 关于ListView中adapter调用notifyDataSetChanged无效的原因
话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用adapter的notifyDataSetChanged就会更新列表,最近在做微博帐号管理这一块,想着动态更新列表,数据是变了,但 ...
- 经过各种坑之后centos+ uwsgi + nginx +django 终于配好了
https://pypi.python.org/pypi/setuptools#downloads https://www.python.org/ftp/python/ 开机 加入 uwsgi ngi ...
- [算法]Comparison of the different algorithms for Polygon Boolean operations
Comparison of the different algorithms for Polygon Boolean operations. Michael Leonov 1998 http://w ...
- 安装和删除 Alcatraz 插件
在终端下输入如下命令来安装Alcatraz: curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install. ...
- iphone尺寸设计
http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions http://daily.zhihu.com/story/4 ...
- RDIFramework.NET — 基于.NET的快速信息化系统开发框架 - 5.3 数据库连接管理模块
RDIFramework.NET — 基于.NET的快速信息化系统开发框架 5.3 数据库连接管理模块 5.3 数据库连接管理模块 我们经常可以看到很多软件直接把数据库连接字符串放在软件执行目录下的配 ...
- weblogic对jms实现的QueueConnection实现与TopicConnection实现问题
今天看了一段之前同事写jms的代码,觉得好像不对,但是不可能,生产上用的代码.刚开始想了下,脑子没转过弯来,后来一想是个简单的问题 代码如下: topicConnection = (TopicConn ...
- Java基础之创建窗口——使用边界布局管理器(TryBorderLayout)
控制台程序. 边界布局管理器最多能在容器中放置5个组件.在这种布局管理器中,可以把组件放在容器的任意一个边界上,也可以把组件放在容器的中心.每个位置只能放置一个组件.如果把组件放置在已被占用的边界上, ...
- java collections读书笔记(11) Lists
继续这个系列,好久没学习了,懒惰呀. Set接口,实际上是collection 类别中最简单的一个接口,因为它并没有比Collection 接口增加任何的内容,相对而言,大家可能更喜欢List接口和它 ...