Исполнительная команда PHP имеет результат 0, даже если ошибка происходит

Вам была бы нужна программа, которая читает вход в неканоническом режиме, и затем отобразите байты, который читал. Лично, я не знаю никакую подобную программу, таким образом, я использую кошку и передаю вывод по каналу через передозировку для наблюдения отдельных байтов, который, кажется, работает 99% времени. Когда ключ взаимодействует с терминалом (например, перемещает курсор, удаляет символ), необходимо заключить его в кавычки с Ctrl-V все же.

1
27.04.2016, 19:05
2 ответа

Я нашел немного ответа для that.for вышеупомянутым кодом, который я поместил 2>&1 в конце. Как

$execout=exec('ssh root@xxx.xxx.xxx.xx "sudo /etc/init.d/smokeping reload 2>&1"',$output1,$result);

То, когда существует ошибка, происходит в приложении, которое я собираюсь перезагрузить (smokeping), print_r($output); дает ошибку как

Array ( [0] => * Reloading latency logger daemon configuration... [1] => ERROR: can't open /etc/smokeping/devices/errorfilename: No such file or directory [2] => ...done. )

Теперь я могу обработать его отсюда. Спасибо всем.

0
27.01.2020, 23:39

В

ssh root@xxx.xxx.xxx.xx "sudo /etc/init.d/smokeping reload"

Ваша оболочка

(1) (или в Вашем примере оболочка, запущенная PHP's exec()) проанализирует ту командную строку и, если найдено выполнять a ssh

(2) Команда, которая свяжется с a sshd

(3) Сервер на xxx.xxx.xxx.xx который после успешной аутентификации назовет a shell

(4) Который интерпретирует это sudo командная строка и выполненный sudo

(5) Команда, которую после проверки полномочий выполнит /etc/init.d/smokeping

(6) Который самостоятельно является, вероятно, сценарием оболочки, который выполняет несколько команд.

Несколько вещей могут перестать работать там. Если все шаги один к 5 успешны, то статус выхода /etc/init.d/smokeping будет сообщаться Вашей оболочке потому что sudo действительно сообщает статус выхода команды, которую он выполняет и удаленные выходы оболочки со статусом выхода последней команды, которую он выполнил и ssh сообщает статус выхода удаленной оболочки.

Теперь, команды возвращают ненулевой статус выхода, условно, чтобы сообщить вызывающей стороне, что им не удалось сделать то, что их попросили сделать.

В Вашем случае, также /etc/init.d/smokeping решенный, что независимо от того, что ошибка произошла, был недостаточно для гарантирования ненулевого статуса выхода, или тот сценарий не записан правильно и не удается возвратиться с ненулевым статусом выхода на отказ (или некоторый патологический случай, включающий недостойное поведение или неверную конфигурацию ssh, sudo или удаленная оболочка).

/etc/init.d сценарии часто пишутся с set -e. С тем включенным флагом оболочка, интерпретирующая сценарий, будет выходом по умолчанию, когда команда, это выполняет сбои (с ненулевым статусом выхода провальной команды), который заставляет меня думать здесь, что мы можем быть в первой ситуации: "smokeping" действительно решает сообщить, что он успешно перезагрузил.

Пример патологического случая мог быть, например: bash используемый в качестве удаленной оболочки (bash действительно читает ~/.bashrc при вызове ssh даже при том, что это не интерактивные оболочки), и ~/.bashrc имеет что-то как:

trap 'whatever...; exit 0' EXIT

Который вызвал бы статус выхода интерактивных оболочек или оболочек, запущенных ssh или rsh всегда быть 0.

2
27.01.2020, 23:39
  • 1
    Соляриса В случае операции в секунду, не был бы успешное выполнение ssh возвратитесь 0 независимо от того, что происходит на удаленном конце? –  Mel Boyce 27.06.2013, 15:41
  • 2
    @MelBoyce, который только произошел бы в патологических случаях, ssh предназначен для возврата статуса выхода удаленной оболочки. –  Stéphane Chazelas 27.06.2013, 15:56
  • 3
    @Stephane. И Вы объясняете что очень ясный. –  Thusitha Sumanadasa 28.06.2013, 07:54

Теги

Похожие вопросы