¿Descubrir a qué usuario se está ejecutando Apache?

212

Quiero asegurar un directorio de carga de archivos en mi servidor como se describe muy bien aquí, pero tengo un problema antes de poder seguir estas instrucciones. No sé a qué usuario se está ejecutando Apache.

He encontrado una sugerencia de que puede buscar en httpd.conf y habrá una línea de "Usuario", pero no existe esa línea en mi archivo httpd.conf, así que supongo que Apache se está ejecutando como el usuario predeterminado. Sin embargo, no puedo descubrir qué es eso.

Entonces, mi pregunta es (son):

  • ¿Cómo puedo saber cuál es el usuario predeterminado?
  • ¿Necesito cambiar el usuario predeterminado?
  • Si la respuesta es sí y cambio el usuario predeterminado editando httpd.conf, ¿es probable que arruine algo?

¡Gracias!

eikonomega
fuente
12
¿Por qué se ha rechazado esta pregunta? Sí, se ha actualizado ya que se ha respondido en otro lugar, pero no veo la necesidad de rechazar el voto. Es una buena pregunta? ¿Quizás a nuestro votante negativo le gustaría agregar un comentario constructivo al respecto?
Bryan
2
Es posible que desee publicar esa actualización como respuesta y aceptarla, ya que actualmente se encuentra en la cola Sin respuesta.
Fahad Sadah
77
+1 por ser regañado en StackOverflow; algunos usuarios parecen insistentes en
escapar de los
La pregunta vinculada ya no existe
pal4life
La siguiente pregunta: qué hacer porque es uno de los dos usuarios, me gusta rooty www-data. ¿Cómo le das al grupo Apache "correcto" un permiso para acceder a algo?

Respuestas:

228

ps aux | egrep '(apache|httpd)' normalmente mostrará cómo se está ejecutando Apache.

Por lo general, no es necesario cambiar el usuario predeterminado, "nadie" o "apache" suelen ser buenos usuarios. Mientras no sea "raíz";)

editar: comando más preciso para atrapar binarios apache también

grufftech
fuente
42
Sí, o será www-data en Ubuntu.
gravyface
10
... y Debian. :)
cubuspl42
77
Ese comando me muestra una lista de cosas, la mayoría de apachepero 1 de roottambién.
Usuario
2
Tengo 3 procesos ( /usr/sbin/apache2 -k start), el usuario de uno es rooty los otros dos www-data. ¿Debería Preocuparme?
zundi
3
@zundi, el servicio comienza como root para hacer cosas como enlazar a puertos reservados (por ejemplo, 80 y 443). Luego comienza cualquiera que sea el número configurado de procesos, para hacer el trabajo del servidor web y cualquier otra tarea, como los usuarios definidos. De esa forma, las solicitudes se gestionan mediante procesos no privilegiados. Notará que la ID principal (PPID) es la misma para todos los demás procesos. Esa idea es ser el PID para ese proceso que se ejecuta como root.
Kevin
41

Puedes probar el siguiente comando:

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'
nowthatsamatt
fuente
1
Me encanta esta respuesta, mejor (más genérica) que la respuesta más votada. Gracias
pgr
14

Use apachectl -S, que mostrará algo del usuario y grupo de Apache, algo como esto:

User: name="_www" id=70
Group: name="_www" id=70
Kyaw
fuente
Gracias, en mi Mac veo que Apache se ejecuta como '_www'.
Mercurio
Esta es una buena respuesta, porque es el único comando que le informa mucho más acerca de su servidor web en ejecución y lo presenta de manera integral.
kontur
9

De acuerdo con ubuntuforums.org , en Ubuntu el usuario predeterminado para apache2 es www-data.

Visto para ser verdad en Ubuntu 13.10 Saucy.


De Lars Noodén en el foro anterior.

Para asegurarse de lo que [el usuario] realmente está configurado, verifique los archivos de configuración reales. El archivo paraguas apache2.conftendrá algo como lo siguiente,

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

Esa es una referencia a las variables de entorno establecidas en /etc/apache2/envvars. mod_suexectambién permite que los scripts se ejecuten como un usuario y grupo diferente.

Para buscar cualquier host virtual, que puede utilizar usuarios, grupos o ambos alternativos, verifique las configuraciones.

$ egrep "^User|^Group|^SuexecUserGroup" /etc/apache2/apache2.conf /etc/apache2/sites-available/*.conf

Para las distribuciones basadas en Red Hat sería (generalmente su usuario que ejecuta httpd es apache):

$ egrep "^User|^Group|^SuexecUserGroup" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Kevin
fuente
8

Sé que esta es una publicación antigua, pero aún aparece como sin respuesta, por lo que haré una sugerencia. Si no puede encontrar a qué usuario o grupo se está ejecutando Apache, quizás intente abrir el archivo httpd.conf. Debe haber una entrada para "Usuario" y "Grupo". No solo puede ver a qué usuario se supone que se está ejecutando Apache, sino que puede cambiarlo si siente la necesidad de hacerlo.

kainosnous
fuente
7

Puede incluir una línea de código en su script PHP:

echo exec('whoami');
JG Estiot
fuente
8
Tenga cuidado aquí, esto muestra al usuario con el que se ejecuta PHP, no al usuario de Apache. Si usa mod_php, estos son los mismos pero si, como ahora es muy común, está usando otra cosa (como php_fpm), pueden ser fácilmente diferentes.
benz001
5

Este código enumerará, más o menos, alfabéticamente todos los usuarios no root que ejecutan procesos que contienen apache(o cuyo nombre contiene apache)

ps aux | grep -v root | grep apache | cut -d\  -f1 | sort | uniq
usuario163193
fuente
La lista probablemente incluirá a los usuarios que ejecutan procesos como 'grep apache', como usted.
mwfearnley
4
  • Para averiguar el usuario, simplemente puede usarlo ps aux | grep apachemientras se está ejecutando.
  • No es necesario, pero si Apache se está ejecutando como root, hay problemas de seguridad.
  • En tercer lugar, cambiar el usuario de Apache cambiará sus derechos para acceder a algunos directorios. Debe asegurarse de que / var / www (o donde sea que tenga sus sitios web) sea accesible para el nuevo usuario y grupo.
  • En los sistemas que he visto, apache siempre se instaló usando apache: apache (o similar) como usuario y grupo, por lo que probablemente ya debería estar configurado de esa manera.

NOTA: Esta es la misma respuesta que di en Stackoverflow .

Kjir
fuente
2

O puede consultar el archivo de configuración de apache y buscar el propietario y el grupo.

AliGibbs
fuente
2

Como lo sugiere Noyo aquí :

APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}')

Y entonces:

echo $APACHE_USER
kenorb
fuente
1
Obtenga el usuario (línea de comandos de ubuntu): echo $ APACHE_USER
Jadeye
1

Un enfoque alternativo, al menos para las distribuciones basadas en Debian / Ubuntu, es utilizar el mismo método que hace Apache para configurar su usuario y grupo:/etc/apache2/envvars ¡ fuente !

$ echo "$(source /etc/apache2/envvars && echo "$APACHE_RUN_GROUP")"
www-data

Si quieres ponerte elegante, puedes suprimir los errores si no se encuentra el archivo y proporcionar un valor predeterminado:

$ apacheuser = $ (
     source / fail / etc / apache2 / envvars 2> / dev / null &&
     echo "$ APACHE_RUN_GROUP" ||
     hacerse eco de nadie  
)
$ echo "$ apacheuser"
nadie
MestreLion
fuente
1

Descubrí que la mayoría de las soluciones que se ofrecen aquí son específicas del sistema o la configuración (en particular, la mayoría de las soluciones no funcionan en absoluto en MacOS) y algunas confían en que el usuario sepa dónde están los archivos de configuración de Apache en primer lugar. .

Así que hago un poco de trampa y dejo que Apache me diga qué es qué.

El simple comando apachectl -Sle dirá lo que necesita saber sobre una instancia en ejecución de Apache, y sus resultados se pueden analizar con bastante facilidad. Aquí está mi solución, que uso en la parte superior de algunos bashscripts para determinar una variedad de cosas que podría necesitar en un momento dado ...

# 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=\" `" : ".*\"\(.*\)\".*")

Estos valores se pueden usar como tales:

echo $HTTPD_ROOT_DIR // /etc/httpd
echo $HTTPD_DOC_DIR  // /var/www
echo $HTTPD_USER     // www-data
echo $HTTPD_GROUP    // www-data
Mike Fahy
fuente
0

Encontré este comando en los documentos de CakePHP .

HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`

Ahora HTTPDUSERcontiene el nombre de usuario del usuario que ejecuta el servidor, echo $HTTPDUSERen mi caso, las salidas www-data–utilizando rlerdorf / php7dev .

Nabil Kadimi
fuente
0

Use lsof y pase el puerto apache se escucha como argumento. Consulte la columna USUARIO para ver si el dispositivo de usuario se está ejecutando como.

# 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)
David Okwii
fuente
Es posible que lsof sea lento cuando tiene unos 100k manejadores de archivos abiertos y / o un servidor bastante ocupado.
Dennis Nolte