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时,感觉不是很惬意,试验了许久才通过。
以上文字但愿对后来者有所帮助