Итак, я делаю одну простую вещь, во-первых, я выполняю команду через ssh2_exec (после успешной аутентификации), а затем читаю ответ в переменной. Мой код ниже (без Authenticate)feof генерирует бесконечный цикл
try {
$stdout_stream = ssh2_exec($this->connection, $_cmd);
$stderr_stream = ssh2_fetch_stream($stdout_stream, \SSH2_STREAM_STDERR);
} catch (Exception $e) {
$std_output = $e->getMessage();
return false;
}
$output = "";
while (!feof($stdout_stream)) {
$output .= fgets($stdout_stream, 4096);
}
while (!feof($stderr_stream)) {
$output .= fgets($stderr_stream, 4096);
}
fclose($stdout_stream);
fclose($stderr_stream);
return $output;
Например я пытаюсь выполнить такие ЦМД:
sudo service httpd stop && sudo service httpd start
Так что, когда команда выполняет хорошо все хорошо, ответ
Выключение HTTPD : [OK] Запуск httpd: [OK]
Но когда я пытаюсь установить insta сть выполнить такую команду без Судо
service httpd stop && service httpd start
Я знаю, что сервер говорит что-то вроде «команда не найдена» или как это, но я не могу получить эту ошибку, скрипт выполняет бесконечно.
Я попытался переписать свой код таким образом (или другой похож на это)
$dataString = fgets($stdout_stream);
if($dataString == "\n" || $dataString == "\r\n" || $dataString == "") {
//var_dump("Empty line found.");
}
if($dataString === false && !feof($stdout_stream)) {
//var_dump("not string");
} elseif($dataString === false && feof($stdout_stream)) {
//var_dump("We are at the end of the file.\n");
break;
} else {
//else all is good, process line read in
$output .= $dataString;
}
}
, но результат тот же.
Таким образом, проблема заключается в том, что мы не можем сказать заранее, какой причиной является бесконечный цикл $stdout_stream
или $stderr_stream
.
Я использую PHP 5.3.
В перезаписанной версии вашего кода вы всегда попадаете в случай «$ output. =» Или другие? Если это sudo, который делает разницу, вы можете сделать проверку разрешений? В общем случае бесконечные петли могут быть вызваны плохим «критерием остановки» («stop case», «cas d'arrêt») или неправильным шагом/шагом к следующей итерации. Возможно, ответы на эти вопросы помогут вам. Удачи –
Благодарим за отзыв. Иногда 'fgets ($ stdout_stream)' возвращает false, даже когда команда выполняется успешно в конечном счете, поэтому я не могу рассчитывать на это, когда знаю, что команда не будет работать хорошо. У Auth_User есть разрешения для перезапуска службы httpd. –
Является ли «www-data» частью группы «Auth_User»? Если нет, возможно, предоставление www-данных прав на выполнение httpd будет делать трюк. (Chown) –