2017-02-06 27 views
0

我一直在搜索整個互聯網上的答案,我一直以相同的結果結束,但我想要做的就是通過ssh向我的樹莓派發送命令行指令。原諒我,如果我完全錯過了一些非常明顯的事情,但我知道我能夠連接,因爲如果我輸入不正確的用戶名或密碼,我會得到一個驗證失敗。所以我有聯繫,但我的樹莓派似乎沒有發生任何事情。以下是我目前的代碼:Jsch ssh到Rasperry Pi什麼都不做

package com.name.app.prynsofpi; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 

import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

import java.io.ByteArrayOutputStream; 
import java.util.Properties; 


public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     new AsyncTask<Integer, Void, Void>(){ 
      @Override 
      protected Void doInBackground(Integer... params){ 
       try { 
        executeRemoteCommand("pi", "green1", "10.1.1.47", 22); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 

     }.execute(1); 

    } 

    public static String executeRemoteCommand(String usrname, String passwd, String hostname, int Port) throws Exception { 
     JSch jsch = new JSch(); 
     Session session = jsch.getSession(usrname, hostname, 22); 
     session.setPassword(passwd); 

     Properties prop = new Properties(); 
     prop.put("StrictHostKeyChecking", "no"); 
     session.setConfig(prop); 

     session.connect(); 

     ChannelExec channelssh = (ChannelExec) session.openChannel("exec"); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     channelssh.setOutputStream(baos); 

     channelssh.setCommand("ls"); 
     channelssh.connect(); 
     channelssh.disconnect(); 
     return baos.toString(); 
    } 
} 

有人可以告訴我什麼是錯?我應該在終端上看到樹莓派上的命令嗎?

回答

1

你不會在pi的終端上看到命令。當你建立一個ssh連接時,你正在創建一個新的終端進程,在你的pi屏幕上運行的終端將不會顯示打字或命令,這不是ssh的工作方式。您需要捕獲輸出並將其顯示在Android設備上。

您可以在您的pi上運行who以查看通過ssh連接的帳戶。

+0

aaahhh!這應該是顯而易見的!謝謝! – IJustNeedHelp

+0

你能告訴我一個如何更新我的代碼來打印出當前ssh連接響應的例子嗎?我輸入「who」,但沒有看到設備連接(我沒有使用模擬器,我正在手機上運行代碼)。 注意:我可以使用同一部手機或任何筆記本電腦ssh進入樹莓派,並在「回覆」中查看連接。 – IJustNeedHelp

+0

調用'channelssh.getInputStream();'獲取流,然後使用流讀取器(如'BufferedReader')讀取結果。 – ChrisStillwell

1

Can someone please show me what is wrong???

我沒有看到任何錯誤。

Should I see the commands on the raspberry pi in terminal?

像ChrisStillwell說,你正在創建一個新的終端的過程和你的PI的屏幕上運行的終端將不會顯示發送的命令。如果您正在嘗試查看發送的命令的結果,則可以將其存儲在字符串變量中(以稍後將其顯示在TextView或Toast上):

@Override 
      protected Void doInBackground(Integer... params){ 
       try { 
        String result = executeRemoteCommand("pi", "green1", "10.1.1.47", 22); 
        Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
+0

這絕對是我的後續問題,但現在與此我得到一個運行時錯誤:「不能創建處理程序內部線程沒有調用Looper.prepare()」 – IJustNeedHelp

+0

本質上,我有一個程序寫在樹莓Pi請求用戶輸入以完成不同的任務,並且我只想製作一個簡單的用戶界面來有效地使用按鈕進行操作。 – IJustNeedHelp