2017-02-06 2 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 연결을 설정하면, 파이의 화면에서 실행중인 터미널에는 타이핑이나 명령이 표시되지 않습니다. 이것은 ssh의 작동 방식이 아닙니다. 출력을 캡쳐하여 Android 장치에 표시해야합니다.

파이에 who을 실행하면 ssh를 통해 연결된 계정을 확인할 수 있습니다.

+0

aaahhh! 그것은 분명해야했다! 감사! – IJustNeedHelp

+0

현재 ssh 연결 응답을 인쇄하도록 내 코드를 어떻게 업데이트 할 수 있는지 보여 줄 수 있습니까? 나는 "누구"라고 입력했는데 장치 연결을 보지 못했습니다 (시뮬레이터를 사용하지 않고 전화로 코드를 실행 중입니다). 참고 : 동일한 전화 또는 랩톱으로 라즈베리 파이에 ssh 연결할 수 있으며 누가 응답했는지 확인할 수 있습니다. – IJustNeedHelp

+0

'channelssh.getInputStream();'을 호출하여 스트림을 가져온 다음 스트림 판독기 (예 :'BufferedReader')를 사용하여 결과를 읽습니다. – ChrisStillwell

1

Can someone please show me what is wrong???

나는 이상한 점이 보이지 않습니다. ChrisStillwell처럼

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

은 새 터미널 프로세스를 생성하고 당신의 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, 그리고 버튼을 사용하여 효과적으로이를 수행 할 수있는 간단한 UI를 만들고 싶습니다. – IJustNeedHelp