1. 程式人生 > >利用JSch遠端登入linux伺服器執行指令

利用JSch遠端登入linux伺服器執行指令

最近導師專案,需要搞一個web server,需要在瀏覽器端控制底層虛擬機器部署應用。於是有兩個想法。
一、虛擬機器的映象已經部署好所有的應用,這個專案下,使用者需要的應用是固定的,就那麼幾種,所以可以考慮直接映象上直接安裝好所有的應用。當然這個方法有點蠢,太不靈活了。
二、通過編寫java程式,通過ssh遠端登入到虛擬機器來執行命令。於是在網上找到了Jsch。下面是網上轉載的簡單例子:



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io
.InputStreamReader; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; public class Mytest { public static String exec(String host,String user,String psw,int port,String command){ String result=""
; Session session =null; ChannelExec openChannel =null; try { JSch jsch=new JSch(); session = jsch.getSession(user, host, port); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no");
session.setConfig(config); session.setPassword(psw); session.connect(); openChannel = (ChannelExec) session.openChannel("exec"); openChannel.setCommand(command); int exitStatus = openChannel.getExitStatus(); System.out.println(exitStatus); openChannel.connect(); InputStream in = openChannel.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String buf = null; while ((buf = reader.readLine()) != null) { result+= new String(buf.getBytes("gbk"),"UTF-8")+" <br>\r\n"; } } catch (JSchException | IOException e) { result+=e.getMessage(); }finally{ if(openChannel!=null&&!openChannel.isClosed()){ openChannel.disconnect(); } if(session!=null&&session.isConnected()){ session.disconnect(); } } return result; } public static void main(String args[]){ String exec = exec("192.168.1.110", "root", "root", 22, "apt-get install vim -y;"); System.out.println(exec); } }

在main函式裡,執行了安裝vim的命令。
這種方式也不靈活,但是對於這個專案只需要安裝幾個應用而言就夠了。
JSch應該也提供了把本地檔案上傳到linux伺服器上?那是否可以將本地指令碼直接上傳到linux伺服器上,然後直接執行伺服器上的指令碼執行安裝程式呢?有待考證。

經考證,確實可行,寫一篇寫一下JSch上傳檔案到伺服器。