PHP exec() зависает во время выполнения команды SSH на RHEL 9 и не возвращает никаких результатов или статусаPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 PHP exec() зависает во время выполнения команды SSH на RHEL 9 и не возвращает никаких результатов или статуса

Сообщение Anonymous »

Я выполняю команду SSH на удаленном хосте, используя функцию PHP exec() внутри цикла foreach. В зависимости от условия команда выполняется только на 4-й и 6-й итерациях. В обеих итерациях выполняется одна и та же команда SSH.
На 4-й итерации команда выполняется успешно, выдает выходные данные, и сценарий переходит к следующей итерации, как и ожидалось. Однако во время 6-й итерации команда успешно завершается на удаленном хосте, но сценарий PHP зависает — exec() не возвращает никаких выходных данных или статуса выхода, и код не переходит к следующей строке. Из-за этого индикатор выполнения браузера никогда не загружается.

Код: Выделить всё

$cmd = "ssh -x user@ sudo /acorn/bin/upgrade y";
exec($cmd, $output, $result);
На 4-й итерации я копирую образ обновления в каталог /tmp на удаленном хосте, а затем запускаю команду обновления y. Это работает правильно и возвращает выходные данные.
На 6-й итерации я перемещаю файл раздела в каталог /tmp, а затем запускаю ту же команду обновления y. Обновление завершается успешно на удаленном хосте, но PHP зависает, поскольку exec() не возвращает никаких выходных данных или результатов.
Я подозреваю, что session_write_close() (вызываемый после exec()) может влиять на выполнение. Может ли session_write_close() вызвать блокировку или зависание exec()?
Я попробовал следующие обходные пути, но ни один из них не решил проблему:
  • Вызвал session_write_close() после exec(), затем перезапустил
    сеанс с помощью session_start().
  • Заменил exec() на proc_open(), но по-прежнему нет вывода или результата.
  • Поскольку команда SSH выполняется в течение длительного времени, я добавил тайм-аут к команде
    SSH. Это привело к следующему: sudo: требуется пароль. Общее
    соединение с закрыто.
Чтобы устранить проблему с паролем, я настроил sudo без пароля для команды обновления y и добавил в файл sudoers:

Код: Выделить всё

             Defaults:user !requiretty
user ALL=(ALL) NOPASSWD: /acorn/bin/upgrade*
на удаленном хосте, но проблема остается.
  • Пытался принудительно вывести вывод в браузер с помощью ob_implicit_flush(true),
    вместе с комбинациями ob_start(), ob_flush(),lush() и
    ob_end_flush(). Это не решило проблему.
  • Выполнил команду SSH с использованием sudo -n и BatchMode=yes, чтобы избежать
    запроса пароля, поэкспериментировал с удалением -tt для изменения поведения TTY
    и настроил область действия sudo без пароля специально для
    полного пути к команде и аргументов. Несмотря на это, exec() по-прежнему
    зависает в RHEL 9.
Примечание. Этот же код PHP корректно работает в CentOS. Проблема началась только после перехода на RHEL 9.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -output-or
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»