Проблемы с определенными командами unix при использовании Jsch (Exec) на Android

Привет, я проводил пару дней, занимался исследованиями и анализом проблем, но я не знаю, как решить мою проблему прямо сейчас.

Может кому поможет ....

Я использую Jsch для устройств Android, чтобы получить доступ к моему Raspberry Pi, чтобы установить некоторые конкретные команды.

Я начал с команды оболочки Jsch, и все работало нормально, за исключением того факта, что я никогда не мог закрыть соединение из-за бесконечного цикла.

Я попытался переключиться на Exec, особенно потому, что я просто хочу отправить пару команд и мне не нужно разбираться в том, что происходит в оболочке.

В любом случае ... вот мой код: Намерение состоит в том, чтобы отправить сигнал сна 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. Это означает, что команда не найдена .... поэтому я предполагаю, что существует большая разница между командами оболочки и exec ... с оболочкой я работаю как шарм на ssh.

Я надеюсь, что вы можете мне помочь.

::: Обновление, так как я впервые работал с Pipes | которых недостаточно для exec, и мне пришлось добавить выходной поток, чтобы отправлять команды после подключения к каналу, я смог реализовать отправку команд на свой телевизор ... спасибо


person DerKai    schedule 04.12.2013    source источник
comment
Я не знаком с вашей настройкой, но ваша проблема может заключаться в том, что echo 'tx 10 36' | cec-client -s -d 1 требует shell для интерпретации символа вертикальной черты, в то время как команда exec обычно вызывает процесс напрямую без оболочки в качестве посредника. Возможно, вы сможете найти способ вызвать cec-client и отправить данные в его стандартный ввод. Или, возможно, вы можете создать настраиваемый cec-клиент, который делает это без ввода или принимает строку в качестве аргумента командной строки.   -  person Chris Stratton    schedule 05.12.2013
comment
Спасибо за быструю обратную связь, я не хочу добавлять какой-либо код в raspberry, но хочу сохранить его как инкл. установка XBMC, запущенная на нем, чтобы иметь возможность выполнять одну и ту же задачу на нескольких устройствах. ... Но Трубка - хороший намек, может быть, я смогу придумать, как справиться с этим.   -  person DerKai    schedule 05.12.2013
comment
Посмотрите, сможете ли вы запустить чистый процесс cec-client и использовать что-то вроде channel.getOutputStream для записи строковых данных в этот процесс вместо echo и pipe.   -  person Chris Stratton    schedule 05.12.2013
comment
Даже если я не использую канал, а только команду cec, я получаю сообщение 127   -  person DerKai    schedule 05.12.2013
comment
Возможно, есть проблема с путями? Что, если вы найдете полный путь к команде cec и воспользуетесь им?   -  person Chris Stratton    schedule 05.12.2013
comment
Мне удалось запустить первую часть команды cec, но поскольку она ожидает ввода, я не пойду дальше ... Я пробовал эти три строки: OutputStream out = channel.getOutputStream (); out.write (tx 10 36.getBytes ()); out.flush ();   -  person DerKai    schedule 05.12.2013
comment
Попробуйте отправить новую строку. А может потом закрой стрим.   -  person Chris Stratton    schedule 05.12.2013
comment
я пробовал channel.setCommand (command2); после того, как я открыл канал ... но это не сработало. просто притворился, что второй команды не существует --- я также обновил код выше ... чтобы кратко рассказать о моем статусе здесь.   -  person DerKai    schedule 05.12.2013
comment
Не уверен, зачем вы это сделали. Я бы попробовал одну команду cec-client -s -d 1, а затем протолкнул tx 10 36 \ n (или все, что вам нужно сделать для кодирования новой строки) в OutputStream, а затем, возможно, закройте поток. Если у вас есть шестнадцатеричный дамп на этой платформе, вы можете попробовать использовать его в качестве тестового целевого процесса вместо cec-client и убедиться, что новая строка проходит.   -  person Chris Stratton    schedule 05.12.2013
comment
О, и не вставляйте эхо в строку, которую вы пишете. echo - это программа, которую вы бы больше не использовали, а не часть данных, которые вы хотите передать в процесс cec-client   -  person Chris Stratton    schedule 05.12.2013
comment
Извините, вчера для меня было слишком поздно ... по немецкому времени. * Я обновил свой код выше и добавил / r / n к строке, которую я собирался сбросить. на самом деле это был открытый вопрос. Еще раз спасибо за вашу поддержку.   -  person DerKai    schedule 05.12.2013


Ответы (1)


Я обновил свой код выше и добавил / r / n к строке, которую собирался сбросить. на самом деле это был открытый вопрос. - ДерКай

person Community    schedule 05.10.2016