Java Jsch ssh对Rasperry Pi什么都不做

Java Jsch ssh对Rasperry Pi什么都不做,java,android,ssh,raspberry-pi,jsch,Java,Android,Ssh,Raspberry Pi,Jsch,我一直在互联网上搜索答案,结果都是一样的,但我只想通过ssh向我的raspberry pi发送命令行指令。如果我完全错过了一些非常明显的东西,请原谅,但我知道我能够连接,因为如果我输入了错误的用户名或密码,我将获得身份验证失败。所以我是有联系的,但在我的树莓皮上似乎什么也没发生。以下是我当前的代码: package com.name.app.prynsofpi; import android.os.AsyncTask; import android.os.Bundle; import andr

我一直在互联网上搜索答案,结果都是一样的,但我只想通过ssh向我的raspberry 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();
    }
}
package com.name.app.prynsofpi;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入com.jcraft.jsch.ChannelExec;
导入com.jcraft.jsch.jsch;
导入com.jcraft.jsch.Session;
导入java.io.ByteArrayOutputStream;
导入java.util.Properties;
公共类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
新建异步任务(){
@凌驾
受保护的Void doInBackground(整数…参数){
试一试{
ExecuteMoteCommand(“pi”、“绿色1”、“10.1.1.47”、22);
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}.执行(1);
}
公共静态字符串ExecuteMoteCommand(字符串usrname、字符串passwd、字符串主机名、int-Port)引发异常{
JSch JSch=新的JSch();
Session Session=jsch.getSession(usrname,主机名,22);
session.setPassword(passwd);
Properties prop=新属性();
道具放置(“检查”、“否”);
session.setConfig(prop);
session.connect();
ChannelExec channelssh=(ChannelExec)session.openChannel(“exec”);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
channelssh.setOutputStream(baos);
channelssh.setCommand(“ls”);
channelssh.connect();
channelssh.disconnect();
返回bas.toString();
}
}

有人能告诉我怎么了吗???我应该在终端中看到raspberry pi上的命令吗

您将看不到pi终端上的命令。当您建立ssh连接时,您正在创建一个新的终端进程,在pi屏幕上运行的终端不会显示键入或命令,ssh不是这样工作的。您需要捕获输出并将其显示在Android设备上


您可以在pi上运行
who
,查看通过ssh连接的帐户。

您将看不到pi终端上的命令。当您建立ssh连接时,您正在创建一个新的终端进程,在pi屏幕上运行的终端不会显示键入或命令,ssh不是这样工作的。您需要捕获输出并将其显示在Android设备上

您可以在pi上运行
who
,查看通过ssh连接的帐户

有人能告诉我怎么了吗

我看不出有什么不对劲

我应该在终端中看到raspberry pi上的命令吗

正如Christillwell所说,您正在创建一个新的终端进程,在pi屏幕上运行的终端不会显示发送的命令。如果试图查看sent命令的结果,可以将其存储在字符串变量中(以便稍后在TextView或Toast上显示):

有人能告诉我怎么了吗

我看不出有什么不对劲

我应该在终端中看到raspberry pi上的命令吗

正如Christillwell所说,您正在创建一个新的终端进程,在pi屏幕上运行的终端不会显示发送的命令。如果试图查看sent命令的结果,可以将其存储在字符串变量中(以便稍后在TextView或Toast上显示):


啊啊!这应该是显而易见的!谢谢您能给我一个例子,说明如何更新代码以打印当前ssh连接响应吗?我输入“who”时没有看到设备连接(我没有使用模拟器,我在电话上运行代码)。注意:我可以用同一部手机或任何笔记本电脑ssh到raspberry pi,并在who响应中查看连接获取流,然后使用流读取器(如
BufferedReader
)读取结果。我是否在打开频道后放置此项?啊啊啊!这应该是显而易见的!谢谢您能给我一个例子,说明如何更新代码以打印当前ssh连接响应吗?我输入“who”时没有看到设备连接(我没有使用模拟器,我在电话上运行代码)。注意:我可以用同一部手机或任何笔记本电脑ssh到raspberry pi,并在who响应中查看连接获取流,然后使用流读取器(如
BufferedReader
)读取结果。我是否在打开通道后放置它?这肯定是我的后续问题,但现在我遇到一个运行时错误:“无法在未调用Looper.prepare()的线程内创建处理程序”基本上,我有一个在Raspberry Pi上编写的程序,该程序要求用户输入以完成不同的任务,我只想制作一个简单的UI,通过按钮有效地完成这项任务。这肯定是我的后续问题,但现在我遇到了一个运行时错误:“无法在未调用Looper.prepare()的线程内创建处理程序。”本质上,我有一个在Raspberry Pi上编写的程序,该程序请求用户输入以完成不同的任务,我只想创建一个简单的UI,以便通过按钮有效地完成此操作。
@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;
            }