Java實現(xiàn)sftp及遠(yuǎn)程執(zhí)行命令

在項目中準(zhǔn)備替換ActiveMQ的http方式為sftp方式下載文件梅猿。由于sftp需要開通22端口待错,也就是說ssh也能用了嘶卧,因此也可以通過ssh執(zhí)行一些命令亲善。
需要引用jsch-0.1.44.jar
首先直接上sftp的代碼。

package com.icbc.SFTP;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class MediaSftp {
    public Session session;
    private String usr;
    private String pwd;
    
    public MediaSftp(String usr,String pwd,String ip) throws JSchException {
    this.usr = usr;
    this.pwd=pwd;
    Connect(ip);
    }
    public void Connect(String ip) throws JSchException{  
        JSch jsch = new JSch();  
        try{
       this.session = jsch.getSession(this.usr, ip,22);
       if(session != null){  
           session.setPassword(this.pwd);
           session.setConfig("StrictHostKeyChecking","no");
           session.setTimeout(30000);
           session.connect();
           System.out.println("connect to "+ip);
           if(session != null && !session.isConnected()){                     
               this.close(); 
           }    
       } 
        }catch(JSchException e){
        throw e;
        }          
    }  
    public void close(){  
        if(session != null && session.isConnected()){  
            session.disconnect();
//            this.isConnectSSH = false;
        }else{ 
        }  
    }  
    
    public boolean download(String downloadFile,String saveFile) throws Exception{
try {
        ChannelSftp sftp = (ChannelSftp)     
        session.openChannel("sftp");
        sftp.connect(); 
        sftp.cd("/opt/activemq/apache-activemq-5.13.4/webapps/fileserver/media/");
        File file = new File(saveFile);
        System.out.println(saveFile);
        File parentFile = file.getParentFile(); 
        if(!parentFile.exists()){
              parentFile.mkdirs();
        }
        InputStream in = null;
        FileOutputStream outputStream = new FileOutputStream(file);

         in = sftp.get(downloadFile);
         //可通過byte數(shù)組長度控制下載速度
         byte[] buffer = new byte[20480];
         int count = 0;
         while ((count = in.read(buffer)) != -1) {
               if (count == 0) break;
               outputStream.write(buffer, 0, count);
         }
         
         in.close();
         outputStream.close();
         outputStream.flush();
         sftp.disconnect();
         this.close();
         return true;
      } catch (Exception e) {
          throw e;
      }
}  
}

調(diào)用時先實例化這個類,然后直接調(diào)用download方法就可以了澎灸。入?yún)⑹且螺d的文件名院塞,和本地要保存的路徑,然后拼成本地文件名傳入download方法性昭。返回值是下載耗時拦止。

public long getMedia(String hostip,String fileName, String localPath) throws Exception  {
    MediaSftp sftp = new MediaSftp("username","passwords",hostip);
    String localFile = localPath+fileName;
    long start = System.currentTimeMillis();
    sftp.download(fileName, localFile);
    return System.currentTimeMillis()-start;
}

此外,jsch還提供了遠(yuǎn)程ssh協(xié)議登陸后執(zhí)行命令的方法糜颠。下面是一個執(zhí)行命令獲取目錄中最近更新的文件名的方法汹族,可以把這個方法添加到MediaSftp類里,實例化MedisSftp類建立連接后其兴,就可以調(diào)用這個方法了顶瞒。

public String getLatestFileName(String patterns) throws Exception {
//執(zhí)行的命令,這里為查找目錄下最近更新的文件名帶有patterns的文件
    String cmd = "ls -ltr /opt/activemq/apache-activemq-5.13.4/webapps/fileserver/media/|grep "+patterns+"|tail -1|awk {'print $NF'}\n";
    ByteArrayOutputStream retOut = new ByteArrayOutputStream();
    ChannelShell channelShell = (ChannelShell)session.openChannel("shell");

    PipedInputStream cmdIn = new PipedInputStream();
    PipedOutputStream cmdOut = new  PipedOutputStream(cmdIn); 
    channelShell.setInputStream(cmdIn);
    channelShell.setOutputStream(retOut);

    channelShell.connect(30000);
    cmdOut.write(cmd.getBytes()); 
    cmdOut.flush();
//緩沖時間和執(zhí)行時間
    Thread.sleep(2000);
    cmdOut.close();
    cmdIn.close();
    String retMsg = retOut.toString();
    retOut.close();
    channelShell.disconnect();
//得到的結(jié)果包含很多行忌警,需要處理
    String[] retArr= retMsg.split("\n");
    return  retArr[retArr.length-2].trim();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搁拙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子法绵,更是在濱河造成了極大的恐慌箕速,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋譬,死亡現(xiàn)場離奇詭異盐茎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)徙赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門字柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狡赐,你說我怎么就攤上這事窑业。” “怎么了枕屉?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵常柄,是天一觀的道長。 經(jīng)常有香客問我搀擂,道長西潘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任哨颂,我火速辦了婚禮喷市,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘威恼。我一直安慰自己品姓,他們只是感情好寝并,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缭黔,像睡著了一般食茎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馏谨,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音附迷,去河邊找鬼惧互。 笑死,一個胖子當(dāng)著我的面吹牛喇伯,可吹牛的內(nèi)容都是我干的喊儡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稻据,長吁一口氣:“原來是場噩夢啊……” “哼艾猜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捻悯,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匆赃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后今缚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體算柳,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年瞬项,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片何荚。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡囱淋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出餐塘,到底是詐尸還是另有隱情妥衣,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布唠倦,位于F島的核電站称鳞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稠鼻。R本人自食惡果不足惜冈止,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望候齿。 院中可真熱鬧熙暴,春花似錦闺属、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俱箱,卻和暖如春国瓮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狞谱。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工乃摹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跟衅。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓孵睬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伶跷。 傳聞我的和親對象是個殘疾皇子掰读,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)叭莫,斷路器蹈集,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法食寡,內(nèi)部類的語法雾狈,繼承相關(guān)的語法,異常的語法抵皱,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言伤为,發(fā)作 oo-boon-too 的音咒循。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,261評論 9 467
  • 寫文章,有助于思考绞愚。買個車
    mimikatz閱讀 111評論 0 0
  • 畫面展開叙甸,旁白進(jìn)入。壯闊斑斕位衩,霧嵐天光裆蒸,山脊河川,大美不言糖驴。周迅極具辨識度的旁白僚祷,沉穩(wěn)中透露出調(diào)皮佛致,柔美又不失陽剛...
    紅豆?jié)h堡閱讀 318評論 0 2