java程序实现对sftp服务器的操作

标签: java 程序 sftp | 发表时间:2015-05-20 00:37 | 作者:hoochiang
出处:http://www.iteye.com
java程序实现对sftp服务器的操作

FTP服务器中,如果使用的是FTP协议,则用户名和密码是以明文方式传输的,如果是以SFTP 的方式,就会通过加密的方式传输。




如果服务器中的用户增加了公钥的设置,则要求客户端要有相对应的私钥。




公/私钥的产生方法可见:http://www.jcraft.com/jsch/examples/KeyGen.java.html,值得注意的是,可以产生用密码的公私钥和无密码的公私钥。




SFTP服务器:http://www.xlightftpd.com/cn/tutorial/SSH2_SFTP_Setup.html,下载后,添加虚拟服务器,添加用户,并为用户添加公钥文件,即可。




JAVA模拟一个SFTP服务器:http://mina.apache.org/sshd-project/embedding_ssh.html

http://svn.apache.org/repos/asf/mina/sshd/trunk/



public void setupSftpServer(){
     SshServer sshd = SshServer.setUpDefaultServer();
     sshd.setPort(22);
     sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));

     List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
     userAuthFactories.add(new UserAuthNone.Factory());
     sshd.setUserAuthFactories(userAuthFactories);

     sshd.setCommandFactory(new ScpCommandFactory());

     List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>();
     namedFactoryList.add(new SftpSubsystem.Factory());
     sshd.setSubsystemFactories(namedFactoryList);

     try {
         sshd.start();
     } catch (Exception e) {
         e.printStackTrace();
     }
}



在这里介绍对sftp操作的一种java框架:JSch-Java Secure Channel,官方地址是:http://www.jcraft.com/jsch/

具体使用方法请看下面代码:


package jsch;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

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;

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)) {
                     jsch.addIdentity(privateKey, passphrase);
                 } else {
                     jsch.addIdentity(privateKey);
                 }
             }
             Session session = jsch.getSession(username, host, port);
             if (password != null && !"".equals(password)) {
                 session.setPassword(password);
             }
             Properties sshConfig = new Properties();
             sshConfig.put("StrictHostKeyChecking", "no");// do not verify host key
            session.setConfig(sshConfig);
             // session.setTimeout(timeout);
            session.setServerAliveInterval(92000);
             session.connect();
             //参数sftp指明要打开的连接是sftp连接
            channel = session.openChannel("sftp");
             channel.connect();
         } catch (JSchException e) {
             e.printStackTrace();
         }
         return (ChannelSftp) channel;
     }
    
     /**
      * 上传文件
     *
      * @param directory
      *            上传的目录
     * @param uploadFile
      *            要上传的文件
     * @param sftp
      */
     public void upload(String directory, String uploadFile, ChannelSftp sftp) {
         try {
             sftp.cd(directory);
             File file = new File(uploadFile);
             sftp.put(new FileInputStream(file), file.getName());
         } catch (Exception e) {
             e.printStackTrace();
         }
     }

     /**
      * 下载文件
     *
      * @param directory
      *            下载目录
     * @param downloadFile
      *            下载的文件
     * @param saveFile
      *            存在本地的路径
     * @param sftp
      */
     public void download(String directory, String downloadFile,
             String saveFile, ChannelSftp sftp) {
         try {
             sftp.cd(directory);
             sftp.get(downloadFile,saveFile);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }

     /**
      * 删除文件
     *
      * @param directory
      *            要删除文件所在目录
     * @param deleteFile
      *            要删除的文件
     * @param sftp
      */
     public void delete(String directory, String deleteFile, ChannelSftp sftp) {
         try {
             sftp.cd(directory);
             sftp.rm(deleteFile);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
     public void disconnected(ChannelSftp sftp){
         if (sftp != null) {
             try {
                 sftp.getSession().disconnect();
             } catch (JSchException e) {
                 e.printStackTrace();
             }
             sftp.disconnect();
         }
     }
}

在jsch自带的例子中,有一个可以根据密钥生成公钥的类,叫做UserAuthPubKey.java, 且带有图形界面。有用到的可以自己试试。

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 程序 sftp] 推荐:

java程序实现对sftp服务器的操作

- - Java - 编程语言 - ITeye博客
java程序实现对sftp服务器的操作. FTP服务器中,如果使用的是FTP协议,则用户名和密码是以明文方式传输的,如果是以SFTP 的方式,就会通过加密的方式传输. 如果服务器中的用户增加了公钥的设置,则要求客户端要有相对应的私钥. 公/私钥的产生方法可见:http://www.jcraft.com/jsch/examples/KeyGen.java.html,值得注意的是,可以产生用密码的公私钥和无密码的公私钥.

JSch - Java实现的SFTP(文件上传详解篇)

- - 编程语言 - ITeye博客
JSch是Java Secure Channel的缩写. JSch是一个SSH2的纯Java实现. 它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序.   本文只介绍如何使用JSch实现的SFTP功能.   SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议.

ssh sftp配置及权限设置

- - 操作系统 - ITeye博客
从技术角度来分析,几个要求:. 1、从安全方面看,sftp会更安全一点. 2、线上服务器提供在线服务,对用户需要控制,只能让用户在自己的home目录下活动. 3、用户只能使用sftp,不能ssh到机器进行操作. 提供sftp服务,可以用系统自带的internal-sftp,也可以使用vsftpd,这里需求不多,直接选用internal-sftp.

OpenSSH SFTP远程溢出漏洞

- - C1G军火库
近日曝出OpenSSH SFTP 远程溢出漏洞. OpenSSH服务器中如果OpenSSH服务器中没有配置”ChrootDirectory”,普通用户就可以访问所有文件系统的资源,包括 /proc,在>=2.6.x的Linux内核上,/proc/self/maps会显示你的内存布局,/proc/self/mem可以让你任意在当前进程上下文中读写,而综合两者特性则可以造成远程溢出.

FTP/SFTP/SSH的一些软件包

- - 开源软件 - ITeye博客
IIS,Windows自带,可以到[打开或关闭windows功能]里选择IIS,进行安装. freeSSHd ,支持FTP/SFTP/SSH. OpenSSH这个是Linux上的SSH标配,Windows上则可以通过cygwin的方式来安装. FileZilla,支持SFTP. WinSCP,支持SFTP.

Java调用外部程序技巧

- d0ngd0ng - 我自然
前些天使用Java调用外部程序的时候,发现线程会堵塞在waitfor()方法. 如果直接在Shell中调用这个程序,程序会很快结束,不会僵死. 为什么会堵塞呢,原因是当调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立3个管道连接,标准输入,标准输出和标准错误流. 假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取,数据会暂时缓冲在Linux的缓冲区,缓冲区满后该程序将无法继续写数据,会僵死,所以Java程序就会僵死在waitfor(),永远无法结束.

通过Java程序获取Dynatrace数据

- - Taobao QA Team
“dynaTrace Ajax是一个详细的底层追踪工具,它不仅可以显示所有请求和文件在网络中传输的时间,还会记录浏览器Render、CPU消耗、JavaScript解析和运行情况等详细的信息,而这些也只是dynaTrace Ajax的冰山一角. showslow平台同样采集了dynatrace的数据,所以做为kelude平台前端页面测试组件,同样要支持dynatrace数据的获取,该代码由云晰同学编写维护:.

Java程序员常用工具集

- - BlogJava-庄周梦蝶
    我发现很多人没办法高效地解决问题的关键原因是不熟悉工具,不熟悉工具也还罢了,甚至还不知道怎么去找工具,这个问题就大条了. 我想列下我能想到的一个Java程序员会用到的常用工具. 1.IDE: Eclipse或者 IDEA,熟悉尽可能多的快捷键,《 Eclipse常见快捷键列表》. (1) Findbugs,在release之前进行一次静态代码检查是必须的.

Java系统程序员修炼之道

- - 博客 - 伯乐在线
从2002开始接触Java学会HelloWorld这么经典的程序到如今不知不觉已经十年啦,十年中亲耳听到过不少大牛的演讲,见到过项目中的神人在键盘上运指如飞的编程速度,当时就被震撼了. 当编程越来越成体力活,我们还能有自己的思想,还能修炼为Java系统级别的 程序员嘛. 学习与修炼以下知识与技能,帮你早日达成愿望.

Java程序挂掉的几种可能

- - Java译站
今天花了一整天在跟踪一个问题,每次感觉已经快找到原因的时候发现现象又变了,我觉得从中吸取的教训可以给大家分享一下. 为了重现这个现象,我写了一个简单的例子. 在本例中,先初始化了一个map,然后用一个无限循环将一些键值对插入到map里面:. 你可能也猜到了,这段代码编译执行后无法正常结束. 我会在终端中看到java.lang.OutOfMemoryError: GC overhead limit exceeded的异常信息.