Php запустить от другого пользователя

Запуск exec от имени другого пользователя

Можно ли запустить exec() в качестве другого пользователя (в моем поле он работает как www-data). Я хочу выполнить script, которому нужен доступ к файлам, которые не принадлежат www-данным.

4 ответа

У меня было аналогичное требование несколько лет назад, что потребовалось несколько PHP-скриптов, чтобы поговорить с последовательным портом. Первым последовательным портом обычно является /dev/ttyS 0, принадлежащий root и в групповом dialout. Для моей начальной настройки я добавил своего пользователя apache к групповому dialout. Сценарии PHP могли напрямую разговаривать с последовательным портом без проблем. Однако только один экземпляр script может открыть последовательный порт в любой момент времени, поэтому это решение не сработает. Затем я создал демон, обеспечивающий уровень между последовательным портом и скриптами PHP. Сценарии PHP будут разговаривать с демоном по именованному каналу, и тогда демон будет отформатировать запросы и передать их на последовательный порт — выполняя немного кэширования на этом пути. Таким образом, либо добавляйте www-данные, либо независимо от вашего пользователя apache, группе, которая владеет этими файлами, предоставляет разрешения на выполнение группы или использует прокси-сервер, как и я. Если безопасность касается вас, тогда я поеду с последним.

Если у вас есть доступ к конфигурации сервера (предполагается, что это Apache), вы можете использовать suPHP. В конфигурации виртуального хоста вы можете явно указать пользователя и группу, для которых выполняется PHP скрипт:

 . suPHP_UserGroup user group . 

Этот параметр доступен для конфигураций suPHP, построенных с помощью опции —with-setid-mode=paranoid . Другим способом изменить идентификатор пользователя будет posix_setuid() , для которого требуются соответствующие привилегии. Это означало бы запуск ваших PHP-скриптов как root, что является проблемой безопасности serios.

Нет, не напрямую. Если вы работаете на Linux-машине и имеете права, вы можете установить бит setuid в свой файл. Имейте в виду, что веб-сервер работает по-разному. Это очень важный механизм безопасности, и, обойдя его, вы можете вызвать уязвимость безопасности.

Вы можете изменить пользователя, под которым работает ваш сервер. Это можно легко сделать, используя версию apache для windows (apache работает там как служба, и легко настроить пользователя, под которым выполняется apache). Какую конфигурацию сервера вы используете?

Использую Ubuntu Lucid. Я не хочу менять пользователя, под которым работает Apache, так как это будет представлять угрозу безопасности, но я создал несколько внутренних приложений, которым требуется доступ к файлам, не принадлежащим www-данным. Как насчет создания группы, содержащей www-данные и владельца файлов?

это будет другой вариант, который будет работать. изменение пользователя apache представляет собой только угрозу безопасности, если yozu назначает пользователя с правами высокого уровня (например, root)

Ещё вопросы

  • 1 Линия между двумя перетаскиваемыми точками на холсте matplotlib pyqt5
  • 0 Селектор атрибутов jQuery в IE
  • 0 ng-repeat возвращает TypeError: невозможно прочитать свойство ‘insertBefore’ из null
  • 0 Как отключить гиперссылку в зависимости от условий в кендо?
  • 1 Regex.Заменить перегрузку?
  • 0 jQuery Mobile: уберите метку с диапазона и сделайте слайдер шире
  • 0 Используя библиотеку PHP Podio, не могу получить данные рейтинга через PodioItem :: get ($ id)
  • 0 Если в iframe показать / скрыть div
  • 0 Свежие данные MySQL через запрос с использованием Python
  • 0 как скользить изображения в угловых JS?
  • 0 эхо UPLOADPATH. $ row [‘image’] не отображает имя файла
  • 0 AngularJs: всплывающее окно Datepicker не определено
  • 1 Как открыть конкретный экран после нажатия на уведомление?
  • 1 Нервный текст при масштабировании анимации с помощью JavaScript
  • 0 импорт модуля python, который находится в C ++, скомпилирован с gcc 4.4.3
  • 0 Выборка площади против выборки BRDF при рендеринге
  • 0 angularjs публикует сложные данные в WebApi 2
  • 0 Ошибка Angular.js: Дубликаты в повторителе не допускаются — Отслеживание по индексу не работает
  • 0 Добавление и удаление элементов в / из списка (AngularJS)
  • 1 ImportError: нет модуля с именем textract
  • 0 Простой способ переключения значения кнопки
  • 1 Robot Framework, расширяющий селен для обработки элемента нагрузки
  • 1 Как конвертировать stringVar () из tk в pyqt
  • 1 Невозможно заставить Firebase работать без сборки Gradle: отсутствует google_app_id. Аналитика Firebase отключена
  • 0 Окна Div сдвигаются, если я помещаю в них текст
  • 0 G ++ с Mountain Lion поддерживает -msse4.2?
  • 0 mmap и выравнивание страниц данных — это увеличивает производительность?
  • 0 Различные результаты PHP между терминалом и браузером
  • 0 установить фокус, нажав на элемент, но исключая некоторые дочерние элементы
  • 1 Маршрутизатор не определен Node.js
  • 1 Как объединить неравномерный 2-мерный массив в 1-й массив (Java)
  • 0 MessageBox Threading Проблемы
  • 1 Чистая архитектура входа в систему
  • 1 Рекурсивное чтение древовидной структуры XML в списке
  • 0 Rails Active Record Query Total отправляется в будний день
  • 0 Вычеркнуть несколько текстов в опции выбора
  • 0 Шаблонный класс C ++ с пользовательским поведением для контейнеров против примитивных типов?
  • 1 получить сообщение, если отправить электронную почту не удалось C # и Gmail
  • 0 Текстовые блоки над изображениями
  • 1 hdf5storage.write () не сохраняет в указанный путь?
  • 1 Как я могу скопировать триангуляцию Делоне в новые точки?
  • 1 Строка для XMLGregorianCalendar проблема
  • 1 Как установить имя файла при загрузке файла? [Дубликат]
  • 0 Ошибка Facebook и Codeigniter T_OBJECT_OPERATOR
  • 1 Отправка писем выполняется асинхронно после возвращения результата просмотра
  • 1 Качели и Явафкс
  • 1 Как объединить значения из групп в столбце в Python
  • 1 C # добавить схему в URI
  • 0 Выбор столбцов для вставки в таблицу с условием где
  • 0 Элементы исчезают и исчезают с jQuery, вызывая проблемы
Читайте также:  Php exit from class

Источник

Запуск exec как другого пользователя

Можно ли запустить exec () как другой пользователь (на моем поле он работает как www-data). Я хочу выполнить скрипт, которому нужен доступ к файлам, которые не принадлежат www-данным.

Несколько лет назад у меня было аналогичное требование, которое требовало нескольких скриптов PHP для последовательного порта. Первым последовательным портом обычно является / dev / ttyS0, принадлежащий root и групповому dialout.

Для моей начальной настройки я добавил своего пользователя apache к групповому dialout. Сценарии PHP могли напрямую разговаривать с последовательным портом без проблем. Тем не менее, только один экземпляр скрипта может открыть последовательный порт в любой момент времени, поэтому это решение не сработает.

Затем я создал демон, обеспечивающий уровень между последовательным портом и скриптами PHP. Сценарии PHP будут разговаривать с демоном по именованному каналу, и демон будет отформатировать запросы и передать их на последовательный порт – делая немного кэширования на этом пути.

Таким образом, либо добавляйте www-данные, либо независимо от вашего пользователя apache, группе, которая владеет этими файлами, предоставляет разрешения на выполнение группы или использует прокси-сервер, как и я. Если вас беспокоит безопасность, я поеду с последним.

Если у вас есть доступ к конфигурации сервера (предполагается, что это Apache), вы можете использовать suPHP . В конфигурации виртуального хоста вы можете явно указать пользователя и группу, для которых выполняется PHP-скрипт:

 . suPHP_UserGroup user group .  

Этот параметр доступен для конфигураций suPHP, построенных с параметром —with-setid-mode=paranoid .

Другим способом изменить идентификатор пользователя будет posix_setuid() для которого требуются соответствующие привилегии. Это означало бы запуск ваших PHP-скриптов как root , что является серьезной проблемой безопасности.

Нет, не напрямую. Если вы работаете на Linux-машине и имеете права, вы можете установить бит setuid в свой файл.

Читайте также:  Java break on exception

Имейте в виду, что веб-сервер работает по-разному. Это очень важный механизм безопасности, и, обойдя его, вы можете вызвать уязвимость безопасности.

Вы можете изменить пользователя, под которым работает ваш сервер. Это можно легко сделать, используя версию apache для windows (apache работает там как служба, и легко настроить пользователя, под которым выполняется apache).

Какую платформу вы используете?

Источник

Запуск сценария оболочки из PHP от имени другого пользователя (не root)

Я пытаюсь запустить оболочку script, принадлежащую не-привилегированному пользователю из PHP на сервере Ubuntu. Проблемы с разрешениями запускают его с exec() непрактичным, так как он www-data запускает его. Я немного искал Google и нашел ссылки varius на suExec (что кажется слишком большим количеством хлопот, чтобы работать над такой небольшой проблемой), установка бита suid и интересный подход здесь, в Stackoverflow, включающий сервер Python, который прослушивает переданные команды по PHP. В любом случае, из всех этих решений я склоняюсь к тому, что касается установки бита suid, попробовал его, и это не сработало: chmod u+s script.sh , и мои журналы Apache все еще показывают ошибки разрешений, поэтому я знаю, что script не работает как его владелец, а как www-data . Что мне нужно сделать, чтобы заставить это работать, и есть ли более простое решение этой проблемы?

Нет. Вашему пользователю (www-data) нужны права на исполнение для запуска скрипта. В чем корень проблемы, которая заставляет вас хотеть использовать сценарий оболочки, возможно, у него есть полезный ответ.

По сути, я пытаюсь создать собственную версию php.opensourcecms.com (демонстрации CMS с открытым исходным кодом, которые автоматически сбрасываются через некоторое время). У меня уже есть cron, работающий как непривилегированный пользователь, запускающий скрипт каждые 2 часа, но я бы хотел добавить функциональность, чтобы он выполнялся по требованию. Я мог бы запустить его как www-data, но это означает, что у меня также есть его для запуска из cron www-data, поскольку замененные файлы принадлежат www-data. В любом случае, я бы не хотел, чтобы www-данные владели всеми файлами из соображений безопасности.

Читайте также:  Print with php code

Удаляет каталог CMS, резервное копирование Untar, удаление / создание / импорт резервной копии базы данных, и это все .

Источник

exec

Команда (имя программы с аргументами — прим.пер.), которая будет исполнена.

Если параметр output указан, то массив будет заполнен строками вывода программы. Завершающие пробелы, такие как \n (перевод строки — прим.пер.), включены в массив не будут. Обратите внимание, что если массив уже содержит какие-либо элементы перед вызовом функции exec() , то вывод команды будет дописан в конец массива. Если же вы не хотите дополнять предыдущее содержимое массива, следует вызвать функцию unset() с именем массива в качестве аргумента перед его передачей в качестве аргумента функции exec() .

Если заданы оба параметра return_var и output , то при выходе эта переменная будет содержать статус завершения внешней программы.

Возвращаемые значения

Последняя строка вывода при исполнении заданной команды. Если требуется исполнить команду и получить все данные программы обратно без какой-либо обработки, следует использовать функцию passthru() .

Для получения вывода исполняемой программы, убедитесь, что параметр output инициализирован и используется.

Примеры

Пример #1 Пример функции exec()

// выводит имя пользователя, от имени которого запущен процесс php/httpd
// (применимо к системам с командой «whoami» в системном пути)
echo exec ( ‘whoami’ );
?>

Примечания

Если вы собираетесь передавать функции пользовательские данные, используйте функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не смогли обмануть систему, запустив произвольную команду.

Замечание:

Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.

Замечание: В случае работы в безопасном режиме, вы можете запускать что-либо только в пределах safe_mode_exec_dir. В настоящее время по практическим причинам запрещено использование .. в качестве компонента пути к исполняемому файлу.

В случае работы в безопасном режиме, строка с командой экранируется с помощью escapeshellcmd() . Таким образом echo y | echo x становится echo y \| echo x.

Смотрите также

  • system() — Выполняет внешнюю программу и отображает её вывод
  • passthru() — Выполняет внешнюю программу и отображает необработанный вывод
  • escapeshellcmd() — Экранирует метасимволы командной строки
  • pcntl_exec() — Executes specified program in current process space
  • backtick operator

Источник

Оцените статью