国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于Jsch實現Java操作linux服務器

IT那活兒 / 2440人閱讀
基于Jsch實現Java操作linux服務器
[
概述
]


如果大家熟悉Linux的話,一定對ssh,sftp,scp等命令非常熟悉。ssh是一個安全協議,用來在不同系統或者服務器之間進行安全連接。ssh在連接和傳送的過程中會加密所有的數據。但是ssh一般是基于客戶端的或者Linux命令行的。比如客戶端工具:OpenSSH,putty,SSHTectia。在linux系統上大家可以通過sshusername@host命令連接到目標主機,但是如果在Java中,如何實現SSH功能呢?更進一步如何實現SCP,SFTP的功能呢?目前Java主流操作linux服務器基本都是基于Jsch與ganymed-ssh2。Jsch與ganymed-ssh2都是用純Java實現SSH-2協議的一個包。兩者大同小異,下面筆者重點講解下如何在Java代碼中基于Jsch連接并操作linux系統。


[
實際應用
]


目前在湖南移動的日志分析項目中,我們正是基于jsch實現java操作linux服務器,實現腳本庫的功能。


1、Pom文件中配置相應的jsch的jar包

com.jcraft

jsch

0.1.54


2、建立一個SSH會話

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;

}


3、執行Shell命令

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();

}


測試執行shell命令

運行結果:

這樣就和在原linux系統中一樣使用shell功能了。


4、創建sftp通道

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():    文件下載

cd():     進入指定目錄

ls():     得到指定目錄下的文件列表

rename(): 重命名指定文件或目錄

rm():     刪除指定文件

mkdir():  創建目錄

rmdir():  刪除目錄

等等(這里省略了方法的參數,put和get都有多個重載方法,大家如需使用請看具體源代碼,這里篇幅有限就不一一列出。


[
注意事項
]


JSch是以多線程方式連接,所以程序在connect后如果不disconnectchannel和session以及相關stream,進程會一直等待,開發同事在編寫代碼時切記在使用完畢,須在最后finally中disconnect掉所有連接通道。


[
使用總結
]


我們再次回顧總結下使用Jsch步驟:

1、new一個JSch對象;

2、從JSch對象中獲取Session,用于連接,并設置連接信息;

3、使用session對象調用opnChannel("xxx")打開通信信道,并連接;

4、后面就是不同的channel,不同的操作(常用的有三種通道,即ChannelShell、ChannelExec、ChannelSftp,前兩類用于執行命令,后一種是用于上傳下載文件)在實際項目中,我們可以基于jsch實現java操作linux服務器執行相應的命令,或者上傳下發刪除文件以及遠程調用腳本,最終達到實現項目自動化運維的這個小目標。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130130.html

相關文章

  • JSch-用java實現務器遠程操作

    摘要:主要是將一個服務集群部署到遠端的服務器上,具體服務器的連接信息會通過接口傳入。本來部署是人工來完成的,無非是將一些必須的文件到目標服務器上,然后遠程登錄,執行一些安裝的操作,齊活。 介紹 前段時間接了一個比較特殊的需求,需要做一個用于部署服務的服務。主要是將一個k8s服務集群部署到遠端的服務器上,具體服務器的連接信息會通過接口傳入。 本來部署是人工來完成的,無非是將一些必須的文件s...

    孫吉亮 評論0 收藏0
  • Docker技術三大要點:cgroup, namespace和unionFS的理解

    摘要:而是基于容器的這個設計思想,基于技術實現的核心管理引擎。的三大特色,和。不同內的進程屬于不同的,彼此透明,互不干擾。看下面的圖加深理解。同樣內核版本的不同的發行版,其都是一致的。 www.docker.com的網頁有這樣一張有意思的動畫: showImg(https://segmentfault.com/img/remote/1460000017474530); 從這張gif圖片,我們...

    Zachary 評論0 收藏0
  • 技術選型之Docker容器引擎

    摘要:是系統提供的容器化技術,簡稱,它結合和技術為用戶提供了更易用的接口來實現容器化。公司結合和以下列出的技術實現了容器引擎,相比于,具備更加全面的資源控制能力,是一種應用級別的容器引擎。 showImg(https://segmentfault.com/img/bVbtPbG?w=749&h=192); 題外話   最近對Docker和Kubernetes進行了一番學習,前兩天做了一次技術...

    monw3c 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<