Capitulo 11 - CGI-BIN, FormMail, etc.

 

Las siglas de CGI son para "Common Gataway Interface", que viene a decir que es un nombre que describe en pocas palabras el hecho de que es un método de ejecutar desde el browser o navegador de Internet los programas que hay en el servidor de la página que visitas. La parte BIN del nombre se refiere a los programas binarios ejecutables que han sido que han sido compilados y programados. Puede ser un poco engañoso, ya que CGI también puede ser scripts de Unix o lenguajes interpretados como el Perl. Los scripts de CGI necesitan ser guardados como ASCII o como texto sin formato. Esto es algo muy importante.

Por lo general, no ofrecemos ayuda en CGI, cada uno se consigue o programa su propio programa y se defiende con ello. Hay muchos lugares donde buscar programas de CGI en Internet. El mejor de ellos en mi opinión es http://cgi-resources.com también hay una pagina muy parecida a esta última en español, que cada vez tiene mayor calidad, igual primero quieres pasar por dicha pagina, está en http://www.recursos-cgi.net. Si no eres un experto en CGI y no vas a contratar a alguien que te instale programas CGI intenta buscar programas que tengan buena documentación acerca de cómo instalarlos.

Existe la posibilidad de pedir a CruceDeCaminos.com que te instale un programa, pero esto ya por cobro. Pronto buscaremos tambien otras personas que sepan del tema para que tengaís más gente entre la cual elegir para instalar los programas. En CruceDeCaminos.com nos gusta conceder cuanta más información posible, aunque ello signifique ayudar a la competencia.

 

Dónde poner los programas CGI:

Debes poner los programas o scripts de CGI bajo el subdirectorio de www llamado cgi-bin.

 

Rutas al correo, perl, etc.

Aquí está las rutas a los recursos CGI que comúnmente se necesitan:

Sendmail: /usr/lib/sendmail

Perl5: #!/usr/bin/perl

Ruta del Servidor: /home/tunombredeusuario/tudominio-www/cgi-bin

Ruta de la raíz: /home/tunombredeusuario/
(te pone en la raíz de tu cuenta)

Directorio del dominio: /home/tunombredeusuario/tudominio-www
(te pone en el directorio www)

Ruta del Cgi-bin: /home/tunombredeusuario/tudominio-www/cgi-bin/nombredearchivo
(te pone en tu cgi)

NOTA: No Se debe poner la extensión de tu pagina donde pone "tudominio".

 

Permisos de Archivos:

Existen tres formas diferentes de configurar los permisos para los archivos y directorios de tu cuenta. 1) El File Manager. 2) por FTP 3) por Telnet. No recomendamos en absoluto usar Telnet para dar los permisos a los archivos si sólo se va a usar para eso, por lo que aquí nos saltaremos la explicación de cómo hacerlo por medio de Telnet.

 

Conceder Permisos usando el File Manager:

Este es el método a utilizar por medio de tu browser o navegador de Internet.
Una vez que te conectas a tu cuenta, pulsa sobre File Manager. Ahora verás una lista de directorios en la raíz de tu cuenta. Como todos tus archivos de paginas web, incluidas las de cgi necesitan estar en la de www, pulsas sobre el directorio llamado www.

Una vez dentro del directorio o carpeta, verás que lo primero que hay son los permisos (pone Permission). Pulsa sobre los permisos del archivo o carpeta al que deseas cambiar los permisos. Una nueva pantalla te dejara seleccionar los permisos que desees. Más adelante explicaremos que quieren decir todos estos permisos.

 

Conceder permisos usando Fetch para Mac:

Simplemente dirigete al archivo que deseas cambiar los permisos y seleccionalo. Bajo el menú de "Remote" selecciona "Change Permissions". Una pequeña ventanita aparece que te permite cambiar los permisos del archivo, como en la foto inferior. Pulsa en los diferentes cuadraditos para configurarlo como desees. Para saber el significado de todas ellas lee más abajo.

 

Conceder permisos usando WS-FTP para Windows:

Practicamente de la misma forma que el anterior. Dirigete al archivo que deseas cambiar, seleccioalo, pulsa el botón derecho y elige CHMOD. La ventana que ves aquí debajo es la que aparecerá. Simplemente selecciona los permisos que desees conceder. Para mayor información lee lo siguiente.

 

Definición de los Permisos:

Inglés:
Español:
Significado:
Owner
Dueño
Tú. El que usa el archivo.
Group
Grupo
El grupo de usuarios de los archivos.
Others
Otros
Otros.

Definición de Permisos:
r
Acceso de Lectura
x
Acceso de Ejecución
w
Acceso de Escritura

Definición Numérica:
r
4
x
2
w
1

Pronto te darás cuenta de que CHMOD es la palabra que se usa casi siempre para cambiar los permisos de los archivos, ya sea por FTP, o por Telnet.

Algunos Scripts te dicen que pongas los permisos de modo que tengan un valor de 775 (por ejemplo). Cuando se usa la definición numérica se hace de la siguiente forma:

4+2+1(rwx)=7

El primer número se refiere al dueño, el segundo al grupo, y el tercero a los demás (otros). De ahí que si tenemos que hacer un permiso 775 sabremos que el primer grupo ha de tener un 7. Para lograr el 7 sumamos 4(r)+2(w)+1(x), lo cual da 7. Esto le da al dueño permiso de Lectura, Ejecución y Escritura.
El segundo 7, es fácil de adivinar, es igual.
El tercer número, el 5 en este caso es sencillo, un 4+1, lo que les dá a los demás permiso de Lectura y Ejecución.

El resultado final de 755 aparece como rwx rwx -rx.

Los permisos siempre aparecen en 3 grupos de letras, si hay un guión (-), ello simplemente quiere decir que no se le ha dado ningún permiso a ese grupo.

Recuerda que los primeros 3 números pertenecen al dueño, los siguientes 3 a el grupo, y los últimos 3 a los demás.

 

Problemas con el CGI-BIN:

Hay diferentes problemas que puedes encontrarte, vamos a intentar solucionar los más comunes:

 

Cuando activo mi programa me aparece un mensaje de error que dice "Internal Server Error. The server encountered an internal error or mis-configuration and was unable to complete your request."

Esto generalmente se debe a un problema dentro del script. Puedes conectarte por medio de Telnet y probar tu script en modo local para tener mayor idea de lo que está sucediendo. Dirigete al directorio donde está el script y ejecutalo. Para ejecutarlo puedes:

1) Escribir "perl miscript.pl" (Perl siendo el lenguaje del script en este caso)
2) Simplemente escribir "miscript.pl".

El primero es bueno para saber si hay un problema en tu script. El segundo es bueno para probar si tu línea de llamada (la primera en tu script) está bien. Por ejemplo, si pusiste bien la dirección de Perl en el script.

 

Me aparece el mensaje "File Not Found" o "No Such File or Directory".

Esto quiere decir "Archivo No Encontrado", o "No existe ese Archivo o Carpeta".
Si estás seguro de que si que existe, puede ser que lo subieras mal al servidor.
Sube tu fichero como ANSII (texto), no como un archivo binario.

 

Cuando pruebo el script en modo local (por Telnet) me da el siguiente error: "Literal @dominio now requires a back slash at myscript.pl line 3, within string. Execution of myscript.pl aborted due to compilation errors."

Esto es causado por una malinterpretación de Perl. El simbolo @ tiene un significado muy importante en Perl. Define un array, una tabla de elementos. Como no puede encontrar la tabla de elementos de domain genera un error. Debes poner una barra hacia atrás (\)antes del simbolo "@" para decirle al perl que lo interprete como un simbolo normal, como por ejemplo para una dirección de correo.

.

Me sale un mensaje que dice "POST not implemented".

Probablemente estés usando una referencia errónea a cgiemail.
Usa la referencia /cgi-bin/cgiemail/mail.txt
Otra posibilidad pudiera ser que estás apuntando a un script de cgi que no está en el directorio.
Por lo general este error suele significar que está interpretando el script como un archivo de texto.

 

Me está diciendo "You don't have permission to access /"

Esto puede querer decir que te falta el archivo index.html.
Nota: los archivos que empiezan con un punto (.) son archivos invisibles. Para verlos escribe ls -al.

Cgiwrap - Secure Server CGI Wrapper

Tenemos configurado el servidor seguro CGI Wrapper de modo que siempre que hagas un llamado a "cgi-dominio" responderá:

https://securenombredeservidor/cgi-dominio/script.cgi

Esto hace lo mismo que el de arriba:
https://securenombredeservidor/cgi-bin/cgiwrap/domain/script.cgi

Esto asume que tu script.cgi está en tu cgi-bin.
También puedes usar cgiwrapd en lugar de cgiwrap para tener más información de debugging si existe un problema. Para los scripts de estilo nph-style es mejor usar nph-cgiwrap o nph-cgiwrapd.

 

formmail.pl

Formmail es un programa genérico de formularios para la web. Recogerá los resultados del formulario y los enviará a la persona especificada. Este script tiene bastantes opciones de formato y resultado, la mayoría de las cuales son especificadas desde el formulario mismo, lo cual quiere decir que no necesitas experiencia en programación o múltiples programas (scripts) para tus diferentes formularios. En definitiva, podrás añadir formularios sin tener que editar y programar los scripts.
Únicamente hay un campo de formulario que necesitas en tu formulario para que FormMail funcione correctamente. Este es el llamado "recipient". Otros campos de configuración también pueden ser integrados en tu formulario. Obviamente la acción (action) debe apuntar al programa formmail para que funcione correctamente. Otros campos ocultos pueden ser añadidos para enriquecer el resultado del formulario en tu página web.

Aquí hay un ejemplo de los campos de formulario a poner en la página web:

<FORM METHOD=POST ACTION="http://tudominio.com/cgi-sys/formmail.pl">
<input type=hidden name="recipient" value="tunombre@tudominio.com">
<input type=hidden name="subject" value="Este es el asunto ">
<input type=hidden name="return_link_url" value="http://tudominio.com/paginahtml">
<input type=hidden name="return_link_title" value="paginahtml">

Lo siguiente es son descripciones y el método correcto de añadir los campos:

Destinatario (recipient):

Descripción: Este campo te permite especificar a quien deseas enviar el resultado del formulario. Generalmente será a ti mismo a quien desees poner como destinatario (tú recibirías los formularios rellenados). El campo a rellenar debe de ser una cuenta de correo existente.

Ejemplo: <input type=hidden name="recipient" value="email@tudominio.com">

 

Asunto (subject):

Descripción: Este campo te permite especificar el asunto (o tema) del mensaje que será enviado. Es el nombre del asunto que aparecerá en la cabecera del mensaje electrónico enviado al destinatario.

Ejemplo: Si deseas escoger el asunto del mensaje poner:
<input type=hidden name="subject" value="El Asunto">

Para permitir al usuario poner su propio asunto poner:
<input type=text name="subject">

 

Correo Electrónico (email):

Descripción: Este campo le permitirá a la persona que rellene el formulario especificar una dirección de correo electrónico para que se le pueda contestar. Esto es algo que se recomienda poner.
Esto es la dirección que suele aparecer en los mensajes como "From: campo", o "De: campo". Si deseas hacer que este campo sea obligatorio deberás ponerlo en el campo "required" (explicado más adelante).

Ejemplo: <input type=text name="email">

 

Nombre real (realname):

Descripción: El campo "realname" permitirá al usuario poner su nombre en el formulario y el mensaje a enviar. Este campo viene bien para poder identificar a la persona que rellena el formulario y saber contestarle por su nombre.

Ejemplo: <input type=text name="realname">

 

Redirección (redirect):

Descripción: Si deseas que una vez el formulario ha sido rellenado y enviado el usuario tenga una confirmación de ello, en una página que creas especialmente para ello, puedes indicar aquí cual es la página a la que debe ir (nota: deberás también crear dicha página).

Ejemplo: <input type=hidden name="redirect" value="http://tudomino.com/gracias.html">
En este caso deberías crear una página con el archivo llamado "gracias.html".

 

Campos obligatorios (required):

Puedes obligar al usuario que desea enviar el formulario a rellenar los campos que creas oportunos. Simplemente pon el nombre de los campos, separados por comas, que desees que sean obligatorios. El mensaje no se enviará a no ser que rellenen esos campos. Si no han rellenado todos los campos obligatorios serán llevados a una página de error con opción a volver atrás y rellenar los campos que faltan.

Ejemplo: Si deseas que el email y la edad sean campos obligatorios pondrías lo siguiente:
<input type=hidden name="required" value="email,phone">

 

Otros campos:

Puedes poner los tantos campos como desees. Si por ejemplo quieres preguntar la edad puedes poner: <input type=text name="edad">

 

Opciones Avanzadas:

Campo Env_report, con las siguientes opciones:
REMOTE_HOST - Envía el nombre del host del que envía el formulario.
REMOTE_ADDR - Envía la dirección IP del host.
HTTP_USER_AGENT - El browser que el usuario está usando.
Ejemplo usando todos estos: <input type=hidden name="env_report" value="REMOTE_HOST,REMOTE_ADDR,HTTP_USER_AGENT">

Orden (sort): Para que te lleguen los campos en orden alfabético poner:
<input type=hidden name="sort" value="alphabetic">
Para que te lleguen los campos en un orden específico poner:
<input type=hidden name="sort" value="order:campo1,campo2,etc...">
En caso de no hacer ninguno de estos se enviará en el orden que está en el formulario.

 

Server Side Includes (SSI):
  • En la instalación inicial, los Server Side Includes no están habilitados en todo el servidor. Pero como la opción "allow override" está activa en el servidor Apache, puedes poner un archivo .htaccess en los directorios con SSI con la siguiente línea en ellas:
    Options IncludesNOEXEC
    Haciendo esto, SSI podrá ser utilizado en dichos directorios.

  • SSI no permitido:
    EXEC CMD

  • Ejemplo de uso de SSI: Un archivo llamado prueba.shtml con el siguiente texto:
    Esto es el 1..
    <!--#exec cgi="micgi.cgi" --><P>
    Esto es el 3.


    Y luego tener en un archivo llamado micgi.cgi conteniendo:
    #!/usr/bin/perl
    print "Content-type: text/htmlnn";
    print "Esto es el 2";

    Ahora, al ir a la página prueba.shtml verás lo siguiente:
    Esto es el 1.
    Esto es el 2.
    Esto es el 3.

  • Cualquier página con la extensión .shtml será interpretada por el motor SSI.

  • Para mayor información sobre el uso SSI dirigirse a:
    http://hoohoo.ncsa.uiuc.edu/docs/tutorials/includes.html (en inglés).
    Si conoces de una página en español que aborde el tema, comunicanoslo para incluirla.
 

 

 

 

 

 Ir a Inicio de CruceDeCaminos.com
© 2000 CruceDeCaminos.com - Donde nuestros caminos se cruzan
Todos los derechos reservados.
Enviar preguntas, comentarios, o notificaciones de malfuncionamientos al Webmaster.