Jsch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。
1. 根据远程主机的IP地址,用户名和端口,建立会话(Session);
2. 设置用户信息(包括密码和Userinfo),然后连接session;
getSession()只是创建一个session,需要设置必要的认证信息之后,调用connect()才能建立连接。
3. 在session上建立指定类型的通道(Channel);
4. 设置channel上需要远程执行的Shell脚本,连接channel,就可以远程执行该Shell脚本;
调用openChannel(String type) 可以在session上打开指定类型的channel。该channel只是被初始化,使用前需要先调用 connect()进行连接。
5. 可以读取远程执行Shell脚本的输出,然后依次断开channel和session的连接;
1)shell - ChannelShell
2)exec - ChannelExec
3)direct-tcpip - ChannelDirectTCPIP
4)sftp - ChannelSftp
5)subsystem - ChannelSubsystem
相关依赖:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
SFTPClient.Java
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
public class SFTPClient {
private static final Logger LOGGER = LoggerFactory.getLogger(SFTPClient.class);
private String host;
private int port;
private String username;
private String password;
private static int SESSION_TIMEOUT = 30000;
private static int CHANNEL_TIMEOUT = 3000;
private ChannelSftp sftp;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public SFTPClient() {}
public SFTPClient(String host, int port, String username, String password) {
this.host = host;
this.port = port;
this.username = username;
this.password = password;
}
/**
* 连接sftp服务器
* @param host 主机
* @param port 端口
* @param username 用户名
* @param password 密码
*/
public boolean connect(String host, int port, String username, String password) {
try {
JSch jsch = new JSch();
Session sshSession = jsch.getSession(username, host, port);
sshSession.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no"); // 跳过检测
sshSession.setConfig(sshConfig);
sshSession.connect();
//sshSession.connetc(SESSION_TIMEOUT);
LOGGER.info("SFTPClient SFTP Session connected.");
Channel channel = sshSession.openChannel("sftp");
channel.connect();
//channel.connect(CHANNEL_TIMEOUT);
this.sftp = (ChannelSftp) channel;
LOGGER.info("SFTPClient Connected to " + host);
return true;
} catch (Exception e) {
LOGGER.error("SFTPClient Connect failed, {}", e.getMessage());
return false;
}
}
/**
* 上传文件
* @param directory 上传的目录
* @param fileName 上传的文件名
* @param uploadFile 要上传的文件
*/
public boolean upload(String directory, String fileName, File uploadFile) {
try {
sftp.cd(directory);
FileInputStream fileInputStream = new FileInputStream(uploadFile);
sftp.put(fileInputStream, fileName);
fileInputStream.close();
return true;
} catch (Exception e) {
LOGGER.error("SFTPClient upload file failed, {}", e.getMessage(), e);
return false;
}
}
/**
* 下载文件
* @param directory 下载目录
* @param fileName 下载的文件名
* @param saveFile 存在本地的路径
*/
public File download(String directory, String fileName, String saveFile) {
try {
sftp.cd(directory);
File file = new File(saveFile);
if (file.exists()) {
file.delete();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
sftp.get(fileName, fileOutputStream);
fileOutputStream.close();
return file;
} catch (Exception e) {
LOGGER.error("SFTPClient download file failed, {}", e.getMessage(), e);
return null;
}
}
/**
* 断开连接
*/
public void disconnect() {
try {
sftp.getSession().disconnect();
} catch (JSchException e) {
LOGGER.error("SFTPClient disconnect error, {}", e.getMessage(), e);
}
sftp.quit();
sftp.disconnect();
}
}