转自: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 void sshSftp(String ip, String user, String psw , int
throws
Session session = null ; Channel channel = null ; JSch jsch = new
if (port <= 0 ){ //连接服务器,采用默认端口 session = jsch.getSession(user, ip); } else { //采用指定的端口连接服务器 session = jsch.getSession(user, ip ,port); } //如果服务器连接不上,则抛出异常 if
null ) { throw 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
0 ;i<v.size();i++){ System.out.println(v.get(i)); } //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 OutputStream outstream = sftp.put( "1.txt" ); InputStream instream = new
new
"c:/print.txt" )); byte
new
[ 1024 ]; int
while
1 ) { outstream.write(b, 0 , n); } outstream.flush(); outstream.close(); instream.close(); } catch
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 void sshSftp(String ip, String user, String psw , int
throws
Session session = null ; Channel channel = null ; JSch jsch = new
//设置密钥和密码 if
null
"" .equals(privateKey)) { if
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
null ) { throw 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
0 ;i<v.size();i++){ System.out.println(v.get(i)); } //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 OutputStream outstream = sftp.put( "1.txt" ); InputStream instream = new
new
"c:/print.txt" )); byte
new
[ 1024 ]; int
while
1 ) { outstream.write(b, 0 , n); } outstream.flush(); outstream.close(); instream.close(); } catch
e.printStackTrace(); } finally
session.disconnect(); channel.disconnect(); } } |