Bienvenido a los foros de Perl en Español, palafox87.
Si el programa funciona bien desde la línea de comandos, pero no desde el navegador, es muy posible que el fallo esté en el
usuario que
ejecuta el
servidor web.
Me explico: los cgi son programas que lanza el servidor web a petición del usuario externo (nosotros desde el navegador). Los cgi -en principio- adoptan la personalidad del usuario que ejecuta el servidor web.
Por ejemplo, al arrancar el sistema, o desde la línea de comandos, arrancamos el servidor web, éste podría ser el usuario www-data, apache, httpd o cualquier otro usuario definido para que ejecute el servidor (incluso he visto que puede ser el usuario nobody). Eso está definido en los archivos de configuración del Apache:
Using text Syntax Highlighting
User www-data
Group www-data
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y... claro... el usuario www-data, es difícil que tenga permisos de ejecución de adduser:
Using bash Syntax Highlighting
explorer
@hs-
1590:~$
/usr
/sbin
/adduser rober
adduser: Sólo root puede añadir un usuario o un grupo al sistema.
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
El propio comando adduser comprueba si está siendo ejecutado por el usuario con id igual 0 (el root), así que aquí no vale el truco de darle permisos al directorio/programa. Lo que debe hacer el servidor web es cambiar la personalidad del cgi para que adopte la de root.
Un primer intento es: darle la propiedad del cgi al root y concederle permisos de ejecución para todo el mundo:
Using bash Syntax Highlighting
chown root.root programa.cgi
chmod 4755 programa.cgi
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Prueba a ver. Lo malo es que en los Linux modernos, esta posibilidad está desactivada.
Otra opción: ya que lo que se suele bloquear es la ejecución del intérprete en modo setuid, lo que se debe hacer es ejecutar nuestro
script desde un programa que sí parezca legal al sistema.
Crea un programa en C como este:
Using c Syntax Highlighting
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid( 0 );
system( "/ruta/al/script.cgi" );
return 0;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Lo compilas y le das los mismos permisos y propiedad que los del root:
Using bash Syntax Highlighting
gcc runscript.c
-o runscript
chown root:root runscript
chmod 4755 runscript
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Ahora, prueba a ejecutar este programa desde el navegador. Seguramente antes tendrás que darle una extensión, como '.exe', por ejemplo, y agregar esa extensión a los tipos de archivos ejecutables por Apache.
Otra opción (no recomendable): cambiar las opciones User y Group de antes a las del root y reiniciar el servidor web con su nueva personalidad.
Otra opción: no usar adduser para añadir usuarios al sistema. Quizás valdría con un conjunto de operaciones simples (que son las que realiza adduser).
Otra opción es utilizar el módulo suexec de Apache. Para ver si tu servidor tiene soporte de suexec, ejecuta
apachectl -V y busca por la línea SUEXEC_BIN:
Using bash Syntax Highlighting
root
@hs-
1590:
/etc
/apache2
# apachectl -V
Server version: Apache
/2.2.16
(Debian
)
Server built: Sep
29 2011 20:
59:05
Server
's Module Magic Number: 20051115:24
Server loaded: APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.4.2, APR-Util 1.3.9
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/apache2"
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="mime.types"
-D SERVER_CONFIG_FILE="apache2.conf"Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Luego, ejecutas el binario que te indica esa línea:
Using bash Syntax Highlighting
root
@hs-
1590:
/etc
/apache2
# /usr/lib/apache2/suexec -V
-D AP_DOC_ROOT=
"/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER=
"www-data"
-D AP_LOG_EXEC=
"/var/log/apache2/suexec.log"
-D AP_SAFE_PATH=
"/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=100
-D AP_USERDIR_SUFFIX=
"public_html"Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ya vemos un problema: el UID mínimo del programa que permitirá ejecutar es 100, por lo que no podremos usar esta opción para ejecutar un programa como root. La opción pasa por recompilar una versión nueva de /usr/lib/apache2/suexec que sí lo permita.
Y luego...