JSch:纯JAVA实现SFTP文件上传和下载

时间:2021-01-28 10:14:39

转自:http://my.oschina.net/hetiangui/blog/137357

如果你想用纯JAVA实现SFTP文件上传或下载,或者是想纯JAVA连接到SSH2服务器上执行命令,那就使用JSch.jar包吧。这里我们先描述实现SFTP协议的上传和下载,上代码和详细的代码注释:

?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 /** * 利用JSch包实现SFTP下载、上传文件 * @param ip 主机IP * @param user 主机登陆用户名 * @param psw  主机登陆密码 * @param port 主机ssh2登陆端口,如果取默认值,传-1 */public
static
void sshSftp(String ip, String user, String psw ,int
port)
throws
Exception{
    Session session = null;    Channel channel = null;          JSch jsch = new
JSch();
              if(port <=0){        //连接服务器,采用默认端口        session = jsch.getSession(user, ip);    }else{        //采用指定的端口连接服务器        session = jsch.getSession(user, ip ,port);    }     //如果服务器连接不上,则抛出异常    if
(session ==
null) {
        throw
new
Exception("session is null");
    }         //设置登陆主机的密码    session.setPassword(psw);//设置密码      //设置第一次登陆的时候提示,可选值:(ask | yes | no)    session.setConfig("StrictHostKeyChecking","no");    //设置登陆超时时间      session.connect(30000);             try
{
        //创建sftp通信通道        channel = (Channel) session.openChannel("sftp");        channel.connect(1000);        ChannelSftp sftp = (ChannelSftp) channel;                          //进入服务器指定的文件夹        sftp.cd("domains");                 //列出服务器指定的文件列表        Vector v = sftp.ls("*.txt");        for(int
i=
0;i<v.size();i++){
            System.out.println(v.get(i));        }                 //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了        OutputStream outstream = sftp.put("1.txt");        InputStream instream = new
FileInputStream(
new
File(
"c:/print.txt"));
                 byte
b[] =
new
byte
[1024];
        int
n;
        while
((n = instream.read(b)) != -
1) {
            outstream.write(b,0, n);        }                 outstream.flush();        outstream.close();        instream.close();    }catch
(Exception e) {
        e.printStackTrace();    }finally
{
        session.disconnect();        channel.disconnect();    }}


另外,JSCH也支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息就可以了,以下是带密钥的代码:

?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 /** * 利用JSch包实现SFTP下载、上传文件 * @param ip 主机IP * @param user 主机登陆用户名 * @param psw  主机登陆密码 * @param port 主机ssh2登陆端口,如果取默认值(默认值22),传-1 * @param privateKey 密钥文件路径 * @param passphrase 密钥的密码 * */public
static
void sshSftp(String ip, String user, String psw
        ,int
port ,String privateKey ,String passphrase)
throws
Exception{
    Session session = null;    Channel channel = null;          JSch jsch = new
JSch();
         //设置密钥和密码    if
(privateKey !=
null
&& !
"".equals(privateKey)) {
        if
(passphrase !=
null
&&
"".equals(passphrase)) {
            //设置带口令的密钥            jsch.addIdentity(privateKey, passphrase);        }else
{
            //设置不带口令的密钥            jsch.addIdentity(privateKey);        }    }               if(port <=0){        //连接服务器,采用默认端口        session = jsch.getSession(user, ip);    }else{        //采用指定的端口连接服务器        session = jsch.getSession(user, ip ,port);    }     //如果服务器连接不上,则抛出异常    if
(session ==
null) {
        throw
new
Exception("session is null");
    }         //设置登陆主机的密码    session.setPassword(psw);//设置密码      //设置第一次登陆的时候提示,可选值:(ask | yes | no)    session.setConfig("StrictHostKeyChecking","no");    //设置登陆超时时间      session.connect(30000);             try
{
        //创建sftp通信通道        channel = (Channel) session.openChannel("sftp");        channel.connect(1000);        ChannelSftp sftp = (ChannelSftp) channel;                          //进入服务器指定的文件夹        sftp.cd("domains");                 //列出服务器指定的文件列表        Vector v = sftp.ls("*.txt");        for(int
i=
0;i<v.size();i++){
            System.out.println(v.get(i));        }                 //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了        OutputStream outstream = sftp.put("1.txt");        InputStream instream = new
FileInputStream(
new
File(
"c:/print.txt"));
                 byte
b[] =
new
byte
[1024];
        int
n;
        while
((n = instream.read(b)) != -
1) {
            outstream.write(b,0, n);        }                 outstream.flush();        outstream.close();        instream.close();    }catch
(Exception e) {
        e.printStackTrace();    }finally
{
        session.disconnect();        channel.disconnect();    }}