2015年4月24日 星期五

[Java] 透過SSH連線到Linux

Java要透過SSH連到Linux主機,可以用JSch這個現成的Library,

簡化開發流程,以下是官網對JSch的簡述。

JSch is a pure Java implementation of SSH2.
JSch allows you to connect to an sshd server and use port forwarding,
 X11 forwarding, file transfer, etc.

北七的理解是:

JSch是一個用Java來實作 SSH Protocol  ,支援你連線到sshd 服務,並且使用port forwarding ,

X11 forwarding 等功能。

資料來源
http://www.jcraft.com/jsch/


以下是一個連接SSH並且輸入指令的範例
 
package ssh;


import java.io.ByteArrayInputStream;
import java.io.InputStream;

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

/** Demonstrates a connection to a remote host via SSH. **/
public class SSH
{
  // 使用者的帳號
  private static final String user = "Jhon";
   //主機的IP
  private static final String host = "192.168.0.203";
  //使用者的密碼
  private static final String password = "abcd123456";
  //要輸入的指令
  private static final String command = "ls -l\n";
  
  public static void main(String args[]) throws JSchException, InterruptedException
  {
      //初始代JSch
    JSch jsch = new JSch();
   
   //建立一個Session代入username , host , ssh port
    Session session = jsch.getSession(user, host, 22);

    //設定密碼
    session.setPassword(password);

    //SSH客户端的配置文件中有一个选项StrictHostKeyChecking,
    //默认是“ask”,可以把它改为“no”,
    //这样主机密钥就会在连接时自动加入到known_hosts中去。
    session.setConfig("StrictHostKeyChecking", "no");

    //開始Sesiion連接(Timeout 10 sec)
    session.connect(10*1000);
    //從Session建立一個Chanel並啟用Shell模式
    Channel channel = session.openChannel("shell");

    //將指令轉換成InputStream
    InputStream is = new ByteArrayInputStream(command.getBytes());
    //將指令的InputStream給Chanel
    channel.setInputStream(is);
    
    //將Chanel的輸出流設成標準輸出
    channel.setOutputStream(System.out);

    //Chanel啟動連接
    channel.connect(15 * 1000);
    
    //停頓3秒鐘等待指令執行完畢
    Thread.sleep(3*1000);
    
    //中斷連線
    channel.disconnect();
    session.disconnect();
  }
} 

程式碼來源 http://www.examplesample.com/recipe?recipe=execute-command-over-ssh

執行結果



補充資料

Port forwarding via SSH (SSH tunneling) creates a secure connection between a local computer and a remote machine through which services can be relayed. Because the connection is encrypted, SSH tunneling is useful for transmitting information that uses an unencrypted protocol, such as IMAP, VNC, or IRC.

資料來源
https://help.ubuntu.com/community/SSH/OpenSSH/PortForwarding


SSH客戶端的配置文件中有一個選項StrictHostKeyChecking,默認是“ask”,

可以把它改為“no”,這樣主機密鑰就會在連接時自動加入到known_hosts中去。

ssh會把你每個你訪問過計算機的公鑰(public key)都記錄在~/.ssh/known_hosts。當下次訪問相

同計算機時,OpenSSH會核對公鑰。如果公鑰不同,OpenSSH會發出警告,避免你受到DNS 

Hijack之類的攻擊。

SSH對主機的public_key的檢查等級是根據StrictHostKeyChecking變量來配置的。默認情況

下,StrictHostKeyChecking=ask。簡單所下它的三種配置值:

1.StrictHostKeyChecking=no

最不安全的級別,當然也沒有那麽多煩人的提示了,相對安全的內網測試時建議使用。如果連接server的key在本地不存在,那麽就自動添加到文件中(默認是known_hosts),並且給出一個警告。

2.StrictHostKeyChecking=ask

默認的級別,就是出現剛才的提示了。如果連接和key不匹配,
給出提示,並拒絕登錄。



3.StrictHostKeyChecking=yes 

最安全的級別,如果連接與key不匹配,就拒絕連接,不會提示詳細信息。

資料來源
http://bbs.51osos.com/thread-12198-1-1.html


沒有留言:

張貼留言