利用JSch遠端登入linux伺服器執行指令
阿新 • • 發佈:2018-12-31
最近導師專案,需要搞一個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上傳檔案到伺服器。