Apache SSHD实现SFTP服务端,客户端访问进行远程文件上传下载
package jsch;
import javaioFile;
import javaioFileInputStream;
import javautilProperties;
import comjcraftjschChannel;
import comjcraftjschChannelSftp;
import comjcraftjschJSch;
import comjcraftjschJSchException;
import comjcraftjschSession;
public class Test {
protected String host;//sftp服务器ip
protected String username;//用户名
protected String password;//密码
protected String privateKey;//密钥文件路径
protected String passphrase;//密钥口令
protected int port = 22;//默认的sftp端口号是22
/
获取连接
@return channel
/
public ChannelSftp connectSFTP() {
JSch jsch = new JSch();
Channel channel = null;
try {
if (privateKey != null && !""equals(privateKey)) {
//使用密钥验证方式,密钥可以使有口令的密钥,也可以是没有口令的密钥
if (passphrase != null && ""equals(passphrase)) {
jschaddIdentity(privateKey, passphrase);
} else {
jschaddIdentity(privateKey);
}
}
Session session = jschgetSession(username, host, port);
if (password != null && !""equals(password)) {
sessionsetPassword(password);
}
Properties sshConfig = new Properties();
sshConfigput("StrictHostKeyChecking", "no");// do not verify host key
sessionsetConfig(sshConfig);
// sessionsetTimeout(timeout);
sessionsetServerAliveInterval(92000);
sessionconnect();
//参数sftp指明要打开的连接是sftp连接
channel = sessionopenChannel("sftp");
channelconnect();
} catch (JSchException e) {
eprintStackTrace();
}
return (ChannelSftp) channel;
}
/
上传文件
@param directory
上传的目录
@param uploadFile
要上传的文件
@param sftp
/
public void upload(String directory, String uploadFile, ChannelSftp sftp) {
try {
sftpcd(directory);
File file = new File(uploadFile);
sftpput(new FileInputStream(file), filegetName());
} catch (Exception e) {
eprintStackTrace();
}
}
/
下载文件
@param directory
下载目录
@param downloadFile
下载的文件
@param saveFile
存在本地的路径
@param sftp
/
public void download(String directory, String downloadFile,
String saveFile, ChannelSftp sftp) {
try {
sftpcd(directory);
sftpget(downloadFile,saveFile);
} catch (Exception e) {
eprintStackTrace();
}
}
/
删除文件
@param directory
要删除文件所在目录
@param deleteFile
要删除的文件
@param sftp
/
public void delete(String directory, String deleteFile, ChannelSftp sftp) {
try {
sftpcd(directory);
sftprm(deleteFile);
} catch (Exception e) {
eprintStackTrace();
}
}
public void disconnected(ChannelSftp sftp){
if (sftp != null) {
try {
sftpgetSession()disconnect();
} catch (JSchException e) {
eprintStackTrace();
}
sftpdisconnect();
}
}
}
使用sftp功能需要在ssh的配置文件/etc/ssh/sshd_config中添加如下配置文本,以SLES 103为例:
Subsystem sftp /usr/lib64/ssh/sftp-server
然后service ssh restart重启ssh就OK了
以下是简单的命令:
01 sftp username@host ip
02 #登陆sftp服务器
03 ls
04 #列出远程服务器上当前目录下的文件
05 cd dir
06 #进入远程服务器上面的dir目录
07 lcd dir
08 #进入本地dir目录
09 quit
10 #退出sftp
11 get file
12 #从服务器上面下载文件到本地当前目录
13 put file
14 #将本地当前目录下的某个文件上传到服务器上
15 mget file1 file2
16 #下载多个文件
17 mput file1 file2
18 #上传多个文件
19 #使用!开始代表shell,例如!ls即可以列出本地当 前目录的文件
windows中可以使用Core FTP,FileZilla, WinSCP,Xftp来连接SFTP进行上传,下载文件,建立,删除目录等操作。
以winscp软件为例:
1、将之前下载的sftp服务端解压缩,然后直接运行主程序。点“NEXT”按钮进行下面的操作。
2、在许可协议窗口处填写“同意”并点“下一步”按钮继续。
3、在接下来的配置窗口中选择要安装的组件,从界面中可以看到包括client(客户端)与server(服务器端),实际上只需要服务器端,而客户端使用之前下载的WinSCP 382即可。选择相应的服务器端组件后点“下一步”完成安装
4、 接下来就要启动该服务了,通过“开始->运行->输入CMD后回车”进入到命令提示窗口,然后通过cd命令定位到c:\programfiles\openssh\bin目录。
5、依次执行mkgroup -l >> \etc\group mkpasswd -l >> \etc\passwd命令,这样你目前windows本地帐户中的用户就都可以登录该sftp服务器了,自对文件目录的访问权限和NTFS权限一致。此步骤相当于FTP中的建立访问帐号。
6、添加完各个访问帐户后就可以使用了。
SFTP:sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。
sftp是ssh内含的协议,只要sshd服务器启动了,它就可用,它本身不需要ftp服务器启动。 FTP服务器和客户端要进行文件传输,就需要通过端口来进行。FTP协议需要的端口一般包括两种:
控制链路--------TCP端口21
所有你发往FTP服务器的命令和服务器反馈的指令都是通过服务器上的21端口传送的。
数据链路--------TCP端口20
数据链路主要是用来传送数据的,比如客户端上传、下载内容,以及列目录显示的内容等。 FTP服务器和客户端要进行文件传输,就需要通过端口来进行。FTP协议需要的端口一般包括两种:
控制链路--------TCP端口21
所有你发往FTP服务器的命令和服务器反馈的指令都是通过服务器上的21端口传送的。
数据链路--------TCP端口20
数据链路主要是用来传送数据的,比如客户端上传、下载内容,以及列目录显示的内容等。 FTP服务器和客户端要进行文件传输,就需要通过端口来进行。FTP协议需要的端口一般包括两种:
控制链路--------TCP端口21
所有你发往FTP服务器的命令和服务器反馈的指令都是通过服务器上的21端口传送的。
数据链路--------TCP端口20
数据链路主要是用来传送数据的,比如客户端上传、下载内容,以及列目录显示的内容等。 FTP连接的两种方式
在数据链路的建立上,FTP Server 为了适应不同的网络环境,支持两种连接模式:主动模式(Port)和被动模式(Pasv)。其实这两种连接模式主要是针对数据链路进行的,和控制链路无关。
主动模式
主动模式是这样工作的:客户端把自己的高位端口和服务器端口21建立控制链路。所有的控制命令比如Is或get都是通过这条链路传送的。
当客户端需要服务器端给它传送数据时,客户端会发消息给服务器端,告诉自己的位置和打开的高位端口(一般大于1024的端口都就叫高位端口),等候服务器 的20端口和客户端打开的端口进行连接,从而进行数据的传输。当服务器端收到信息后,就会和客户端打开的端口连接,这样数据链路就建立起来了。
采用主动模式连接服务器的客户端,当它位于NAT或者防火墙的保护之后时会碰到连接失败的问题。这是因为当防火墙接到服务器发送过来的信息的时候,并不知道应该发送给内部网络中的哪一台客户端造成的。
被动模式
被动模式是这样工作的:当客户端发送数据请求后,服务器也会发信息给客户端,告诉客户端:服务器在本地打开了一个高位端口P,你现在来连接我吧。当客户端收到该信息时,就会去连接服务器端的端口P,连接成功后,数据链路就建立了。
从上面的解释中我们可以看到,两种模式主要的不同是数据连接建立的不同。对于Port模式,是客户端在本地打开一个端口等服务器去连接建立数据连接,而Pasv模式就是服务器打开一个端口等待客户端去建立一个数据连接。
第一步:打开WinSCP,选择高级
第二步:选择验证,选择密钥文件
第三步:选中你的密钥文件点击确定
第四步:记得点击保存按钮,下次可以直接登录
Mac系统是原生集成了 ftp服务器, 只要简简单单的几步设置就能把你的mac变成ftp服务器, 这样方便了我们跨平台共享文件
在Macbook上做如下设置:
[blockquote]
打开System Preferences > Share 对话框,在左侧列表中的“File Sharing”之前打勾;[/li]
[/li]点击该对话框中的“Options”按钮;[/li]
[/li]在随后出线的对话框中的“Share files and folders using FTP”之前打勾;[/li]
[/li]点击“Done”按钮完成设置[/li]
[/blockquote]在Windows机器上打开资源管理器或者浏览器,在地址栏输入:
[blockquote]ftp://macbook用户名:macbook密码@macbook IP地址
[/blockquote][blockquote]例如: ftp://pearmac:123456@19216801
[/blockquote]如此即可通过FTP方式访问Macbook上的所有文件
如果你的JAVA部署的tomcat,就是你要查找文件的服务器,那就用:
File file = new File("文件路径")。
如果你本地的JAVA想要访问远程的一个服务器的文件是否存在,就得用如下方法:
URL url = new URL(“文件路径:可以是本地服务器的路径,也可以是远程服务器的路径”)
HttpURLConnection urlcon = (HttpURLConnection) urlopenConnection();
//message = urlcongetHeaderField(0);
//文件存在‘HTTP/11 200 OK’ 文件不存在 ‘HTTP/11 404 Not Found’
Long TotalSize=LongparseLong(urlcongetHeaderField("Content-Length"));
if (TotalSize>0){
return true;
}else{
return false;
}
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
0条评论