【问题标题】:Jsch ssh to Rasperry Pi does nothingJsch ssh 到 Raspberry Pi 什么都不做
【发布时间】:2017-02-07 05:55:38
【问题描述】:

我一直在互联网上搜索答案,但我一直得到相同的结果,但我想做的就是通过 ssh 向我的树莓派发送命令行指令。如果我完全错过了一些非常明显的东西,请原谅我,但我知道我能够连接,因为如果我输入了错误的用户名或密码,我会遇到身份验证失败。所以我已连接,但我的树莓派上似乎没有发生任何事情。以下是我当前的代码:

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();
    }
}

谁能告诉我什么是错的???我应该在终端中查看树莓派上的命令吗?

【问题讨论】:

    标签: java android ssh raspberry-pi jsch


    【解决方案1】:

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

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

    【讨论】:

    • 啊啊啊!这应该是显而易见的!谢谢!
    • 你能给我一个例子,说明如何更新我的代码以打印出当前的 ssh 连接响应吗?我正在输入“谁”但没有看到设备连接(我没有使用模拟器,我正在手机上运行代码)。注意:我可以使用同一部手机或任何笔记本电脑 ssh 进入树莓派,并在 who 响应中查看连接。
    • 调用channelssh.getInputStream();获取流,然后使用流阅读器(如BufferedReader)读取结果。
    • 打开频道后要放这个吗?
    【解决方案2】:

    谁能告诉我哪里出了问题???

    我看不出有什么问题。

    我应该在终端中查看树莓派上的命令吗?

    就像 ChrisStillwell 所说,您正在创建一个新的终端进程,并且在您的 pi 屏幕上运行的终端不会显示发送的命令。如果您想查看发送命令的结果,可以将其存储在 String 变量中(以便稍后在 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;
                }
    

    【讨论】:

    • 这肯定是我的后续问题,但现在我收到运行时错误:“无法在未调用 Looper.prepare() 的线程内创建处理程序”
    • 基本上我在 Raspberry Pi 上编写了一个程序,该程序要求用户输入以完成不同的任务,我只想制作一个简单的 UI 以通过按钮有效地做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2022-07-06
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多