成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Jsch實(shí)現(xiàn)Java操作linux服務(wù)器

IT那活兒 / 619人閱讀
基于Jsch實(shí)現(xiàn)Java操作linux服務(wù)器

點(diǎn)擊上方“IT那活兒”公眾號(hào),關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!??!


文章前言

如果大家熟悉Linux的話,一定對(duì)ssh,sftp,scp等命令非常熟悉。ssh是一個(gè)安全協(xié)議,用來在不同系統(tǒng)或者服務(wù)器之間進(jìn)行安全連接。ssh在連接和傳送的過程中會(huì)加密所有的數(shù)據(jù)。
但是ssh一般是基于客戶端的或者Linux命令行的。比如客戶端工具:OpenSSH,putty,SSHTectia。
在linux系統(tǒng)上大家可以通過sshusername@host命令連接到目標(biāo)主機(jī),但是如果在Java中,如何實(shí)現(xiàn)SSH功能呢?更進(jìn)一步如何實(shí)現(xiàn)SCP,SFTP的功能呢

目前Java主流操作linux服務(wù)器基本都是基于Jschganymed-ssh2。Jschganymed-ssh2都是用純Java實(shí)現(xiàn)SSH-2協(xié)議的一個(gè)包。兩者大同小異,下面筆者重點(diǎn)講解下如何在Java代碼中基于Jsch連接并操作linux系統(tǒng)。


實(shí)際應(yīng)用

目前在湖南客戶現(xiàn)場(chǎng)的日志分析項(xiàng)目中,我們正是基于jsch實(shí)現(xiàn)java操作linux服務(wù)器,實(shí)現(xiàn)腳本庫的功能。
2.1 Pom文件中配置相應(yīng)的jsch的jar包

<dependency>
<groupId>com.jcraftgroupId>
<artifactId>jschartifactId>
<version>0.1.54version>
dependency>
2.2 建立一個(gè)SSH會(huì)話
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("創(chuàng)建一個(gè)新的session異常");
}
//設(shè)置第一次登錄的時(shí)候提示,可選值:(ask| yes | no)
session.setConfig("StrictHostKeyChecking","no");
session.setPassword(sshPass);
try{
session.connect();
}catch (JSchException e) {
logger.error("openSession異常",e);
thrownew DeployException("創(chuàng)建一個(gè)新的session異常");
}
returnsession;
}
2.3 執(zhí)行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(",執(zhí)行輸出命令:").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;
}
//超時(shí)
if(System.currentTimeMillis() - startTime > timeout) {
thrownew TimeOutException("sh命令執(zhí)行超時(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();
}
測(cè)試執(zhí)行shell命令:
運(yùn)行結(jié)果:
這樣就和在原linux系統(tǒng)中一樣使用shell功能了。
2.4 創(chuàng)建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("創(chuàng)建一個(gè)新的Channel異常");
}
try{
channel.connect();
}catch (JSchException e) {
logger.error(session.getHost(),e);
thrownew DeployException("創(chuàng)建一個(gè)新的Channel異常");
}
return(ChannelSftp)channel;
}

ChannelSftp類是JSch實(shí)現(xiàn)SFTP核心類,它包含了所有SFTP的方法,如:

  • put():    文件上傳
  • get():    文件下載
  • cd():     進(jìn)入指定目錄
  • ls():     得到指定目錄下的文件列表
  • rename(): 重命名指定文件或目錄
  • rm():     刪除指定文件
  • mkdir():  創(chuàng)建目錄
  • rmdir():  刪除目錄

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

注意事項(xiàng):
JSch是以多線程方式連接,所以程序在connect后如果不disconnectchannel和session以及相關(guān)stream,進(jìn)程會(huì)一直等待,開發(fā)同事在編寫代碼時(shí)切記在使用完畢,須在最后finally中disconnect掉所有連接通道。

使用總結(jié)

我們?cè)俅位仡櫩偨Y(jié)下使用Jsch步驟:

  • new一個(gè)JSch對(duì)象;
  • 從JSch對(duì)象中獲取Session,用于連接,并設(shè)置連接信息;
  • 使用session對(duì)象調(diào)用opnChannel("xxx")打開通信信道,并連接;
  • 后面就是不同的channel,不同的操作(常用的有三種通道,即ChannelShell、ChannelExec、ChannelSftp,前兩類用于執(zhí)行命令,后一種是用于上傳下載文件)在實(shí)際項(xiàng)目中,我們可以基于jsch實(shí)現(xiàn)java操作linux服務(wù)器執(zhí)行相應(yīng)的命令,或者上傳下發(fā)刪除文件以及遠(yuǎn)程調(diào)用腳本,最終達(dá)到實(shí)現(xiàn)項(xiàng)目自動(dòng)化運(yùn)維的這個(gè)小目標(biāo)。


文章首發(fā)于2020年10月1日.




本文作者:鄧 鑫(上海新炬王翦團(tuán)隊(duì))

本文來源:“IT那活兒”公眾號(hào)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129260.html

相關(guān)文章

  • JSch-用java實(shí)現(xiàn)務(wù)器遠(yuǎn)程操作

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

    孫吉亮 評(píng)論0 收藏0
  • Docker技術(shù)三大要點(diǎn):cgroup, namespace和unionFS的理解

    摘要:而是基于容器的這個(gè)設(shè)計(jì)思想,基于技術(shù)實(shí)現(xiàn)的核心管理引擎。的三大特色,和。不同內(nèi)的進(jìn)程屬于不同的,彼此透明,互不干擾??聪旅娴膱D加深理解。同樣內(nèi)核版本的不同的發(fā)行版,其都是一致的。 www.docker.com的網(wǎng)頁有這樣一張有意思的動(dòng)畫: showImg(https://segmentfault.com/img/remote/1460000017474530); 從這張gif圖片,我們...

    Zachary 評(píng)論0 收藏0
  • 技術(shù)選型之Docker容器引擎

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

    monw3c 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<