java程序通过密钥方式使用JSch API访问SSH(转帖)

java程序通过密钥方式使用JSchAPI访问SSH(转帖)

2011-05-0920:44297人阅读评论(0)收藏举报

java程序通过密钥方式使用JSchAPI访问SSH

2010-05-2014:51

上面已经验证了通过密钥方式访问SSHServer是可行的,并且给自己搭建了一个测试环境,下面就开始我最终的目的:java程序通过密钥访问。

1、工程引入jsch-0.1.42.jar,可以到http://www.jcraft.com/jsch/官方下载。

2、在官方的example中,有一个demo,类UserAuthPubKey,是使用密钥访问的,参考了下,我对其进行了修改,改为自动连接并使用SFTP协议显示当前路径,代码如下:

packageTest.sftp;

importcom.jcraft.jsch.*;

publicclassTestKeyAcc{

publicstaticvoidmain(String[]arg){

StringkeyFile="./id_rsa";

Stringuser="username";

Stringhost="127.0.0.1";

Stringpassphrase="111111";

intport=22;

try{

JSchjsch=newJSch();

jsch.addIdentity(keyFile);

Sessionsession=jsch.getSession(user,host,port);

//usernameandpassphrasewillbegivenviaUserInfointerface.

UserInfoui=newMyUserInfo(passphrase);

session.setUserInfo(ui);

session.connect();

Channelchannel=session.openChannel("sftp");

channel.connect();

ChannelSftpsftp=(ChannelSftp)channel;

System.out.println(sftp.pwd());

}catch(Exceptione){

e.printStackTrace();

System.out.println(e);

}

}

publicstaticclassMyUserInfoimplementsUserInfo{

privateStringpassphrase=null;

publicMyUserInfo(Stringpassphrase){

this.passphrase=passphrase;

}

publicStringgetPassphrase(){

returnpassphrase;

}

publicStringgetPassword(){

returnnull;

}

publicbooleanpromptPassphrase(Strings){

returntrue;

}

publicbooleanpromptPassword(Strings){

returntrue;

}

publicbooleanpromptYesNo(Strings){

returntrue;

}

publicvoidshowMessage(Strings){

System.out.println(s);

}

}

}

运行后结果显示:

****USAGEWARNING****

Thisisaprivatecomputersystem.Thiscomputersystem,includingall

relatedequipment,networks,andnetworkdevices(specificallyincluding

Internetaccess)areprovidedonlyforauthorizeduse.Thiscomputersystem

maybemonitoredforalllawfulpurposes,includingtoensurethatitsuse

isauthorized,formanagementofthesystem,tofacilitateprotectionagainst

unauthorizedaccess,andtoverifysecurityprocedures,survivability,and

operationalsecurity.Monitoringincludesactiveattacksbyauthorizedentities

totestorverifythesecurityofthissystem.Duringmonitoring,information

maybeexamined,recorded,copiedandusedforauthorizedpurposes.All

information,includingpersonalinformation,placedorsentoverthissystem

maybemonitored.

Useofthiscomputersystem,authorizedorunauthorized,constitutesconsent

tomonitoringofthissystem.Unauthorizedusemaysubjectyoutocriminal

prosecution.Evidenceofunauthorizedusecollectedduringmonitoringmaybe

usedforadministrative,criminal,orotheradverseaction.Useofthissystem

constitutesconsenttomonitoringforthesepurposes.

/cygdrive/d/opensshhome/username

ok,good,问题解决了,如果不是密钥方式,与普通FTP一样的用户名及密码访问又是怎样的呢,那就比较简单了

去掉

jsch.addIdentity(keyFile);

UserInfoui=newMyUserInfo(passphrase);

session.setUserInfo(ui);

在SessionsshSession=jsch.getSession(userStr,serverIp,port);下增加

sshSession.setPassword(passwordStr);

如果在生成私钥时没有使用密码,那又是怎样的呢?其实很简单,如果不需要密码访问,你提供了密码也是通过的(newMyUserInfo(passphrase);中密码不null或空),大概过程是,先看是否需要密码,如果不需要,那么就直接过去,所以即便设置了密码也没问题。

在使用该API进行密钥及非密钥访问SFTP时,感觉不是很惬意,试验了许久才通过。

以上文字但愿对后来者有所帮助