PHP создает «поддельный» TTY для sudo

Будьте кратки;

PHP-скрипт должен запускать /etc/init.d/nagios reload, добавлен apache ALL = (nagios) NOPASSWD: /etc/init.d/nagios в файл sudo-ers, но для использования SUDO PHP потребуется TTY (я не хочу удалять Defaults requiretty, поэтому я хочу «подделать» или создать TTY для PHP-скрипта, чтобы он может перезагрузить Nagios.

Редхат 6, PHP 5.3


person Unfortunate    schedule 03.11.2011    source источник
comment
Вы должны вызывать его через screen или expect. Даже не знал бы, как программно настроить псевдотерминал, но это, безусловно, невозможно из PHP.   -  person mario    schedule 03.11.2011
comment
Взгляните на это: Передача данных в программу Linux, которая ожидает TTY (терминал)   -  person jcubic    schedule 03.05.2017


Ответы (1)


Это можно сделать — параметр sudo requiretty относительно легко обойти, так что сам по себе он не особо повышает безопасность. Если вы действительно уверены, что хотите оставить его включенным (может быть, вам нужно поддерживать запуск вашего скрипта в системах пользователей, в которых requiretty включен по умолчанию?), то создание tty действительно может быть правильным решением.

Это, вероятно, было бы огромной болью в чистом PHP. Я просмотрел справочные документы на php.net и не вижу никаких указаний на то, что у него есть какие-либо встроенные служебные функции для выделения или использования ptys. Если вы действительно хотите сделать это на чистом PHP, вам, вероятно, потребуется обратиться к исходному коду glibc для вызова forkpty() (включая другие его зависимости, такие как openpty(), getpt(), grantpt(), разблокировать () и т. д.). По своей сути, это будет включать вызов open() главного псевдотерминального устройства в /dev/ptmx для получения дескриптора основного PT-файла, выполнение chown и ioctl TIOCSPTLCK, а затем определение того, какое устройство в /dev/pts является соответствующим подчиненным. fd и открыть его.

Но я бы настоятельно рекомендовал выполнять часть подделки tty вне PHP, возможно, открыв какой-нибудь скрипт-оболочку sudo в Python (у которого есть несколько удобных функций в модуль pty) или даже bash + что-то вроде сокат.

person the paul    schedule 26.04.2012