"La Gaceta de Linux...¡haciendo Linux un poco más divertido!"


Encontrando mi computadora en casa desde el exterior

Por Mark Nielsen

Traducción al español por Daniel Guerrero
el día 24 de Septiembe 2002, para La Gaceta de Linux


  1. Introducción
  2. Script de Perl para cargar la dirección ip.
  3. Página web y script de perl en la computadora remota.
  4. El trabajo Cron que ejecuto en el fondo.
  5. Conclusión
  6. Referencias

Introducción

El propósito de este artículo es hacer que pueda encontrar mi computadora en casa mientras viajo por el área de la bahía mientras trabajo con computadoras, reclutando y haciendo trabajo voluntario. La mayor parte del tiempo, estoy ocupado viajando, aunque puedo trabajar la mitad de tiempo en casa. Mi computadora de casa usa un modem Ricochet. La gente tonta que me prometió una buena conexión DSL y una conexión satelital donde vivo fueron un manojo de habladores. El máximo DSL que podría obtener es de 144K (que lo encontré DESPUÉS que me mudé), lo cuál no tiene sentido. cuando tengo un modem Ricochet a 128k. Además, me estoy enfrentando de la manera equivocada a una conexión satelital. Hagas lo que hagas, asegúrate de los habladores que te venden sus apartamentos te prometan en el contrato ciertas conexiones de velocidad a internet, o puedes romper el contrato sin ninguna penalidad. Tan pronto importe, me estoy mudando, Por ahora. Estoy atascado con una conexión telefónica, que no es tan mala la mayor parte del tiempo.

Alguna gente puede tener conexiones estáticas DSL, que evita el problema que tengo, que mi dirección IP a internet cambia cada vez que me conecto. A menudo me mando un email con la dirección IP, analizo los datos, y los pongo en una página web. Ahora tengo una solución mejor. Uso ssh para transferir un archivo a mi servidor web remoto una vez por hora.

Configurando ssh.

La versión de ssh que estoy usando es la 1.2.27. Debería estar usando OpenSSH, pero por ahora, estoy usando ssh comercial.

Necesitamos hacerlo, ya que así podremos transferir con seguridad archivos desde casa a una computadora remota. Usaremos el programa ssh-keygen (que viene con ssh). Aquí hay un párrafo de la página man de ssh.

Ssh implementa el protocolo de autentificación RSA automáticamente. El usuario crea su par de claves RSA ejecutando ssh-keygen(1). Esto guarda la llave privada en .ssh/identity y la llave pública en .ssh/authorized_keys en tu directorio home. El usuario debe entonces copiar el archivo identity.pub a .ssh/authorized_keys en su directorio home en la máquina remota (el archivo authorized_keys corresponde al archivo covencional .rhosts, y tiene una llave por línea, y las líneas pueden ser muy largas). Después de esto, el usuario puede accesar proporcionando el password. La autentificación RSA es mucho más segura que la autentificación rhosts.
Así que ejecuto "ssh-keygen" como usuario en mi computadora en casa. Entonces transfiero el archivo ".ssh/identity.pub" de mi computadora en casa a la computadora remota como ".ssh/authorized_keys" para el usuario "web1" en la computadora remota. Esto hace que pueda acceder desde casa a mi computadora remota sin tener que usar un password. Esto también puede ser usado para transferir archivos.
rsync -e ssh -av /home/test1/IP.txt web1@algunacomputadora.com:public_html/IP.txt

Script de Perl para cargar la dirección IP.

Aquí hay un script de perl que uso para cargar la dirección ip. Debes cambiar los valores de nombre de usuario y de la dirección de la computadora remota. [Versión de Texto del script.]
#!/usr/bin/perl

use strict;

  ### Ejecutar ifconfig y guardar los datos en la lista @Temp.
my @Temp = `/sbin/ifconfig`;

  #### Buscar ppp
my $Search = "ppp";
  ### Si estás buscando la dirección IP de tu tarjeta ethernet, 
  ### quita el comentario a esta línea;
# $Search = "eth0";

  ### Hacer que la línea donde encontramos la dirección IP esté en blanco inicialmente
my $Match_Line = "";
my $Match_Device = "no";

  ## Buscar entre líneas, si encontramos una concordancia, guardamos las líneas
  ## hasta que encontremos una línea en blanco.

foreach my $Line (@Temp)
  {
    ### Si tenemos una concordancia, abortamos
  if ($Match_Line ne "")   {@Temp = ();}
    ### de lo contrario, ver si podemos encontrar una concordancia al inicio de la línea;
  elsif ($Line =~ /^$Search/) {$Match_Device = "yes";}
    ### de lo contrario, si encontramos el dispositivo debemos encontrar la línea que estamos buscando.
  elsif (($Match_Device eq "yes") && ($Line =~ /^ +inet/)) 
    {$Match_Line = $Line;}  
  }

  ## Si nuestra $Match_Line no es blanco, dividirla y obtener la dirección IP.
my $IP = "";
if ($Match_Line ne "") 
   {
    ### Deshacernos de algunas cosas antes de la dirección
   my ($Junk,$Good) = split(/addr\:/, $Match_Line,2);
    ### Deshacernos de algunas cosas después del primer espacio
   my ($Good,$Junk) = split(/ /, $Good,2);
   $IP = $Good;
   }

  ## Si $IP no es blanco, entonces tenemos algo. Guardar a archivo y transferir el archivo
  ## al sitio remoto.
  ### Por favor no uses /tmp para guardar este archivo, usa algún otro directorio.
if ($IP ne "")
  {  
  open(FILE,">/tmp/IP.txt");
  print FILE "$IP\n";
  close FILE;
  system ('rsync -av -e ssh /tmp/IP.txt web1@somecomputer.com:public_html/IP.txt');
  }
   ### De lo contrario, debemos mandarnos un email, o hacer algo para hacernos saber
   ### que no funcionó. Esto se deja de ejercicio.
else {}

Pagina web y script perl en la computadora remota.

En la computadora remota que guarda la dirección ip, necesitamos detectar si ha pasado una hora. Si es menos de una hora, debemos imprimir un mensaje de error. Así que uso este script de perl, le llamo "/home/web1/public_html/IP.pl". [Versión de texto de este listado.]
#!/usr/bin/perl

use strict;

print "Content-type: text/html\n\n\n\n";

my $File = "/home/web1/public_html/IP.txt";
open(FILE,"/home/web1/public_html/IP.txt");
my $Line = <FILE>;
chomp $Line;
close FILE;

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
   $atime,$mtime,$ctime,$blksize,$blocks)
     = stat($File);
my $time = time();

print "<br> La ultima direccion ip conocida fue $Line\n";
print qq(<br> Para transferir al sitio web, 
     <a href="http://$Line">haz click aqui</a>\n);

my $Diff = $time - $mtime;
if ($Diff > 4000) 
  {
  print "<p>ERROR: La direccion ip debio haber sido actualizada una hora atras, 
  pero han pasado 4000 segundos desde la ultima actualizacion.
  <br> $time - $mtime = $Diff \n";
  }

Posiblemente consideres mover este script de perl en el directorio normal cgi-bin de tu servidor web. De otra manera, aquí hay hay un ejemplo peligroso de cómo hacerlo si ejecutas los scripts perl desde un directorio de usuario. ¡ESTO ES PELIGROSO!. Si tu servidor web permite que cualquier usuario ejecute un script de perl, esa persona puede hacer que tu servidor web haga cualquier cosa que ellos quieran.

Para hacerlo y así puedas ejecutar script de perl en tu servidor web


<Directory /home/*/public_html>
   ## Options All es redundante con algunas de las otras opciones.
    Options All Indexes FollowSymLinks MultiViews ExecCGI Includes 
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

   #### Esto requiere algunos módulos apache de perl
 <Files *.pl>
 SetHandler perl-script
 PerlHandler Apache::OutputChain Apache::SSIChain Apache::Registry 
 PerlSendHeader On
 Options ExecCGI
 </Files>

La entrada en Cron para hacerlo trabajar nocturnamente.

Pon esto en tu crontab en el servidor remoto usando el comando "crontab -e"
#/bin/sh

  ### Descargarlo cada dos horas
1 * * * *   /www/Cron/Remote_Website.pl >> /www/Cron/out  2>&1  

Conclusión

Se que algunas personas probablemente estén haciendo lo mismo de maneras diferentes. Me gusta esta solución porque los archivos son transferidos de manera segura. Esto hace que la gente no pueda ver lo que estoy transfiriendo sobre internet. Así que nadie puede obtener el archivo, deberíamos proteger la página web y el script de perl que despliega la dirección ip con un password.

Referencias

  1. ssh
  2. OpenSSH
  3. Apache
  4. Si este artículo cambia, estará disponible en http://www.gnujobs.com/Articles/17/Remote_Website.html

Mark trabaja como un consultor independiente donando tiempo a causas como GNUJobs.com, escribiendo artículos, escribiendo software libre, y trabajando como voluntario en eastmont.net.


Copyright © 2001, Mark Nielsen.
Licencia de copiado http://www.linuxgazette.com/copying.html
Publicado en la edición 65 de La Gaceta de Linux, Abril del 2001