仅提供代码作为参考,
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.shonetown.common.util.log.EventLog;
/**
* In order for SSH2 tunneling to function correctly one must ensure that the
* following line is uncommented in /etc/ssh/sshd_config :
* --------------------------CUT-------------------------------
* # Change to yes to enable tunnelled clear text passwords
* PasswordAuthentication yes
* --------------------------CUT-------------------------------
* Otherwise the initiation of the tunnel will fail with
* "SSH Initialization failed, try again?
* com.jcraft.jsch.JSchException: Auth fail"
* @author aimer.xu
*
*/
public class SftpHelper extends Thread {
private static EventLog log = new EventLog(SftpHelper.class);
private String host;
private String username;
private String password;
private String location;
private int port;
private String knowHosts;
private String osName;
private List<String> filenames = new ArrayList<String>();
public SftpHelper(String host, String username, String password, int port) {
this(host, username, password, port, "");
}
public SftpHelper(String host, String username, String password, int port, String location) {
this.host = host;
this.username = username;
this.password = password;
this.port = port;
osName = System.getProperty("os.name");
if (osName.toUpperCase().indexOf("WINDOWS") > -1) {
this.knowHosts = "c:\\known_hosts";
if(location == null || location.length() == 0){
this.location = "c:\\";
}
} else {
this.knowHosts = "/root/.ssh/known_hosts";
if(location == null || location.length() == 0){
this.location = "/";
}
}
this.location = location;
}
public void addFilename(String filename){
filenames.add(filename);
}
public void setFilenames(List<String> filenames){
this.filenames = filenames;
}
public void run(){
upload();
}
/**
* 要上传的文件必须包含完整的路径
*
*/
public boolean upload(){
if(filenames.size() == 0)
return false;
Session session;
Channel channel;
JSch jsch = new JSch();
try {
jsch.setKnownHosts(knowHosts);
session = jsch.getSession(username, host, port);
session.setPassword(password);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
ChannelSftp c = (ChannelSftp)channel;
c.cd(location);
InputStream in = null;
OutputStream out = null;
for(int i=0; i<filenames.size(); i++){
String filename = filenames.get(i);
if(filename == null || "".equals(filename)){
log.Debug("", "当前没有要上传的文件!");
continue;
}
int idx= filename.lastIndexOf(File.separator);
String uploadname = filename.substring(idx==-1?0:idx+1);
out = c.put(uploadname);
log.Debug("", "sleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeep "+5000+"ms!");
sleep(5000);
in = new FileInputStream(filename);
// String suffix = filename.substring(filename.lastIndexOf(".")+1);
// if("gz".equals(suffix)){
// in = new GZIPInputStream(in);
// }
byte [] b = new byte[1024];
int n;
while ((n = in.read(b)) != -1) {
out.write(b);
}
}
out.flush();
out.close();
in.close();
c.disconnect();
session.disconnect();
sleep(500);
return true;
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch(InterruptedException e){
e.printStackTrace();
}
return false;
}
public static void main(String[] args){
String username = "root";
String host = "*.*.*.*";
int port = 22;
String password = "******";
String path = "/home/data/download/";
SftpHelper helper = new SftpHelper(host, username,password, port,path);
helper.addFilename("c:\\bcp.sql");
helper.addFilename("c:\\a.sql");
// helper.upload("c:\\bcp.sql");
helper.start();
}
}
请注意类的注释部分,known_hosts文件的内容如下:
202.7.3.190 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA6tHmMBQwcSieFneaObnDyzthMSn1FyWFp/TCMV4rt+ZEtOZo49GK0kdM3tYy1IQD8hZz016JG5uOIbrBN+O0BtzY89y3uIwo0hsYQtP/LKAR5BU+pT3R20ltVbcEGzrSpKiSClObD9MbiOt0899Du9bG89/BiMvxUxj/Rhg33l0=
写道
附:产生此文件的简单方法:可以在Linux中用ssh命令登录一次,这样便在/root/.ssh(假如使用root用户登录到Linux)目录下生成known_hosts文件。
这片文章也许对你更有帮助:http://www.blogjava.net/fastzch/archive/2008/07/08/213477.html
分享到:
相关推荐
JSCH(Java Secure Channel)是一个用Java实现的SSH2库,能够支持SFTP功能,包括文件的上传和下载。本篇文章将详细讲解如何利用JSCH库实现在Java程序中进行SFTP文件的上传与下载。 首先,我们需要在项目中引入JSCH...
JSch - Java实现的SFTP(文件上传详解篇)
在"利用JSCH实现文件传输"这一部分,你需要理解SSH协议的基础知识,包括身份验证、加密和会话管理。JSCH提供了API来创建连接、打开通道、执行SFTP操作等。例如,你可以创建一个`JSch`实例,设置用户信息,然后建立到...
使用 JSCH 中的 ChannelSftp 上传文件和文件夹 JSCH(Java Secure Channel)是一款自由和开源的 Java 库,提供了安全的通信通道,包括 SSH、SFTP、SCP 等协议。 ChannelSftp 是 JSCH 中的一个实现 SFTP 协议的 ...
"使用JSch中的ChannelSftp上传文件和文件夹" 在Java开发中,上传文件和文件夹是一项常见的任务,例如在服务器上上传文件或文件夹。JSch库提供了一个名为ChannelSftp的类,可以用来上传文件和文件夹。本文将详细介绍...
例如,put()用于文件上传,get()用于文件下载,cd()用于进入指定目录,ls()用于获取指定目录下的文件列表,rename()用于重命名文件等。利用这些方法,我们可以很方便地对远程服务器上的文件进行操作。 为了安全起见...
使用JSch库中的ChannelSftp可以实现文件和文件夹的上传功能。下面将详细介绍如何使用ChannelSftp实现文件和文件夹的上传。 ChannelSftp概述 ChannelSftp是JSch库中的一种Channel类型,用于实现SFTP(Secure File ...
使用SFTP通道进行文件上传或下载: ```java // 上传文件 File localFile = new File("local_path"); sftpChannel.cd("remote_directory"); // 进入远程目录 sftpChannel.put(localFile.getAbsolutePath(), local...
4. **文件上传**:在SFTP通道上,可以获取`ChannelSftp`对象,然后调用它的`put()`方法来上传本地文件到远程服务器。需要指定源文件路径和目标文件路径。 5. **文件下载**:类似地,使用`ChannelSftp.get()`方法...
Java使用JSCH库实现SFTP文件管理是一种常见的远程文件传输方式,特别适用于需要与服务器进行交互,例如上传、下载文件的场景。JSCH(Java Secure Channel)是一个纯Java实现的SSH2库,允许用户通过SSH协议连接到远程...
在这个主题中,我们将深入探讨如何使用JSCH库来实现FTP的文件上传、下载和删除功能。 JSCH是一个纯Java实现的SSH2库,它允许Java程序执行SCP(Secure Copy)、SFTP(Secure File Transfer Protocol)和FTP通过SSH...
感谢你的下载,文件说明如下: *jsch的源文件 *jsch的依赖包 *用jsch源文件及依赖包构建的项目,便于修改其源码* 修改源码后重新导出的jar包 *我写的一段小程序,实现的主要功能是同步sftp上的文件夹(sftp->本地) ...
**文件上传**: 在SFTP通道建立后,我们可以使用`ChannelSftp.put()`方法上传文件到远程服务器。这个方法接受源文件路径和目标远程路径作为参数: ```java File localFile = new File("/local/path/to/file.txt"); ...
Java使用JSCH(Java Secure Channel)库连接远程服务器是一个常见的任务,特别是在自动化运维、文件传输或者执行远程命令等场景中。JSCH是一个纯Java实现的SSH2库,它提供了连接到支持SSH协议的服务器的能力,如...
在实现文件上传和下载功能时,JSch的`ChannelSftp`类非常有用。通过创建`ChannelSftp`实例,我们可以打开一个SFTP通道,然后调用`cd`、`put`、`get`等方法来改变目录、上传文件和下载文件。这些操作都支持文件和目录...
4. **执行操作**:通过已创建的通道,可以执行远程命令、上传/下载文件,或者实现本地到远程、远程到本地、本地到本地的端口转发。 在实际应用中,使用jsch库进行SSH连接的一般步骤如下: 1. 加载jsch库,并实例化...
要使用JSch实现SFTP,你需要遵循以下步骤: 1. **导入JSch库**:在项目中添加jsch-0.1.42.jar依赖。 2. **创建Session**:使用`JSch`类的`getSession()`方法,传入用户名、主机名、端口号和密码(或私钥)。 3. *...