#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» в конец команды. Это перенаправляет вывод ошибки на стандартный вывод. И теперь, когда функция вызывается, я получаю выходные данные вместо пустой строки.