Я хочу защитить каталог для загрузки файлов на моем сервере, как это красиво описано здесь, но у меня есть одна проблема, прежде чем я смогу выполнить эти инструкции. Я не знаю, от имени какого пользователя работает Apache.
Я обнаружил, что вы можете посмотреть в httpd.conf и там будет строка «Пользователь», но в моем файле httpd.conf такой строки нет, поэтому я предполагаю, что Apache работает как пользователь по умолчанию. Однако я не могу понять, что это такое.
Итак, мой вопрос (а):
Спасибо!
ps aux | egrep '(apache|httpd)'
обычно показывает, как работает apache.
Обычно вам не нужно менять пользователя по умолчанию, обычно это «никто» или «apache». Пока это не "рут";)
edit: более точная команда для перехвата двоичных файлов apache
Вы можете попробовать следующую команду:
ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'
Использовать apachectl -S
, который покажет что-то пользователя и группу Apache, примерно так:
User: name="_www" id=70
Group: name="_www" id=70
Согласно ubuntuforums.org, в Ubuntu пользователем по умолчанию для apache2 является www-data
.
Кажется, что это правда в Ubuntu 13.10 Saucy.
Из Ларс Нуден на вышеуказанном форуме.
Чтобы быть уверенным, что [пользователь] действительно установлен, проверьте фактические файлы конфигурации. Папка-зонтик,
apache2.conf
будет что-то вроде следующего,User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP}
Это ссылка на переменные среды, установленные в
/etc/apache2/envvars
.mod_suexec
также позволяет запускать сценарии от имени другого пользователя и группы.Чтобы найти виртуальные хосты, которые могут использовать альтернативных пользователей, группы или и то, и другое, проверьте конфигурации.
$ egrep "^User|^Group|^SuexecUserGroup" /etc/apache2/apache2.conf /etc/apache2/sites-available/*.conf
Для дистрибутивов на основе Red Hat это будет (обычно его пользователь, запускающий httpd, apache
):
$ egrep "^User|^Group|^SuexecUserGroup" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Я знаю, что это старый пост, но он все еще остается без ответа, поэтому я внесу предложение. Если вы не можете найти, от имени какого пользователя или группы работает Apache, возможно, попробуйте открыть файл httpd.conf. Там должны быть записи для «Пользователь» и «Группа». Вы можете не только увидеть, от имени какого пользователя должен работать Apache, но и изменить его, если почувствуете в этом необходимость.
Вы можете включить строку кода в свой PHP-скрипт:
echo exec('whoami');
Этот код будет - более или менее - в алфавитном порядке перечислить всех пользователей без полномочий root, выполняющих процессы, содержащие apache
(или чье имя содержит apache
)
ps aux | grep -v root | grep apache | cut -d\ -f1 | sort | uniq
ps aux | grep apache
пока он работает.ПРИМЕЧАНИЕ. Это тот же ответ, что и я. Переполнение стека.
Или вы можете проверить файл конфигурации apache и найти владельца и группу.
По предложению Нойо Вот:
APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}')
А потом:
echo $APACHE_USER
Альтернативный подход, по крайней мере для дистрибутивов на основе Debian / Ubuntu, - это используйте тот же метод, который использует Apache для установки своего пользователя и группы: источник /etc/apache2/envvars
!
$ echo "$(source /etc/apache2/envvars && echo "$APACHE_RUN_GROUP")"
www-data
Если вы хотите пофантазировать, вы можете подавить ошибки, если файл не найден, и указать значение по умолчанию:
$ apacheuser=$( source /fail/etc/apache2/envvars 2>/dev/null && echo "$APACHE_RUN_GROUP" || echo nobody ) $ echo "$apacheuser" nobody
Я обнаружил, что большинство предлагаемых здесь решений зависят от системы или конфигурации (в частности, большинство решений вообще не работают в MacOS), а некоторые полагаются на то, что пользователь знает, где в первую очередь находятся файлы конфигурации Apache. .
Так что я немного схитрил и позволил самому Apache сказать мне, что к чему.
Простая команда apachectl -S
расскажет вам, что вам нужно знать о запущенном экземпляре Apache, и его результаты можно будет довольно легко проанализировать. Вот мое решение, которое я использую в нескольких bash
скрипты для определения множества вещей, которые мне могут понадобиться в любой момент ...
# Store the results so we don't have to keep calling apachetl...
astatus=`apachectl -S`
# Now grab whatever you want from the result...
HTTPD_ROOT_DIR=$(expr "`echo "$astatus" | grep ServerRoot`" : ".*\"\(.*\)\".*")
HTTPD_DOC_DIR=$(expr "`echo "$astatus" | grep \"Main DocumentRoot\" `" : ".*\"\(.*\)\".*")
HTTPD_USER=$(expr "`echo "$astatus" | grep \"User:.*name=\" `" : ".*\"\(.*\)\".*")
HTTPD_GROUP=$(expr "`echo "$astatus" | grep \"Group:.*name=\" `" : ".*\"\(.*\)\".*")
Эти значения затем можно использовать как таковые:
echo $HTTPD_ROOT_DIR // /etc/httpd
echo $HTTPD_DOC_DIR // /var/www
echo $HTTPD_USER // www-data
echo $HTTPD_GROUP // www-data
Я нашел эту команду в Документы CakePHP.
HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1`
Сейчас HTTPDUSER
содержит имя пользователя, который запускает сервер, echo $HTTPDUSER
в моем случае выходы www-data
-с помощью rlerdorf / php7dev.
Используйте lsof и передайте порт, который apache прослушивает, в качестве аргумента. См. Столбец USER для пользовательского приложения, от имени которого выполняется.
# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 21058 root 4u IPv6 74730 0t0 TCP *:http (LISTEN)
httpd 21111 www-data 4u IPv6 74730 0t0 TCP *:http (LISTEN)
httpd 24915 www-data 4u IPv6 74730 0t0 TCP *:http (LISTEN)
Вот что я использую прямо сейчас:
apachectl -t -D DUMP_RUN_CFG 2>/dev/null |
sed -n '/^User/s/.*name="\([^"]*\)".*/\1/p'