標籤:
需求: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下面的內容只在某一台機器上產生一份,然後打包分發到其他機器上即可。
JSCH通過密鑰檔案進行遠端存取