點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!!!
文章前言
目前Java主流操作linux服務器基本都是基于Jsch與ganymed-ssh2。Jsch與ganymed-ssh2都是用純Java實現SSH-2協議的一個包。兩者大同小異,下面筆者重點講解下如何在Java代碼中基于Jsch連接并操作linux系統。
實際應用
<dependency>
<groupId>com.jcraftgroupId>
<artifactId>jschartifactId>
<version>0.1.54version>
dependency>
publicstatic Session openSession(String sshHost, int sshPort, StringsshUser, String sshPass)
throwsDeployException {
finalJSch jsch = new JSch();
Sessionsession;
try{
session= jsch.getSession(sshUser, sshHost, sshPort);
}catch (JSchException e) {
logger.error(sshHost,e);
thrownew DeployException("創建一個新的session異常");
}
//設置第一次登錄的時候提示,可選值:(ask| yes | no)
session.setConfig("StrictHostKeyChecking","no");
session.setPassword(sshPass);
try{
session.connect();
}catch (JSchException e) {
logger.error("openSession異常",e);
thrownew DeployException("創建一個新的session異常");
}
returnsession;
}
publicstatic String execCommand(Session session, String cmd, Charsetcharset, long timeout)
throwsDeployException, TimeOutException {
StringBufferresult = new StringBuffer();
ChannelExecexec = null;
try{
exec= (ChannelExec)createChannel(session, ChannelType.EXEC);
cmd= cmd + " 2>&1";
exec.setCommand(cmd);
exec.setInputStream(null);
logger.info(newStringBuilder(exec.getSession().getHost()).append(",執行輸出命令:").append(cmd).toString());
try(InputStream stdout = exec.getInputStream()) {
exec.connect();
longstartTime = System.currentTimeMillis();
byte[]tmp = new byte[1024];
while(true) {
while(stdout.available() > 0) {
inti = stdout.read(tmp, 0, 1024);
if(i < 0)
break;
result.append(newString(tmp, 0, i, Charset.defaultCharset()));
}
if(exec.isClosed()) {
if(stdout.available() > 0)
continue;
break;
}
//超時
if(System.currentTimeMillis() - startTime > timeout) {
thrownew TimeOutException("sh命令執行超時:"+ cmd);
}
}
}
}catch (TimeOutException t) {
throwt;
}catch (Exception e) {
//result.append(e.getMessage());
logger.error("execCommand異常",e);
thrownew DeployException("ssh 異常",e);
}finally {
close(exec);
}
if(result.length() > 0)
result.deleteCharAt(result.length()- 1);
returnresult.toString();
}
publicstatic Channel openChannel(Session session, ChannelType channelType)throws DeployException {
Channelchannel;
try{
if(false == session.isConnected()) {
session.connect();
}
channel= session.openChannel(ChannelType.SFTP.getValue());
}catch (JSchException e) {
logger.error(session.getHost(),e);
thrownew DeployException("創建一個新的Channel異常");
}
try{
channel.connect();
}catch (JSchException e) {
logger.error(session.getHost(),e);
thrownew DeployException("創建一個新的Channel異常");
}
return(ChannelSftp)channel;
}
ChannelSftp類是JSch實現SFTP核心類,它包含了所有SFTP的方法,如:
...等等(這里省略了方法的參數,put和get都有多個重載方法,大家如需使用請看具體源代碼,這里篇幅有限就不一一列出。)
使用總結
我們再次回顧總結下使用Jsch步驟:
文章首發于2020年10月1日.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129260.html
摘要:主要是將一個服務集群部署到遠端的服務器上,具體服務器的連接信息會通過接口傳入。本來部署是人工來完成的,無非是將一些必須的文件到目標服務器上,然后遠程登錄,執行一些安裝的操作,齊活。 介紹 前段時間接了一個比較特殊的需求,需要做一個用于部署服務的服務。主要是將一個k8s服務集群部署到遠端的服務器上,具體服務器的連接信息會通過接口傳入。 本來部署是人工來完成的,無非是將一些必須的文件s...
摘要:而是基于容器的這個設計思想,基于技術實現的核心管理引擎。的三大特色,和。不同內的進程屬于不同的,彼此透明,互不干擾。看下面的圖加深理解。同樣內核版本的不同的發行版,其都是一致的。 www.docker.com的網頁有這樣一張有意思的動畫: showImg(https://segmentfault.com/img/remote/1460000017474530); 從這張gif圖片,我們...
摘要:是系統提供的容器化技術,簡稱,它結合和技術為用戶提供了更易用的接口來實現容器化。公司結合和以下列出的技術實現了容器引擎,相比于,具備更加全面的資源控制能力,是一種應用級別的容器引擎。 showImg(https://segmentfault.com/img/bVbtPbG?w=749&h=192); 題外話 最近對Docker和Kubernetes進行了一番學習,前兩天做了一次技術...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1902·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20