Как отыскать свой домашний компьтер находясь вне дома

  Автор: © Марк Нильсен [Mark Nielsen]
Перевод: © Сергей Скороходов.


 

  1. Введение
  2. Скрипт на Perl для загрузки адреса ip
  3. Веб-страница и perl-скрипт на удаленном компьютере
  4. Задание, которое выполняется cron'ом по ночам
  5. Заключение
  6. Ссылки

Введение

Статья описывает, как я организовал поиск машины, стоящей у меня дома, в то время, как я мотаюсь по району Залива [Bay Area] выполняя разные связанные с компьтерами работы, подыскивая рабсилу или делая что-либо на общественных началах. Я большую часть времени провожу в разъездах, не взирая на то, что теперь могу делать на дому половину всей работы . Мой домашний компьтер "коннектится" через модем Ricochet. Тупицы, пообещавшие мне качественное DSL и спутниковое соединения с Интернетом прямо по месту жительства, на поверку оказались попросту сборищем слабоумных. Максимум в 144k, который я могу выжать из DSL (что выяснилось лишь ПОСЛЕ того, как я вселился) -- просто бессмыслица, поскольку мой модем Ricochet и так дает 128k. Вдобавок моя жилплощадь "смотрит" на не подходящую для спутниковой связи сторону. Короче, если Вы что-нибудь надумаете, то вначале убедитесь, что договор, в котором всякие кретины предлагают купить у них квартиру, содержит пункт, гарантирующий Вам определенную скорость подключения к Интернет и дающий право разорвать контракт без потери залога, если обещанное окажется туфтой. Я лично съеду как только подыщу что-нибудь стоящее. А пока довольствуюсь дайлапом, который, впрочем, по большей части весьма не плох.

У тех, у кого есть постоянное DSL-соединение, нет моей проблемы -- изменения ip-адреса каждый раз, как происходит дозвон. Раньше я посылал себе email с ip, находил его в письме и помещал на веб-странице. Теперь я делаю лучше. Я каждый час посылаю файл на свой удаленный веб-сервер по ssh.

Настройка ssh.

Я пользуюсь ssh версии 1.2.27. Мне следовало бы воспользоваться OpenSSH, но пока я работаю с коммерческой версией.

Нам нужно сделать так, чтобы файл с моего домашнего компьтера по безопасному каналу передавался на удаленный хост. Мы пользуемся программой ssh-keygen (которая входит в поставку ssh). Вот выдержка из man-страницы ssh.

В Ssh реализована автоматическая аутентификация по протоколу RSA. Пара ключей RSA создается пользователем в результате выполнения ssh-keygen(1). Эта программа сохраняет закрытый ключ в ~/.ssh/identity, а публичный ключ в ~/.ssh/identity.pub. Далее пользователь должен скопировать identity.pub в подкаталог .ssh/authorized_keys в свойе домашней директории на удаленной машине (файл authorized_keys соответствует обычному файлу .rhosts и состоит из строк, содержащих по одному ключу кажадя, хотя сами строки могут быть очень длинными). После этого пользователь может подключаться без ввода пароля. Аутентификация RSA гораздо безопаснее аутентификация rhosts.
Так что я запустил "ssh-keygen" как обычный пользователь на моем домашнем компьютере. Затем я переслал файл ".ssh/identity.pub" на удаленный компьютер и сохранил его уже как файл ".ssh/authorized_keys" в домашнем каталоге "тамошнего" пользователя "web1". Теперь я могу сидя дома подключаться к моему же удаленному компьтеру без ввода пароля. И еще я могу пересылать файлы.
rsync -e ssh -av /home/test1/IP.txt [email protected]:public_html/IP.txt

Скрипт на Perl для загрузки адреса ip

Вот Perl-скрипт, которым я загружаю на сервер ip-адрес. Вам нужно только исправить имена пользователей и адрес удаленной системы на свои.[Скрипт в текстовом формате.]
#!/usr/bin/perl

use strict;

  ### Выполняем ifconfig и сохраняем результат в списке @Temp. 
my @Temp = `/sbin/ifconfig`;

  #### Поиск ppp
my $Search = "ppp";
  ### Если Вы ищете адрес сетевой карты, 
  ### раскомментируйте эту строку;
# $Search = "eth0";

  ### Очистим строку, в которую будет сохранен найденный адрес.
my $Match_Line = "";
my $Match_Device = "no";

  ## Ищем в строках, и если находим соответствующее значение
  ## сохраняем его. Работаем, пока не встретим пустую строку. 

foreach my $Line (@Temp)
  {
    ### Если находим соответствие, то прерываемся. 
  if ($Match_Line ne "")   {@Temp = ();}
    ### в противном случае смотрим, нет ли соответствия в начале строки;
  elsif ($Line =~ /^$Search/) {$Match_Device = "yes";}
    ### иначе, если мы нашли устройство и ту строку, которую искали;
  elsif (($Match_Device eq "yes") && ($Line =~ /^ +inet/)) 
    {$Match_Line = $Line;}  
  }

  ## Если $Match_Line не пусто, разложим ее и получим адрес.
my $IP = "";
if ($Match_Line ne "") 
   {
    ### Избавляемся от того, что стоит пред адресом:
   my ($Junk,$Good) = split(/addr\:/, $Match_Line,2);
    ### Избавляемся от того, что после первого пробела
   my ($Good,$Junk) = split(/ /, $Good,2);
   $IP = $Good;
   }

  ## Если $IP не пусто, то мы что-то поймали.
  ## Сохраняем в файл и пересылаем его на удаленную машину. 
  ### Please don't use the /tmp to store this file, but some other location.
if ($IP ne "")
  {  
  open(FILE,">/tmp/IP.txt");
  print FILE "$IP\n";
  close FILE;
  system ('rsync -av -e ssh /tmp/IP.txt [email protected]:public_html/IP.txt');
  }
   ### В противном случае по почте или еще как-либо сообщаем себе,
   ### что ничего не вышло. Оставлено в качестве самостоятельного упражнения.
else {}

Веб-страница и perl-скрипт на удаленном компьютере

При сохранении на удаленной машине, нам надо проверить, что сведения об адресе по не более чем часовой давности. Если они более старые, то надо вывести сообщение об ошибке. Для этого я использую следующий "перловый" скрипт. Я назвал его "/home/web1/public_html/IP.pl". [Текстовая версия скрипта.]

#!/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> Последний известный ip: $Line\n";
print qq(<br> Для пересылки на веб-сайт, 
     <a href="http://$Line">кликните здесь</a>\n);

my $Diff = $time - $mtime;
if ($Diff > 4000) 
  {
  print "<p>ОШИБКА: Адрес должен обновляться каждый час, 
  но с момента полследнего обновления прошло более 4000 секунд.
  <br> $time - $mtime = $Diff \n";
  }

Возможно, Вам захочется поместить этот скрипт в "нормальную" cgi-bin директорию своего веб-сервера. Если же нет, то вот опасный пример того, как выполнять Perl-скрипты из пользовательской директории. ВНИМАНИЕ, ЭТО ОПАСНО! Если Ваш сервер разрешает запуск Perl-скриптов любому пользователю, то любой из них может заставить веб-сервер делать все, что угодно.

Для того, чтобы скрипты исполнялись, надо сделать следующее:

<Directory /home/*/public_html>
   ## Опция All избыточна для некоторых других опций. 
    Options All Indexes FollowSymLinks MultiViews ExecCGI Includes 
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

   #### Это требует нескольких модулей perl для apache
 <Files *.pl>
 SetHandler perl-script
 PerlHandler Apache::OutputChain Apache::SSIChain Apache::Registry 
 PerlSendHeader On
 Options ExecCGI
 </Files>

Задание, которое выполняется cron'ом по ночам

Командой "crontab -e" добавьте эту строчку в crontab на удаленной машине.
#/bin/sh

  ### Загрузка каждые два часа
1 * * * *   /www/Cron/Remote_Website.pl >> /www/Cron/out  2>&1  

Заключение

Я догадываюсь, что другие люди делают то же самое по-другому. Мой вариант нравится мне тем, что файлы передаются по закрытому соединению. Никто не может подсмотреть, что это я передаю по Интернету. Для того, чтобы никто не мог добраться до файла, надо защитить паролем веб-страницу и скрипт, показывающий адрес ip.

Ссылки

  1. ssh
  2. OpenSSH
  3. Apache
  4. Новые версии этой статьи можно взять здесь: http://www.gnujobs.com/Articles/17/Remote_Website.html

Марк работает независимым консультантом, который посвещает часть своего времени таким проектам, как GNUJobs.com, пишет статьи, пишет бесплатные программы и на общественных началах работает в проекте eastmont.net.

 


Copyright © 2001, Mark Nielsen.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 65 of Linux Gazette, April 2001

Вернуться на главную страницу