【问题标题】:Problems with specific unix commands while using Jsch (Exec) on Android在 Android 上使用 Jsch (Exec) 时特定 unix 命令的问题
【发布时间】:2013-12-04 21:53:28
【问题描述】:

您好,我做了几天研究和一些问题分析,但我现在不知道如何解决我的问题。

也许有人可以帮忙....

我正在使用 Jsch for Android 设备来访问我的树莓派,以便设置一些特定的命令。

我从 Jsch shell 命令开始,除了由于无限循环而无法关闭连接这一事实之外,一切都运行良好。

我尝试切换到 Exec 尤其是因为我只想发送几个命令,并不需要真正了解 shell 上发生的事情。

无论如何...这是我的代码: 目的是向我的电视发送一个 cec 睡眠信号......

 public c_jsch(String userName, String password,
                  String connectionIP, String knownHostsFileName)
{
    JSch jsch = new JSch();
    System.out.println("com.jcraft.jsch BBÄÄÄHHMM");
    try
    {
        Session session = jsch.getSession("pi", "192.168.188.23", 22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword("raspberry");
        session.connect();

        String command = "/home/pi/.xbmc-current/xbmc-bin/bin/cec-client -s -d 1";
        String command2 = "tx 10 36 \r \n";

        ChannelExec channel = (ChannelExec) session.openChannel("exec");
        channel.setCommand(command);

        channel.setInputStream(null);

        channel.connect();
        InputStream in = channel.getInputStream();
        //NOT YET USEFUL
        OutputStream out = channel.getOutputStream();

        System.out.println("com.jcraft.jsch Unix system connected...");

        byte[] tmp = new byte[1024];
        while (true)
        {
            while (in.available() > 0)
            {
                int i = in.read(tmp, 0, 1024);
                if (i < 0){
                    break;
                }
                System.out.print("com.jcraft.jsch Feedback: " + new String(tmp, 0, i));
                // NOT WORKING
                out.write(command2.getBytes());
                out.flush();
                System.out.println("com.jcraft.jsch Command flushed");
            }
            if (channel.isClosed())
            {
                System.out.println("com.jcraft.jsch exit-status: " + channel.getExitStatus());
                break;
            }
            try
            {
                Thread.sleep(1000);
            }
            catch (Exception ee)
            {
            }
        }
        channel.disconnect();
        session.disconnect();
        System.out.println("com.jcraft.jsch exit-status: DONE");
    }
    catch (Exception e)
    {
        System.out.println("com.jcraft.jsch exit-status: " +  e.getMessage());
    }
}

尝试此代码不会引发错误消息,但会出现令人失望的退出状态消息:127。 这意味着找不到命令....所以我认为 shell 和 exec 命令之间存在很大差异...使用 shell 我就像 ssh 上的魅力一样。

我希望你能帮助我。

:::Update,因为我第一次使用 Pipes |这对于 exec 来说还不够,必须添加 Outputstream 才能在连接到频道后发送命令我能够实现向我的电视发送命令...谢谢

【问题讨论】:

  • 我不熟悉你的设置,但你的问题可能是 "echo 'tx 10 36' | cec-client -s -d 1" 需要 shell 来解释管道字符,而“exec”命令通常直接调用进程而无需 shell 作为中介。也许您可以找到一种调用 cec-client 并将数据推送到其标准输入的方法。或者,也许您可​​以构建一个自定义的 cec 客户端,它无需输入即可执行此操作,或者将字符串作为命令行参数。
  • 感谢您的快速反馈,我不想向树莓派添加任何代码,但希望保留它的原样。在其上运行的 XBMC 设置能够在多个设备上执行相同的任务。 ...但是管道是一个很好的提示,也许我可以想办法解决这个问题
  • 看看你是否可以启动一个裸 cec-client 进程并使用类似 channel.getOutputStream 的东西将字符串数据写入该进程,而不是 echo 和管道。
  • 即使我不使用管道而只使用 cec 命令,我也会收到 127 消息
  • 可能是路径问题?如果您找到 cec 命令的完整路径并使用它怎么办?

标签: android linux shell exec jsch


【解决方案1】:

我更新了上面的代码并将 /r /n 添加到我要刷新的字符串中。这实际上是一个悬而未决的问题。 ——德凯

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2015-12-21
    • 2011-09-30
    • 2016-04-21
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多