Сетевые клиентские приложения


Имена, IP-адреса, порты, login-имена

Приведенное здесь описание является довольно упрощенным, но оно необходимо для полного понимания следующего материала.

Символьные имена компьютеров и IP-адреса

Каждый компьютер, подключенный к Internet, имеет свое имя. Имена состоят из нескольких слов, разделенных точками. Например, "sky.inp.nsk.su". Это имя расшифровывается так: "Машина с именем sky в ИЯФ (inp), Новосибирск (nsk), экс-СССР (su). Такое имя является полной и однозначной ссылкой на компьютер.

Оно состоит из двух частей: собственно имя (sky) и так называемый домен (inp.nsk.su), к которому это имя относится. В разных доменах могут быть компьютеры с одинаковыми именами (например, почти везде есть адреса ftp.... и www.... Изнутри домена к компьютеру можно обращаться просто по имени, например, изнутри ИЯФ достаточно просто "sky" вместо "sky.inp.nsk.su".

Поскольку компьютерам намного проще манипулировать числами, а не строками, то по настоящему они знают друг друга не по именам, а по числовым адресам (их называют IP-адресами; IP -- это семейство протоколов, используемых для связи в Internet -- "Internetworking Protocol"). IP-адрес -- это четыре числа, разделенных точками. Например, 193.124.167.84. В IP-адресах также есть две части: адрес компьютера (аналог имени) и сеть (аналог домена; но указывать только адрес, без сети, нельзя!). Не вдаваясь в подробности (есть несколько разных вариантов), стоит лишь заметить, что вначале идет сеть (в данном случае 193.124.167, а затем адрес компьютера в этой сети (84). В ИЯФ есть восемь сетей -- с 193.124.160 по 193.124.167 (которые, впрочем, объединены в единую "надсеть").

Преобразованием имя->IP-адрес и обратно занимается служба под названием DNS (Domain Name Service). Трансляция выполняется программами прозрачно для пользователя. В большинстве случаев можно указывать как имя, так и IP-адрес -- они взаимозаменяемы. Бывают ситуации, когда у одного компьютера один IP-адрес, но к нему привязано несколько имен (например, www, ftp, news -- это одна и та же машина с адресом 193.124.167.84, она же sky.inp.nsk.su).

У каждого компьютера кроме его "интернетовского" адреса (и имени) есть еще один, локальный -- 127.0.0.1 (localhost). Почти всегда для ссылки на "сам" компьютер можно пользоваться этим локальным именем (хотя это не совсем то же самое, что "интернет-адрес").

Порты

Если IP-адрес служит для ссылки на конкретный компьютер, то для указания нужной "службы" используется так называемый порт. Так, ftp -- это порт номер 21, telnet -- 23, www -- 80 и т.д. Номер порта -- это нечто вроде номера отдела в магазине: в первом -- конфеты, во втором -- игрушки, в третьем -- книги.

Программы, использующие соответствующую службу (ftp, telnet, netscape...) сами знают, к какому порту им обращаться (хотя часто можно указывать порт и явно).

Login-имена пользователей

Каждый пользователь на конкретном компьютере имеет свое уникальное login-имя, под которым его знает эта машина. Разумные пользователи стараются иметь одно и то же имя на всех машинах, где они зарегистрированы.

При необходимости "сослаться" на конкретного пользователя на конкретном компьютере, надо указать его login-имя, затем символ "@" и имя компьютера. Например, goofy@class.inp.nsk.su. Такие "ссылки" используются в программах talk и finger.

По таким же правилам образуются и email-адреса. Впрочем, там то, что стоит после "@", не обязано быть существующим именем компьютера; да и вместо login-имени иногда указывается "синоним" -- к примеру, у пользователя "Э.Ю.Яковлев" может быть login-имя "eyakovl" и почтовый псевдоним "E.Yu.Yakovlev".


Информационные команды

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

Иногда, когда сеть работает не очень хорошо (или вовсе не работает) возникает желание понять, в чем же дело. В этом могут помочь программы 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:~% _


Передача файлов

ftp: протокол для передачи файлов и программа

FTP (file transfer protocol) как следует из названия -- протокол для передачи файлов. Программа, использующая этот протокол, называется аналогично -- ftp.

Стандартный способ запуска ftp -- "ftp <имя-компьютера>":

bobby:~% ftp class
Connected to class.inp.nsk.su.
220 class.inp.nsk.su FTP server (Version wu-2.4.2-academ[BETA-18](1)
Mon Aug 3 19:17:20 EDT 1998) ready.
Name (class:ivanov): goofy
331 Password required for goofy.
Password:
230 User goofy logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> _

Соединившись с компьютером, ftp запрашивает имя пользователя (если оно то же самое, можно просто нажать Enter), а затем, возможно, пароль.

Для доступа к публичным ftp-архивам используется специальное имя пользователя -- anonymous ("аноним"; через "y", а не "anonimous"). В качестве пароля при этом принято вводить свой e-mail, к примеру, goofy@inp.nsk.su. Правильность адреса обычно не проверяется (хотя ответы типа "a@b.c" многие серверы не принимают).

После авторизации можно с помощью команд ftp работать с файлами на удаленном сервере почти как с локальными. Команда "cd" позволяет перейти в другую директорию, "pwd" показывает текущую директорию, "ls" выдает листинг (причем всегда как с ключом "-l").

Хотя ftp поддерживает множество команд (таких, как переименование, удаление, смена прав и т.д.), упомянем лишь наиболее часто используемые и их особенности. Узнать какие еще бывают команды, можно при помощи команды "?", а посмотреть краткое описание -- "? имя-команды".

Сводка основных команд ftp


КомандаНазначение
cd Перейти в другую директорию
pwd Показать текущую директорию
lcd Перейти в другую локальную директорию
mkdir Создать директорию на сервере
ls Показать листинг
get Взять файл с сервера к себе
put Положить файл от себя на сервер
reget Продолжить прерванную перекачку файла к себе
bin Включить бинарный режим перекачки
hash Включить/выключить печать символов "#" для индикации перекачки
mget Взять несколько файлов по шаблону (multiple get)
mput Положить несколько файлов по шаблону (multiple put)
promptВключить/выключить запрос подтверждения для каждого файла в mget/mput
open Открыть соединение с сервером (если ftp запущена без указания компьютера)
quit Выход из ftp

Перекачка


Чтобы перекачать файл к себе, используется команда get, которой указывается имя файла. Если дать команду вида

get file.txt myfile.txt
то файл "file.txt" будет скопирован в локальный файл под именем "myfile.txt". Аналогичное правило действует и в отношении команд put и ls -- если указать два параметра, то второй -- это имя файла-получателя (в случае ls туда попадет листинг).

Для того, чтобы скачать сразу несколько файлов, используется mget -- этой команде вместо имени указывается шаблон, который может содержать метасимволы *, ?, [] -- как в shell. Mget спрашивает подтверждение для каждого файла, что иногда довольно утомительно. Отключить эти вопросы можно командой prompt.

Поскольку команды перекачки работают "молча", то трудно понять -- происходит что-либо, или же связь "оборвалась". Командой hash можно включить печать символа "#" при перекачке каждого килобайта (мнемоника: "#" по-английски называется "hash").

Если связь во время передачи оборвется, то можно не перекачивать весь файл заново, а продолжить -- для этого служит команда reget (дословно "перевзять", т.е. "продолжить взятие").

Замечание
В некоторых старых ftp-серверах (например, в поставляемом с Solaris, и в некоторых серверах под Windows) команда продолжения не поддерживается. Хотя это -- крайне редкая ситуация, стоит иметь в виду, что такое бывает.

Исторически в FTP предусмотрено два режима передачи файлов: бинарный (binary) и текстовый (ascii). В текстовом режиме символы концов строк в файлах преобразуются в "локальное" представление (Unix -- ^J, Dos -- ^M^J, Mac -- ^M). Если же попробовать перекачать в текстовом режиме, например, .zip-файл, то его содержимое просто испортится. Реально текстовый режим практически никогда не нужен. Хотя при перекачке Unix<->Unix преобразование реально не производится, сам просмотр содержимого файлов может занимать некоторое время (на стареньком Sun Sparcstation 1+ режим ascii почти вдвое медленнее, чем binary). Для переключения в бинарный режим служит команда bin. И хотя ftp может даже автоматически определить, что на другом конце тоже Unix -- "Remote system type is UNIX. Using binary mode to transfer files.", лучше все же завести привычку "руками" включать "bin" при каждом соединении (к примеру, под тем же Solaris как сервер, так и программа ftp довольно "тупы" и по умолчанию работают в ascii).

Команды put и mput служат для перекачки файлов в обратном направлении -- на сервер, и работают совершенно аналогично get и mget. К сожалению, команды "reput" нет, хотя протокол и дает такую возможность.

Прервать выполнение любой команды можно нажатием Ctrl+C.

Иногда возникает необходимость находясь в ftp, выполнить какую-либо команду на локальном компьютере -- к примеру, создать директорию. Чтобы не открывать новое окно (или не выполнять лишний telnet, если сам ftp запущен не с локального компьютера) можно воспользоваться командой "!". Просто "!" без параметров вызовет оболочку (shell). Если же указать после "!" какую-нибудь команду, то она будет выполнена -- например,

!mkdir zzz
создаст в текущей (для ftp) директории поддиректорию "zzz".

Предупреждение
Но для перехода по локальным директориям пользоваться командой "!cd" нельзя -- она будет выполнена в порожденном процессе и на текущую директорию самой программы ftp никакого влияния не окажет. Надо пользоваться командой lcd.

Для завершения ftp служит команда quit, но для краткости можно просто нажимать Ctrl+D -- так же как и shell, ftp понимает это как "конец ввода" и завершается.

А зачем, собственно, нужна программа ftp, если есть Netscape?


Половина ответа очевидна -- Netscape, в отличие от ftp, умеет только брать файлы, но не умеет класть их на сервер. Даже при использовании Midnight Commander нельзя полностью воспользоваться возможностями протокола FTP -- MC представляет содержимое сервера как просто содержимое панели, а это всего лишь абстракция, скрывающая некоторую специфику FTP (например, MC не показывает информационные сообщения от сервера, а те бывают весьма полезны).

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

Вот в этой-то ситуации единственное, чем можно будет воспользоваться -- это ftp или его развитием -- программами lftp или ncftp (последняя, впрочем, страдает излишней интерактивностью). Lftp, кстати имеет команду "reput". Обе эти программы умеют перекачивать целые директории (рекурсивная перекачка), а lftp позволяет делать все в фоновом режиме, понимая "&" в конце команды (аналогично shell). Кроме того, есть очень мощная пакетная программа для скачивания данных по ftp и http -- wget (о ней будет рассказано в одной из последних лекций).

Ncftp и wget входят в стандартный дистрибутив RedHat Linux, а lftp находится в дистрибутиве в секции "пожертвований" -- contrib.


Удаленный вход и выполнение команд

Удаленный вход: telnet

Telnet предназначен для входа в другой компьютер через сеть и интерактивной работы на нем ("так же, как на своем").

У telnet есть два режима работы: командный и "режим сессии". Обычно telnet запускают с указанием компьютера, к которому подключиться:

bobby:~% telnet class
Trying 193.124.166.227...
Connected to class.inp.nsk.su.
Escape character is '^]'.

Welcome to UNIX

login: _

После запуска на экране появляется обычное приглашение для входа в систему, и далее все выглядит точно так же, как на терминале, подключенном к тому компьютеру.

Для завершения telnet-сессии достаточно просто выйти из системы на удаленном компьютере (обычно для этого служит команда "logout").

Если запустить telnet без указания компьютера, то он переходит в командный режим, выдавая приглашение "telnet>". Обычно достаточно знать две команды: открыть соединение (open, или просто o) и выход (quit, q).

Команда open работает точно так же, как если указать telnet при запуске, к какому компьютеру подключиться (сравните с предыдущим примером):

bobby:~% telnet
telnet> o class
Trying 193.124.166.227...
Connected to class.inp.nsk.su.
Escape character is '^]'.

Welcome to UNIX

login: _

Она используется, например, когда не хочется, чтобы по команде ps другие пользователи могли узнать, куда сделан telnet.

Во время работы можно в любой момент перейти в командный режим, нажав Ctrl+] (закрывающая квадратная скобка) (при соединении telnet говорит об этом -- "Escape character is '^]'"). Вернуться обратно можно, просто нажав Enter.

Переходить в командный режим обычно требуется в двух случаях.

  • Во-первых, если нужно временно "заморозить" telnet (например, надо что-то сделать на локальном компьютере, а открывать другое окно не хочется) -- в "сессионном" режиме Ctrl+Z передается на удаленный компьютер (и "замораживает" программу, запущенную там), а в командном -- работает как обычно.
  • Второй случай -- если нужно завершить работу с telnet (а завершить сессию на удаленном компьютере не удается -- например, что-то "повисло", и "не отпускает" telnet); при этом используется команда q.

Замечание
В отличие от программ telnet под другими ОС (Dos, Windows...) telnet в Unix выполняет чисто связные функции. Непосредственно же выводом на экран он не занимается -- за это отвечает или сам Unix (на консоли) или xterm. Так что если что-то отображается неправильно (например, шрифты), то это проблема не telnet, а терминала.

Удаленный вход без пароля: rlogin

Вместо telnet для входа в другой компьютер можно пользоваться программой rlogin (remote login). У нее нет командного режима и при запуске надо просто указывать компьютер. Rlogin работает по другому протоколу и автоматически передает имя пользователя, так что вводить надо лишь пароль:

bobby:~% rlogin class
Password: 
Last login: Sat Mar 13 03:04:52 from Sky
You have mail.
[bolkhov@Class bolkhov]$ _

Чтобы "заморозить" rlogin, надо нажать символ тильды "~" и затем Ctrl+Z. Для "экстренного" завершения сессии надо нажать последовательно тильду и точку -- "~.". Обе комбинации воспринимаются только сразу после клавиши Enter.

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

bobby:~% rlogin -l mickey class
Password: 

У rlogin есть еще одно достоинство: можно сделать так, что при входе пароль не будет спрашиваться!

Для этого надо, чтобы в home-директории на удаленном компьютере был файл с именем ".rhosts", в котором должны быть перечислены компьютеры, с которых разрешен вход без пароля -- по одному имени компьютера в каждой строке. Если надо разрешить вход пользователю с другим именем, то надо указать это имя через пробел после имени компьютера. Пример:

Sky.inp.nsk.su
Class.inp.nsk.su
Class.inp.nsk.su bagira

В этом примере разрешается беспарольный вход самому пользователю с компьютеров Sky и Class, и пользователю bagira с компьютера Class.

Поскольку файл .rhosts надо сначала создать, то по крайней мере первый раз придется все же зайти, введя пароль.

.rhosts -- это как бы "список гостей, которым разрешен вход".

Права на запись в .rhosts должен иметь только сам пользователь -- иначе .rhosts просто не используется. Очень рекомендуется также убрать права на его чтение всем, кроме владельца (chmod 600 .rhosts).

При указании имен компьютеров надо помнить одну тонкость: это должно быть так называемое каноническое имя, т.е. то, которое является первым в списке имен соответствующего компьютера в DNS. При ссылке на компьютер из другого домена проблем обычно не возникает -- указывается просто полное имя (например, sky.inp.nsk.su). Внутри же одной локальной сети на каждом компьютере могут быть свои правила -- для одного каноническим является короткое имя, для другого -- полное. Чтобы не разбираться каждый раз, как правильно, проще указывать каждую строчку два раза -- с полным именем и с коротким. Это позволит также иметь единый файл .rhosts на нескольких компьютерах (возможно, с разными понятиями об именах), просто копируя его между ними. Так, наш пример можно переписать следующим образом:

Sky.inp.nsk.su
Sky
Class.inp.nsk.su
Class
Class.inp.nsk.su bagira
Class            bagira

Общее между telnet и rlogin: escape-символы

И в telnet, и в rlogin для выполнения некоторых нестандартных действий (типа завершения) используются так называемые escape-символы -- в первом случае "^]", во втором -- "~". При этом возникает интересный вопрос: а если, к примеру, зайти по telnet на компьютер A, и с него сделать telnet на компьютер B? Escape-символ будет "пойман" telnet'ом с нашего компьютера на A, а "нажать" его тому, который с A на B, никогда не удастся. Аналогично и с rlogin.

Поскольку такая ситуация хоть редко, но возникает, то и telnet, и rlogin могут использовать другой escape-символ -- его можно указать ключом "-e". Таким образом, telnet на A можно запустить с одним символом, с A на B -- с другим, с B на C -- с третьим и т.д.

Выполнение команд на удаленном компьютере: rsh

Если настроен вход без пароля по rlogin, то можно прямо со своего компьютера запускать команды на той машине командой rsh (Remote SHell):

bobby:~% rsh class uname -sn
Linux Class.inp.nsk.su
bobby:~% _

Формат вызова команды rsh такой:

rsh [-l пользователь] <компьютер> <команда>

При использовании rsh надо помнить два правила:

  • Во-первых, команды не должны быть интерактивными -- к примеру, joe или mc так запустить нельзя, только команды, которые что-то делают и/или печатают на экране -- cp, ls, rm и т.д. (хотя графические программы под X-Window запускать можно -- они не взаимодействуют с терминалом).
  • Во-вторых, поскольку специальные символы ?, *, <, >, [, ] и т.д. "разбираются" оболочкой (shell), то команду с такими символами надо "кавычить" -- указывать в одинарных апострофах (так они "защищаются" от интерпретации локальным shell'ом):

    bobby:~% rsh class ls -l inpunix.*
    zsh: no matches found: inpunix.*
    bobby:~% rsh class 'ls -l inpunix.*'
    -rw-r--r--   1 goofy    goofy     1445018 Mar  8 04:06 inpunix.tgz
    bobby:~% _
    

Прервать команду, запущенную через rsh, обычно можно по Ctrl+C.

Если не указать команду, а просто "rsh <компьютер>", то rsh работает как rlogin. Поэтому обычно (из лени ;) набирают rsh вместо rlogin.

Замечание
Если вход без пароля на удаленном компьютере не разрешен (не настроен файл .rhosts), то пароль запрашиваться не будет -- просто появится сообщение "Permission denied".

Копирование файлов с удаленного компьютера: rcp

Если настроен вход без пароля по rlogin/rsh, то для копирования файлов с/на удаленный компьютер применять команду rcp (remote cp). В использовании она очень похожа на cp:

rcp <из-какого-файла> <в-какой-файл>

Но в имени файла можно указывать компьютер: например, "sky:/etc/fstab" означает "файл /etc/fstab на компьютере sky". При этом если имя файла не начинается с "/", то оно "считается" с home-директории на удаленном компьютере. Пример:

bobby:/tmp/f% ls -l
total 0
bobby:/tmp/f% rsh sky ls -l /etc/fstab
-rw-r--r--    1 root     sys         4501 Feb 24 20:07 /etc/fstab
bobby:/tmp/f% rcp sky:/etc/fstab .
bobby:/tmp/f% ls -l
total 5
-rw-r--r--   1 ivanov   lab5         4501 Mar 13 16:41 fstab
bobby:/tmp/f% _

Если надо "зайти" под пользователем с другим именем, то имя указывается через "@" перед именем компьютера: bagira@class:/etc/issue.

Rcp воспринимает ключи "-r" и "-p" аналогично обычной команде cp.

У rcp есть две тонкости:

  • Во-первых, аналогично rsh, спецсимволы ?, * и т.д. надо "кавычить".
  • Во-вторых, при команде вида

    rcp host1:file host2:
    из соображений рационализации файл не копируется с host1 к себе и потом на host2, а дается команда компьютеру host1 выполнить rcp на host2. Поэтому файл .rhosts на host2 должен позволять вход с host1 без пароля.

Более надежная замена для rlogin/rsh/rcp: ssh

У программ telnet, rlogin, rsh, rcp есть два недостатка:

  1. Данные, включая пароли, передаются по сети в открытом виде -- воспользовавшись любой программой-шпионом сети, можно их перехватить.
  2. .rhosts (авторизация по имени компьютера и пользователя) дает довольно слабую гарантию защиты.

Для преодоления этих проблем была создана команда ssh (Secure SHell). Она используется практически так же, как rsh (и есть аналоги rlogin/rcp -- slogin и scp), но применяет для авторизации и передачи данных криптографические алгоритмы. Настраивать ssh несколько сложнее, чем rsh, и о ней будет подробно рассказано в специальной лекции.


Электронная почта

Стандартный "почтовик": mail

Самая старая почтовая программа в Unix -- mail. Хотя она и не слишком удобна, но все же позволяет посылать и получать письма, довольно проста в использовании, и обладает тем несомненным достоинством, что присутствует в любой версии Unix.

Будучи вызвана без параметров, mail показывает список писем в почтовом ящике и переходит в командный режим, выдавая приглашение "&":

bobby:~% mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/ivanov": 2 messages 1 unread
    1 MAILER-DAEMON@bobby.  Sun Mar 14 17:02  12/516   "DON'T DELETE THIS MES"
>U  2 ivanov@bobby.inp.nsk  Sun Mar 14 17:02  25/777   "Test for mail"
& _ 

На самое первое письмо не надо обращать внимания -- оно не является собственно письмом и нужно только самой почтовой системе; другие почтовые программы (например, Pine) его даже не показывают.

Чтобы прочитать первое непрочитанное письмо, надо просто нажать Enter. Следующее нажатие Enter покажет следующее письмо, и т.д.

После выхода из mail прочитанные, но не удаленные письма сохраняются в файле "mbox" в home-директории.

Для того, чтобы послать письмо, служит команда "m". Ей указывается список адресатов. В ответ на эту команду задается вопрос "Subject:" -- тема письма, и затем mail читает с клавиатуры текст письма. Текст завершается нажатием Ctrl+D в начале строки; после чего mail еще спрашивает "Cc:" -- список тех, кому надо послать копии -- можно в ответ просто нажать Enter.

& m bolkhov@class.inp.nsk.su
Subject: A test for mail
This is just an example of "mail" usage.
It is a very simple program.
Ctrl+D
Cc: Enter
& _

Кроме того, отправить письмо можно, набрав прямо из обычной командной строки команду

mail <адрес-получателя>

Собственно, в настоящее время mail применяется в основном именно для этого -- когда надо просто послать короткое письмо, и когда не требуются никакие удобства. Многие списки рассылки для Unix прямо рекомендуют для подписки/отписки использовать команду вида

echo "subscribe <имя-списка>" | mail -s "" <адрес-списка-рассылки>
(ключ "-s" позволяет указать тему (subject) -- в данном случае она "пустая").

Хотя mail позволяет отвечать (reply) на письма, и воспринимает еще несколько команд, мы не будем здесь их рассматривать, поскольку mail пользуются очень редко, и эти функции мало кому требуются. Кроме того, в любой момент можно получить список команд, введя команду "?".

Для выхода из mail надо ввести команду "q", или просто нажать Ctrl+D.

Более удобная почтовая программа: pine

Pine является, пожалуй, самой распространенной почтовой программой под Unix. Это экранная программа, примерно сопоставимая по набору функций с Pegasus Mail для Dos. Хотя Pine и умеет очень многое, вначале она запускается в "минимальном" режиме, чтобы упростить жизнь новичкам. Дополнительные возможности включаются в меню настройки.

Для запуска надо просто набрать "pine". После этого появится экран следующего вида (при самом первом запуске Pine еще выдаст краткое приветствие).

Это -- основное меню, в котором можно выбрать одно из действий -- написать письмо (compose message), перейти в список писем (message index) или в список фолдеров (folder list), поменять настройки (setup) или выйти из Pine (quit). Клавиши "c", "i", "l" и "q" почти из любого экрана Pine вызывают соответствующее действие. Перейти в основное меню почти отовсюду можно клавишей "m" (main menu).

Здесь уместно упомянуть несколько концептуальных моментов.

  • Для хранения писем Pine использует "папки", их обычно называют фолдерами (калька с английского слова -- folders). Приходящие письма попадают в фолдер "INBOX", копии отправляемых складываются в "sent-mail", а для сохранения "нужных" писем из INBOX есть фолдер "saved-messages". Пользователь может сам сделать множество фолдеров для писем разного рода.
  • Для большинства действий в Pine используются односимвольные команды -- например, "c" -- создать письмо. В тех случаях, когда "символьные" клавиши заняты (например, при составлении письма), используются клавиши с Ctrl (например, отправить письмо -- Ctrl+X).
  • Для получения справки в любой момент можно нажать Ctrl+G; выход из справки -- "e". В Pine начиная с версии 4.0 используется гипертекстовая система помощи -- с перекрестными ссылками.
  • В двух нижних строках всегда отображается список самых нужных в данный момент команд. Еще строкой выше Pine выдает короткие информационные сообщения (типа "пришло новое письмо" или "последнее письмо сохранено в фолдер saved-messages").
  • Клавиши со стрелками можно использовать очевидным образом -- для перемещения, а в последних версиях (начиная с 4.0, в RedHat 5.2 -- 4.04) для перемещения "внутрь" и "наружу" (на уровень "вниз"/"вверх") можно использовать ">" и "<".
  • Прервать, к примеру, составление письма, можно комбинацией Ctrl+C.

Не углубляясь во все функции Pine (их описание вполне может занять целую книгу) остановимся на основном: просмотре и написании писем, и на том, как настраивать Pine.

Получение почты


Для того, чтобы прочитать новые письма, надо перейти в фолдер INBOX -- при входе в Pine он является текущим, и зайти в него можно командой "i"; в любом случае всегда можно перейти в него через список фолдеров -- "i" -- INBOX в нем всегда самый первый.

Для просмотра письма надо просто нажать на нем Enter; вернуться обратно в список -- "i".

Основные команды для работы с письмами
КомандаМнемоникаНазначение
rReply Ответить на письмо
fForward Отправить копию письма другому человеку
sSave Сохранить письмо в другом фолдере; при этом оно автоматически удаляется из текущего
dDelete Удалить письмо -- точнее, отметить как ненужное, а удалено оно будет при выходе из Pine или при переходе в другой фолдер
uUndeleteСнять пометку удаления (например, поставленную по ошибке)
eExport Записать письмо в файл
wWhereis Поиск по списку писем

Если письмо состоит из нескольких частей (например, оно содержит дополнительные файлы), то текстовые части Pine покажет сразу (версия 4.0 показывает и те, что в формате HTML -- например, посланные из Netscape), а список остальных можно просмотреть командой "v" (view attachments) и затем при надобности сохранить на диск командой "s".

Как написать письмо


Надо вызвать команду "c" ("Compose message"), заполнить поля "To:" и "Subject:", и набрать текст письма.

Клавиши, используемые во встроенном редакторе Pine, можно посмотреть в справке.

Чтобы послать вместе с письмом какой-либо файл ("вложение", "приложение", "эттэчмент"), надо ввести его имя в поле "Attachment:" или нажать Ctrl+T (второй вариант нужен при отсылке нескольких файлов, а можно и перечислить несколько имен через запятую). Удалить attachment можно, нажав на нем Ctrl+K.

Набрав письмо, жмем Ctrl+X.

Как настраивать Pine


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

Для поиска нужного можно воспользоваться командой "w", а для получения описания конкретного пункта -- Ctrl+G. Замечание: для изменения значения переключателей "[x]" и "(*)" служит клавиша Enter (а не Пробел, как в оконных системах). Для ввода значений (например, в поле "personal-name") также используется Enter.

Обычно Pine можно не настраивать вовсе, но для того, чтобы писать и получать письма по-русски, надо в поле "character-set" поставить "koi8-r".

Завершение настройки -- "e" (Exit setup), при этом Pine спросит, сохранять ли изменения.

Дополнительные возможности Pine


Как уже упоминалось выше, Pine умеет очень многое. Упомянем несколько самых полезных свойств, которые не были описаны выше.

  • Работа с группами писем -- можно отметить несколько писем в списке и, к примеру, отправить их все вместе по какому-то адресу.
  • Pine умеет получать не только локальную почту, но и по протоколам IMAP и POP3.
  • Кроме почты, Pine умеет также работать с группами новостей (Usenet news).
  • Необязательно помнить адреса всех своих корреспондентов -- можно воспользоваться адресной книгой (address book).
  • Можно сделать "сигнатуру" (подпись) -- короткий текст, который будет автоматически подшиваться в конец каждого письма (при этом надо еще включить в настройках пункт "signature-at-bottom").


Интерактивное общение

Передача сообщения другим пользователям

Для того, чтобы послать сообщение другому пользователю на этом же компьютере, можно воспользоваться командой write.

bobby:~% write petrov
write: petrov is logged in more than once; writing to ttyp6
Hi!
Я убегаю, так что закинь книжку соседу.
<Ctrl+D>
bobby:~% _

После запуска write выводит строки, набираемые на терминале, на терминал другого пользователя (в данном случае petrov). Завершить сообщение можно, нажав Ctrl+D. У адресата на экране появится примерно следующее:

bobby:/etc% 
Message from ivanov@bobby.inp.nsk.su on ttyp9 at 17:31 ...
Hi!
Я убегаю, так что закинь книжку соседу.
EOF

"EOF" означает конец сообщения. Стоит заметить, что, поскольку вывод на экран адресата производится на уровне ядра ОС, то сообщение просто печатается на терминале, смешиваясь с выводом запущенных адресатом программ (или прямо поверх приглашения командной строки). Для привлечения внимания вместе с заголовком сообщения выдается звуковой сигнал.

Интерактивное общение: talk

Для интерактивного общения команда write довольно неудобна (она была создана, когда в качестве терминалов широко использовались телетайпы).

Намного более удобной и используемой является команда talk. Она позволяет организовать "живой разговор" между двумя пользователями. Кроме того, talk позволяет общаться с пользователями с другого компьютера (хоть с другой части света).

Для инициирования разговора надо набрать

talk <имя-пользователя>
К пользователю с другого компьютера можно обращаться стандартным образом -- пользователь@компьютер.

У адресата при этом появляется на экране сообщение такого вида:

bobby:~%

Message from Talk_Daemon@bobby.inp.nsk.su at 17:52 ...
talk: connection requested by petrov@bobby.inp.nsk.su.
talk: respond with:  talk petrov@bobby.inp.nsk.su

Чтобы ответить, тот должен также запустить talk, указав имя того, кому он хочет ответить (находясь на том же компьютере, необязательно указвать "@..." -- достаточно просто имени).

После установления соединения экран у каждого делится на две части, в верхней выводится то, что набирает он, в нижней -- то, что набирает партнер.

Вот что будет на экране у инициатора разговора:

[No connection yet]
[Waiting for your party to respond]
[Connection established]
Hello!
Ty uzhe wsyo sdelal?



---------------------------------------------------------------------
Net, ostalos dopisat paru stranits.
_





Курсор всегда находится на той половинке, где последний раз что-то появилось -- это позволяет быстро определить, успел ли партнер что-то написать после вас.

Сразу стоит заметить одну особенность: talk не всегда понимает русские буквы, поэтому лучше переговариваться "латиницей". Хотя в Linux он и отображает их, в других системах вместо, к примеру "Привет!" на экране может появиться "^p^R^I^W^E^T!".

Большинство вариантов talk позволяют "бибикнуть" для привлечения внимания партнера -- для этого надо нажать Ctrl+G. К сожалению, на это нет единого стандарта, так же, как и на то, какой клавишей удаляются неправильно введенные символы -- иногда Backspace, иногда -- Del (в Linux работают обе). Распространенная ошибка новичков -- пытаться "ходить" клавишами со стрелками. Это работать не будет, а просто на экране появится что-то наподобие "^[[A^[[A".

Для выхода из talk надо (предварительно не забыв попрощаться :) нажать Ctrl+C.

Если не хочется ничего получать...

Иногда хочется сделать так, чтобы никто не мог вам помешать, сделав write или talk. Для этого надо отключить получение сообщений командой "mesg" (сокращение от messages).

Будучи запущена без параметров, она показывает текущее состояние -- разрешены сообщения, или нет. Для запрета надо сказать "mesg n", для разрешения -- "mesg y" (это сокращения от no и yes).

bobby:~% mesg
is y
bobby:~% mesg n
bobby:~% mesg
is n
bobby:~% _

Когда сообщения запрещены, попытка сделать write и talk выдают сообщение вида

write: petrov has messages disabled
и

Your party is refusing messages
соответственно.


Практические задания

    Замечание
    Все компьютеры в классе имеют адреса вида 192.168.1.N, где число "N" написано на корпусе. Home-директория каждого пользователя (кроме "donald") одна и та же на всех компьютерах.

  1. При помощи finger узнать "настоящее" имя пользователя "gary" на компьютере class.
  2. При помощи finger узнать, когда последний раз входил в систему пользователь "root" на машине inp.nsk.su.
  3. Зайдя по ftp на ftp.inp.nsk.su (под пользователем "anonymous"), перекачать на свой компьютер в директорию /tmp файл boot.img из директории pub/Linux/redhat-5.2/i386/images. При этом ход перекачки должен отображаться символами "#".
  4. Зайдя по ftp на ftp.inp.nsk.su (под пользователем "anonymous"), начать перекачивать на свой компьютер в директорию /tmp файл supp.img из директории /pub/Linux/redhat-5.2/i386/images. Подождав около двух секунд, прервать перекачку (Ctrl+C). Затем "докачать" файл.
  5. При помощи telnet зайти на соседний компьютер ("под собой") и при помощи w посмотреть, кто еще на нем находится и что делает.
  6. Зайти на соседний компьютер при помощи rlogin.
  7. Настроить .rhosts так, чтобы можно было входить на соседний компьютер по rlogin без пароля.
  8. При помощи rsh посмотреть (командой "w") спосок пользователей с соседнего компьютера.
  9. При помощи rcp скопировать с соседнего компьютера файл /etc/HOSTNAME к себе в home-директорию и посмотреть его командой cat.
  10. Послать при помощи mail письмо пользователю "donald". Затем зайти под "donald" и прочитать это письмо.
  11. При помощи Pine послать простое письмо пользователю "donald". Затем, зайдя под donald, прочитать это письмо из Pine.
  12. Послать из Pine пользователю "donald" письмо, приложив к нему файл /etc/fstab. Как "donald", прочитать это письмо и сохранить приложенный файл в свою home-директорию.
  13. Зайдя на еще одном терминале (например, при помощи "telnet localhost") под "user", отправить ему сообщение при помощи write.
  14. Сделать talk к "donald" и "поговорить с ним".
  15. Договорившись с соседом, сделать talk к нему на компьютер.

----------------------------------------

© 2000 Дмитрий Болховитянов