Вам была бы нужна программа, которая читает вход в неканоническом режиме, и затем отобразите байты, который читал. Лично, я не знаю никакую подобную программу, таким образом, я использую кошку и передаю вывод по каналу через передозировку для наблюдения отдельных байтов, который, кажется, работает 99% времени. Когда ключ взаимодействует с терминалом (например, перемещает курсор, удаляет символ), необходимо заключить его в кавычки с Ctrl-V все же.
Я нашел немного ответа для 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. )
Теперь я могу обработать его отсюда. Спасибо всем.
В
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
.
ssh
возвратитесь 0 независимо от того, что происходит на удаленном конце?
– Mel Boyce
27.06.2013, 15:41
ssh
предназначен для возврата статуса выхода удаленной оболочки.
– Stéphane Chazelas
27.06.2013, 15:56