<< Предыдущий раздел | /\ Содержание | >> Следующий раздел

Простейшая диагностика сети

Иногда, когда сеть работает не очень хорошо (или вовсе не работает) возникает желание понять, в чем же дело. В этом могут помочь программы ping и traceroute. Хотя у них есть много ключей, обычно их указывать не требуются (к тому же они отличаются в разных версиях Unix).

Проверка наличия связи -- ping


Чтобы узнать, "жив" ли некий компьютер, используется команда ping. Ей указывается имя проверяемого:

sky:~% ping rdist
PING rdist.inp.nsk.su (193.124.167.12): 56 data bytes
64 bytes from 193.124.167.12: icmp_seq=0 ttl=255 time=1.784 ms
64 bytes from 193.124.167.12: icmp_seq=1 ttl=255 time=8.971 ms
64 bytes from 193.124.167.12: icmp_seq=2 ttl=255 time=3.594 ms
64 bytes from 193.124.167.12: icmp_seq=3 ttl=255 time=3.613 ms
64 bytes from 193.124.167.12: icmp_seq=4 ttl=255 time=2.887 ms
64 bytes from 193.124.167.12: icmp_seq=5 ttl=255 time=3.543 ms

----rdist.inp.nsk.su PING Statistics----
6 packets transmitted, 6 packets received, 0.0% packet loss
round-trip min/avg/max = 1.784/4.065/8.971 ms
sky:~% _

Ping посылает по указанному адресу пробные пакеты, на которые проверяемый должен прислать ответ. При получении ответа ping печатает информацию о нем на экране; самое интересное там -- время "хождения" пакетов туда-и-обратно. В локальных сетях оно порядка нескольких миллисекунд (хотя при сильной загрузке может зашкаливать за сотню), при связи с дальними машинами может достигать нескольких секунд.

Ping посылает пакеты "до бесконечности", чтобы прервать его, надо нажать Ctrl+C, при этом он печатает краткую статистику по временам и степень потери пакетов.

При "пинговании" компьютера, с которым нет связи (например, выключен) ping ничего не печатает (поскольку не получает ответов). Если после запуска в течение некоторого времени (в локальной сети -- несколько секунд, иначе -- секунд десять) ничего не печатается, значит связи нет.

Ping может также использоваться для проверки настроенности сетевой поддержки собственного компьютера -- если известно, что сеть работает, а ping на любой соседний адрес ничего не показывает -- значит что-то не в порядке на своем компьютере.

Замечание
В Unix'ах клона SystemV (Solaris, Unixware) ping действует чуть иначе -- он проверяет, откликается ли запрошенный компьютер, и если да, то выдает сообщение типа "Sky.inp.nsk.su is alive". Чтобы получить тот же эффект, что в Linux, надо указать ключ "-s".

По какому маршруту идет связь -- traceroute


Связь между компьютерами в разных подчастях Internet (в разных локальных сетях) осуществляется не напрямую, а через промежуточные узлы (они называются шлюзами (gateways)). Ping показывает только наличие или отсутствие связи, а для того, чтобы узнать, по какому маршруту идет связь, служит программа traceroute (trace route -- дословно "проследить маршрут").

Замечание
При стандартной установке Linux программу traceroute надо запускать по полному пути -- /usr/sbin/traceroute.

Ей, как и ping'у, указывается компьютер, связь с которым хочется проверить. Traceroute показывает последовательность шлюзов, через которые идет связь, и время, затрачиваемое в пути до каждого из них. Поскольку traceroute показывает только те из них, до которых данные доходят, то при отсутствии связи он позволяет увидеть, в каком месте "порвано".

Пример: traceroute из ИЯФ в НГУ:

sky:~% traceroute www.nsu.ru
traceroute to src.nsu.ru (193.124.215.67), 30 hops max, 40 byte packets
 1  nsc-gw (193.124.167.4)  4 ms  3 ms  5 ms
 2  Novosibirsk-NSC-INP.nsc.ru (194.226.160.126)  6 ms  7 ms  6 ms
 3  Novosibirsk-NSC-A.nsc.ru (194.226.160.123)  7 ms  8 ms  7 ms
 4  NSU-Akademgorodok-2M.nsu.ru (193.124.208.9)  10 ms  9 ms  9 ms
 5  src.nsu.ru (193.124.215.67)  11 ms *  18 ms
sky:~% _

Последним в списке показывается компьютер, связь с которым проверялась.

Traceroute проверяет время до каждого шлюза три раза -- во-первых, для надежности, во-вторых -- для некоторого усреднения.

Если запускать traceroute в локальной сети, где связь идет напрямую, первым же будет проверяемый компьютер:

sky:~% traceroute rdist
traceroute to rdist.inp.nsk.su (193.124.167.12), 30 hops max, 40 byte packets
 1  rdist (193.124.167.12)  3 ms  2 ms  2 ms
sky:~% _

При отсутствии связи вместо имен шлюзов и времен печатаются "*". Если из трех времен показывается хоть одно, значит связь есть; если же просто "* * *" -- то нет. Обычно это и есть место обрыва (хотя бывает и так, что где-то посередине маршрута выскакивают три "*", а дальше все нормально). Иногда на некоем этапе выдаются символы "!H" или "!N", давая понять, что связи нет, и после этого traceroute завершается.

При попытке сделать traceroute на выключенный компьютер выдаются только "*".

Замечание
Хотя ping и traceroute и являются довольно удобными инструментами, они не обеспечивают диагностику со 100%-надежностью -- в частности потому, что возможность диагностики может быть явно закрыта администратором проверяемой сети.

Предупреждение
И ping, и traceroute надо использовать с осторожностью (в частности, не применять слишком большой размер пробных пакетов и не оставлять ping на многие часы), поскольку в некоторых случаях они способны "поставить сеть на уши". В таких случаях виновный обычно быстро обнаруживается и для него это может иметь плохие последствия.

Замечание
В Win95/NT тоже есть программы ping и traceroute, но последняя называется там "tracert".

Получение информации о пользователях

Набрав "who", можно получить список всех присутствующих на данный момент в системе пользователей:

bobby:~% who
ivanov   tty1     Mar 11 11:39
ivanov   ttyp0    Mar 11 11:40 (:0.0)
ivanov   ttyp1    Mar 11 11:40 (:0.0)
ivanov   ttyp2    Mar 11 11:46 (:0.0)
ivanov   ttyp3    Mar 11 11:52 (:0.0)
ivanov   ttyp4    Mar 11 12:56 (:0.0)
ivanov   ttyp5    Mar 11 13:26 (:0.0)
ivanov   ttyp6    Mar 11 13:32 (:0.0)
ivanov   ttyp7    Mar 11 14:58 (:0.0)
petrov   ttyp8    Mar 11 17:28 (localhost)
petrov   ttyp9    Mar 11 17:27 (Sky.inp.nsk.su)
bobby:~% _

Who показывает имя пользователя, его терминальное устройство, время входа и откуда был произведен вход. Если пользователь есть "в нескольких экземплярах", то показываются они все. К примеру, каждое окно xterm -- это отдельная сессия; для них в качестве точки входа указывается "дисплей" -- в данном примере ":0.0" (подробнее об этом -- в следующей лекции).

Команда "w" несколько более информативна: она показывает еще и "время бездействия" (idle time) и что пользователь делает:

bobby:~% w
 10:54pm  up 11:15, 11 users,  load average: 0.08, 0.04, 0.01
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
ivanov   tty1                      11:39am 11:15m 45.60s  0.03s           startx
ivanov   ttyp0    :0.0             11:40am  1:09m  5.43s  0.17s  zsh 
ivanov   ttyp1    :0.0             11:40am 11:14m  1:19m  0.34s  sh /export/bobb
ivanov   ttyp2    :0.0             11:46am  7:38m  1:57   0.06s  zsh /export/bob
ivanov   ttyp3    :0.0             11:52am  7:04m  0.31s  0.04s  rlogin sky 
ivanov   ttyp4    :0.0             12:56pm 21:16   0.28s  0.28s  zsh 
ivanov   ttyp5    :0.0              1:26pm  0.00s  0.28s  0.10s  w 
ivanov   ttyp6    :0.0              1:32pm  5:27m  0.19s  0.04s  rlogin sch130.n
ivanov   ttyp7    :0.0              2:58pm  5:51m  0.18s  0.18s  zsh 
petrov   ttyp8    localhost         5:28pm  3:07   0.61s  0.02s  sh ./r 
petrov   ttyp9    Sky               5:27pm  3:07   4.04s  0.02s  sh ./11 
bobby:~% _

В системах с многими пользователями who и w выдают довольно большой список; обычно имеет смысл "отфильтровать" его командой grep.

Для получения информации о конкретном пользователе служит команда "finger". Будучи запущена без параметров, она выдает список имеющихся пользователей аналогично who и w. Если же указать login-имя пользователя, то выдаются данные только о нем, но зато более подробные:

bobby:~% finger petrov
Login: petrov                           Name: Ivan S. Petrov
Directory: /export/bobby/petrov         Shell: /bin/zsh
On since Thu Mar 11 17:28 (NOVT) on ttyp8 from localhost
   8 minutes 39 seconds idle
On since Thu Mar 11 17:27 (NOVT) on ttyp9 from Sky
   8 minutes 39 seconds idle
No mail.
No Plan.
bobby:~% _

Finger умеет давать информацию не только о локальных пользователях, но и с других компьютеров. Для этого надо указать или "пользователь@компьютер", или "@computer".

sky:~% finger bolkhov@class
[class.inp.nsk.su]
Login: bolkhov                          Name: 
Directory: /home/teachers/bolkhov       Shell: /bin/bash
Last login Thu Mar 11 01:28 (GMT+6) on ttyp2 from Sky
Mail last read Fri Feb 12 17:33 1999 (GMT+6)
No Plan.
sky:~% _

Во втором варианте (без имени) аналогично просто "finger" выдается список присутствующих пользователей на указанном компьютере. Этот способ иногда не срабатывает -- из соображений безопасности он может быть запрещен и вместо списка будет фраза "Please supply a username". Иногда даже при указании имени никакой информации не появляется -- это значит, что (из тех же соображений безопасности) администратор системы закрыл доступ снаружи.

Кроме того, при попытке сделать finger на компьютер, "не понимающий его" (например, под Windows) будет выдано сообщение:

finger: connect: Connection refused

Замечание
Системами клона SystemV вместо полной информации даже при указании имени выдается только одна строка (плюс строка заголовков полей). Для получения полной информации надо указать ключ "-l":

Class:~% finger bolkhov@inpbox
[inpbox.inp.nsk.su]
Hello bolkhov@Class.inp.nsk.su 
Login       Name               TTY         Idle    When    Where
bolkhov  Dmitry Yu. Bolkhovit  /dev/ptsSky  <Feb 17 17:29> Sky.inp.nsk.su    
Class:~%
Class:~% finger -l bolkhov@inpbox
[inpbox.inp.nsk.su]
Hello bolkhov@Class.inp.nsk.su
Login name: bolkhov                     In real life: Dmitry Yu. Bolkhovityanov
Directory: /export/home/people/bolkhov  Shell: /bin/shMenu
Last login Wed Feb 17 17:29 on /dev/ptsSky.inp.nsk.su from Sky.inp.nsk.su
No unread mail
Plan:
(1995 Mar21 12:41) User set new forward bolkhov@4nko.inp.nsk.su
(1995 Nov 3 10:33) User set new forward bolkhov@csd.inp.nsk.su
(1995 Nov 3 10:46) User set new forward bolkhov@4nko.inp.nsk.su
(1996 Apr17 17:44) User set new forward bolkhov@csd.inp.nsk.su
Class:~% _


<< Предыдущий раздел | /\ Содержание | >> Следующий раздел