PHP shell_exec возвращает пустую строку, при выполнении той же команды вручную не выполняется

#php #shell #ssh #scp

#php #оболочка #ssh #scp

Вопрос:

В настоящее время у меня какое-то странное поведение от shell_exec, которое я не могу понять.

Это мой код:

         $cmd = ('sshpass -p PASSWORD scp -o StrictHostKeyChecking=no ../../UpdateFiles/' . $FILENAME . ' root@' . $IP . '://media/sdcard');
        $output = shell_exec($cmd);
        if (empty($output)){
            $cmd = ('sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no root@' . $IP . ' /sbin/start_sw_upgrade_process sdcard /media/sdcard ' . $FILENAME);
            $output = shell_exec($cmd);
            if (empty($output)){ $output = "No return from update command"; }
        }
        printf("%s",$output);
  

Итак, первая команда работает по назначению, ничего не возвращая только в случае успеха. Это можно легко проверить по файлу, который сейчас находится на SD-карте.

Как только файл был передан на другое устройство, должна выполняться следующая команда. Эта команда должна запустить инструмент, который должен начать использовать файл. Поскольку я просто использую фиктивный файл, он должен возвращать и ошибку.

Однако, когда я выполняю этот код, возвращается пустая строка, поскольку она просто выводит «Нет возврата из команды обновления»

Однако, если я иду и выполняю команду вручную в том же каталоге, что и файл php (заполняя переменные вручную ofc), возвращается ошибка.

Выполняется ли команда, но просто ничего не возвращает, или команда вообще не выполняется, я не слишком уверен.

Но я также использую аналогичные команды в других местах, таких как:

         $cmd = ('sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no root@' . $IP . ' df | grep sdcard');
        $output = shell_exec($cmd);
  

В этом случае все работает так, как ожидалось. Так что я не совсем понимаю, почему этого не происходит в данном случае.

Это какая-то глупая очевидная ошибка?

Я недавно изменил ее, поэтому вместо вывода «нет возврата из команды обновления» выводится команда, которая была только что выполнена. Когда я копирую эту команду и выполняю ее в точно такой же ситуации, я получаю вывод. Почему это работает только вручную?

Ответ №1:

Хорошо, это заняло некоторое время, но я понял, в чем была реальная проблема.

Таким образом, shell_exec() и exec() читают только из sdtout, они не читают из sdterr. В то время как обычная консоль оболочки преобразует ошибки в стандартный вывод, функции в php этого не сделают.

Таким образом, выходные данные функций были фактически пустыми, поскольку единственным выводом были ошибки. чтобы исправить это, я добавил аргумент «1>amp;2» в конец команды. Это перенаправляет вывод ошибки на стандартный вывод. И теперь, когда функция вызывается, я получаю выходные данные вместо пустой строки.