TShopping

 找回密碼
 註冊
搜索
查看: 95|回復: 0

[教學] Android 如何用 jsch ssh 控制遠端伺服器 (SSHManager)

[複製鏈接]
發表於 2018-8-29 23:00:34 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
APP嘗試用SSH來控制遠端伺服器,以下是簡單的例子

SSHManager.java from Run a command over SSH with JSch

MainActivity.java

  1. package com.example.demyon.opengatefinal;

  2. import android.util.Log;

  3. import com.jcraft.jsch.Channel;
  4. import com.jcraft.jsch.ChannelExec;
  5. import com.jcraft.jsch.JSch;
  6. import com.jcraft.jsch.JSchException;
  7. import com.jcraft.jsch.Session;

  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.util.logging.Level;
  11. import java.util.logging.Logger;

  12. /**
  13. * Created by Demyon on 10/15/2017.
  14. */

  15. public class SSHManager {
  16.     private static final Logger LOGGER =
  17.             Logger.getLogger(SSHManager.class.getName());
  18.     private JSch jschSSHChannel;
  19.     private String strUserName;
  20.     private String strConnectionIP;
  21.     private int intConnectionPort;
  22.     private String strPassword;
  23.     private Session sesConnection;;
  24.     private int intTimeOut;

  25.     private void doCommonConstructorActions(String userName,
  26.                                             String password, String connectionIP, String knownHostsFileName)
  27.     {
  28.         jschSSHChannel = new JSch();

  29.         try
  30.         {
  31.             jschSSHChannel.setKnownHosts(knownHostsFileName);
  32.         }
  33.         catch(JSchException jschX)
  34.         {
  35.             logError(jschX.getMessage());
  36.         }

  37.         strUserName = userName;
  38.         strPassword = password;
  39.         strConnectionIP = connectionIP;
  40.     }

  41.     public SSHManager(String userName, String password,
  42.                       String connectionIP, String knownHostsFileName)
  43.     {
  44.         doCommonConstructorActions(userName, password,
  45.                 connectionIP, knownHostsFileName);
  46.         intConnectionPort = 22;
  47.         intTimeOut = 60000;
  48.     }

  49.     public SSHManager(String userName, String password, String connectionIP,
  50.                       String knownHostsFileName, int connectionPort)
  51.     {
  52.         doCommonConstructorActions(userName, password, connectionIP,
  53.                 knownHostsFileName);
  54.         intConnectionPort = connectionPort;
  55.         intTimeOut = 60000;
  56.     }

  57.     public SSHManager(String userName, String password, String connectionIP,
  58.                       String knownHostsFileName, int connectionPort, int timeOutMilliseconds)
  59.     {
  60.         doCommonConstructorActions(userName, password, connectionIP,
  61.                 knownHostsFileName);
  62.         intConnectionPort = connectionPort;
  63.         intTimeOut = timeOutMilliseconds;
  64.     }

  65.     public String connect()
  66.     {
  67.         String errorMessage = null;

  68.         try
  69.         {
  70.             sesConnection = jschSSHChannel.getSession(strUserName,
  71.                     strConnectionIP, intConnectionPort);
  72.             sesConnection.setPassword(strPassword);
  73.             // UNCOMMENT THIS FOR TESTING PURPOSES, BUT DO NOT USE IN PRODUCTION
  74.             // sesConnection.setConfig("StrictHostKeyChecking", "no");
  75.             sesConnection.connect(intTimeOut);
  76.         }
  77.         catch(JSchException jschX)
  78.         {
  79.             errorMessage = jschX.getMessage();
  80.         }

  81.         return errorMessage;
  82.     }

  83.     private String logError(String errorMessage)
  84.     {
  85.         if(errorMessage != null)
  86.         {
  87.             LOGGER.log(Level.SEVERE, "{0}:{1} - {2}",
  88.                     new Object[]{strConnectionIP, intConnectionPort, errorMessage});
  89.         }

  90.         return errorMessage;
  91.     }

  92.     private String logWarning(String warnMessage)
  93.     {
  94.         if(warnMessage != null)
  95.         {
  96.             LOGGER.log(Level.WARNING, "{0}:{1} - {2}",
  97.                     new Object[]{strConnectionIP, intConnectionPort, warnMessage});
  98.         }

  99.         return warnMessage;
  100.     }

  101.     public String sendCommand(String command)
  102.     {
  103.         StringBuilder outputBuffer = new StringBuilder();
  104.         Log.v("Tag","SendCommand - outputBuffer");
  105.         try
  106.         {
  107.             Log.v("Tag","SendCommand - Try");
  108.             Channel channel = sesConnection.openChannel("exec");
  109.             Log.v("Tag","SendCommand - Channel");
  110.             ((ChannelExec)channel).setCommand(command);
  111.             Log.v("Tag","SendCommand - ChannelExec");
  112.             InputStream commandOutput = channel.getInputStream();
  113.             Log.v("Tag","SendCommand - InputStream");
  114.             channel.connect();
  115.             Log.v("Tag","SendCommand - channelConnect");
  116.             int readByte = commandOutput.read();
  117.             Log.v("Tag","SendCommand - readByte");

  118.             while(readByte != 0xffffffff)
  119.             {
  120.                 Log.v("Tag","SendCommand - while ReadByte");
  121.                 outputBuffer.append((char)readByte);
  122.                 Log.v("Tag","SendCommand - OutputBuffer append");
  123.                 readByte = commandOutput.read();
  124.             }

  125.             channel.disconnect();
  126.         }
  127.         catch(IOException ioX)
  128.         {
  129.             logWarning(ioX.getMessage());
  130.             return null;
  131.         }
  132.         catch(JSchException jschX)
  133.         {
  134.             logWarning(jschX.getMessage());
  135.             return null;
  136.         }

  137.         return outputBuffer.toString();
  138.     }

  139.     public void close()
  140.     {
  141.         sesConnection.disconnect();
  142.     }

  143. }
複製代碼

參考文章https://stackoverflow.com/questi ... -jsch-remote-access

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2018-9-22 04:14 , Processed in 0.048609 second(s), 19 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表