需求:WEB app 需要使用JSCH來通過密鑰文件的方式進行SFTP/SSH訪問遠程LINUX機器
實現方式:假設遠程機器都含有用戶名為hadoop的用戶,因為密碼因為策略的要求密碼會隨時間發生變化,所以希望使用密鑰的方式進行訪問機器,這樣不會因為密碼的變化而無法訪問遠程機器。
基本原理:SSH訪問,被訪問的機器首先需要啟動SSHD服務,然后通過SSH-KEYGEN 默認生成RSA的公私密鑰對。
而且需要配置無密碼訪問,即需要把本機的公鑰文件放置到.ssh下的authorized_keys文件,而且還要保證文件權限是600.注意,這里默認讓生成密鑰時需要的PASSPHASE保持一致,可以保持為空
,這樣方便在代碼里使用。
在JSCH代碼段里,通過傳遞 用戶名,IP,PASSPHASE,保存私鑰的文件即要建立連接。
同一個機器上同一個用戶,使用相同的PASSPHASE也會生成不同的私鑰文件,所以需要保存多份私鑰文件。
調用時的代碼示例如下:
String hostIp = "192.168.1.175"; Session session = SSHExecUtil.getInstance().getSession2(hostIp, "hadoop","D:/code/learningJava/src/main/resources/hadoop_rsa"); ChannelExec channelExec = (ChannelExec) SSHExecUtil.getInstance().getChannelExec(session); String command = "ls -a /"; String result = SSHExecUtil.getInstance().execCommand(channelExec, command); System.out.println(result);
生成session部分的代碼如下:
JSch jsch = new JSch(); jsch.addIdentity(filePath,""); Session session=jsch.getSession(userName, hostIp, 22); UserInfo ui=new CustomUserInfo(); session.setUserInfo(ui); Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect();
需要寫一段SHELL腳本去完成自動配置無密碼訪問本地的功能,另外一種實現思路是,所有機器使用相同的一份公私鑰文件。即把.ssh下面的內容只在某一台機器上生成一份,然后打包分發到其他機器上即可。