я из программы cu (по команде escape, а не exit), и применив команду stty, которая отображает скорость обмена: ~!stty < /dev/tty00 Эта команда должна сообщить обычные установки stty для последовательного порта /dev/tty00. Скорость обмена должна равняться 1200. Модемы типа Smartmodem автоматически понижают скорость до 300 бод при ответе по телефону. При вызове вы можете понизить скорость модема до 300 бод двумя различными способами. Первый способ - заставить cu открыть линию со скоростью 300 бод, указав 300 в командной строке программы cu. Заметим, что когда вы применяете альтернативную скорость (отличную от 1200 бод), запись о скорости обмена ДОЛЖНА присутствовать в файле L-devices И в командной строке cu, как в следующем примере: $ cu -ltty00 -s300 dir Второй метод хитрее, но зато предоставляет больше гибкости. Мы можем вызвать cu со значением по умолчанию 1200, затем временно (по команде escape) выйти из cu и вызвать программу stty, чтобы указать скорость обмена последовательного порта равной 300 бодам. Это нужно сделать после того, как вы обратились к линии с помощью cu. Эта измененная скорость обмена действительна до тех пор, пока вы не закроете линию (т.е. окончательно выйдете из cu по команде exit). В этот момент порт инициализируется заново. Например: $ cu -ltty00 dir # Захватить линию на 1200 бод Connected # Отзыв программы cu ~!stty 300 < /dev/tty00 # Временно выйти из cu и # установить для линии tty # скорость 300 бод Отметим, что этот метод НЕ требует наличия записи о скорости 300 бод в файле L-devices, поскольку мы работаем с последовательным портом вне области действия программы cu. Попутно заметим, что временный выход (по команде escape) из cu совершенно аналогичен временному выходу из любой команды системы UNIX. Вы можете временно выйти для запуска определенной команды, например: ~!echo "you can run any command here" Вы можете также перейти в shell и работать так, как вы всегда работаете: ~!sh Вы должны, однако, помнить, что вы все еще подключены с помощью программы cu к последовательному порту, а телефон по-прежнему подсоединен к удаленной системе до тех пор, пока вы не дадите вручную команду выхода или отключения телефона, или пока удаленная система не отключит телефон по тайм-ауту. ЗАХВАТ ДАННЫХ Теперь мы умеем найти модем, подключиться к последовательной линии и установить связь с другой системой. Если мы вызываем доску объявлений, нам может понадобиться захватывать файлы с целью последующего использования. Программа cu не предоставляет такой возможности. Как мы уже отмечали, микро-ЭВМ делают это обычно при помощи RAM-буфера, который сохраняется на диске, когда он заполняется. А UNIX не может действовать таким образом. Простейший способ, придуманный мною для захвата данных из другой системы - пропустить по конвейеру все, что выдается на терминал, через команду tee системы UNIX. Весь ввод с вашей клавиатуры не перехватывается, а все, что идет на стандартное устройство вывода (stdout) попадает в выходной файл утилиты tee. Это выглядит так: cu -ltty00 dir | tee файл_перехвата Одно из последствий перехвата информации таким методом состоит в том, что все символы возврата каретки, печатаемые из удаленной системы, попадают в выводной файл команды tee. Вы обнаруживаете их в виде "^M" в конце каждой строки файла. Избавиться от всех этих возвратов каретки легко, попробуйте выполнить такую последовательность команд редактора ed: ed файл_перехвата 1,$s/^M//g w q Смысл этих команд следующий. Для каждой строки во всем файле (1, $) заменить возврат каретки (^M) на ничего (//). Сделать это для произвольного количества символов возврата каретки в отдельной строке ("g" означает глобальную замену в строке). Вы можете превратить control-M в заменяемую строку либо вводом символа обратной косой черты (\) и настоящим нажатием на клавишу возврата каретки, либо в редакторе vi использовать префикс control-V для разрешения ввода управляющих символов. После редактирования запишите файл и выйдите из редактора ed. Конечно, все это вы можете для удобства оформить в виде командного файла интерпретатора shell. ИНСТРУМЕНТАЛЬНЫЕ СРЕДСТВА ДЛЯ КОММУНИКАЦИОННЫХ ЛИНИЙ Две утилиты, которые мы здесь предлагаем, связаны с доступом к последовательному порту. Когда линия освобождается, вы сразу же узнаете об этом и можете управлять линией с помощью нескольких нажатий клавиш. -------------------------------------------------------- ИМЯ: cuchk -------------------------------------------------------- cuchk Cu check - проверка свободной линии для cu НАЗНАЧЕНИЕ Опрашивает таблицу состояния процессов и ищет процессы cu. Когда они завершаются, на ваш экран выдается сообщение и программа прекращает работу. ФОРМАТ ВЫЗОВА cuchk - Сообщить, когда cu освободит линию ПРИМЕР ВЫЗОВА cuchk ТЕКСТ ПРОГРАММЫ 1 : 2 # @(#) cuchk v1.0 Check for a free cu line Author: Russ Sage Проверка свободной линии для cu 4 if [ "$#" -gt "0" ] 5 then echo "cuchk: too many arguments" >&2 6 echo "usage: cuchk" >&2 7 exit 1 8 fi 10 while : 11 do 12 ps -e | fgrep cu > /dev/null \ 13 && sleep 5 14 || { echo "\ncu is free"; exit; } 15 done & ОПИСАНИЕ ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ cuchk? Похоже, что большинство систем UNIX скупы на последовательные порты. Это становится важным моментом, когда имеется только один выводной порт для шести или семи человек. Опыт показывает, что если вы не получите доступ к порту сразу, то вам прийдется ждать снова и снова и вы не будете знать, как долго собирается текущий пользователь занимать определенный порт. Вместо того чтобы терять время на постоянную проверку занятости порта, почему бы не поручить машине сообщить вам, когда этот порт освободится? ЧТО ДЕЛАЕТ cuchk? При вызове программы cuchk она запускается в фоновом режиме. Она управляется бесконечным циклом, обеспечивающим ее работоспособность. Программа cuchk наблюдает за системой, ведя поиск среди всех активных процессов. Если она обнаруживает процесс cu (который может работать с интересующим нас портом, а может и нет), она засыпает на 5 секунд и снова ведет поиск. Если нет процессов cu, функционирующих на машине, она выдает сообщение "cu is free" ("cu свободна") и завершается. Таким образом, мы не обязаны вручную следить за работой cuchk, она сама запускается и сама завершается. Это имеет смысл, поскольку вся ценность этой утилиты свелась бы на нет, если бы ее саму нужно было периодически проверять! ПОЯСНЕНИЯ В строках 4-8 выполняется проверка на ошибки. Поскольку cuchk не имеет никаких опций, в командной строке не должно быть никаких параметров. Если параметры присутствуют, это считается ошибкой. Строки 10-15 организуют вечный цикл while. Обратите внимание, что амперсанд в строке 15 автоматически запускает cuchk в фоновом режиме, ведь нет никакого резона выполнять эту программу в приоритетном режиме. В строке 12 выполняется команда "ps -e", которая выдает информацию о состоянии всех значительных пользовательских процессов. Эти данные пропускаются по конвейеру через fgrep. Утилита fgrep ищет наличие символов "cu". Мы надеемся, что эти символы соответствуют только процессам cu, которые мы ищем. Они могут, однако, относиться к чему-то совершенно неожиданному, например "picuser" или к какому-то аналогично построенному имени. Результат работы команды fgrep направляется на устройство /dev/null, чтобы избавиться от лишней информации. Нас интересует только статус завершения команды fgrep. Он сообщает нам, найдено ли вхождение символов "cu" или нет. В конце строки 12 присутствует символ обратной косой черты, указывающий интерпретатору shell, что следующая физическая строчка является на самом деле частью той же самой программной строки и что нужно добавить ее к строке 12, а не выполнять самостоятельно. Разбиение длинных строк на несколько меньших строк с помощью символов обратной косой черты позволяет нам получать красиво оформленный, более наглядный исходный код. Строка 13 выполняется в том случае, если fgrep отработала успешно (т.е. если она выдает нулевой статус завершения). Это означает, что символы "cu" найдены, а значит процесс cu работает и в настоящее время не доступен. Поэтому процесс cuchk засыпает на 5 секунд. Когда он пробуждается, выполнение продолжается со строки 10, возобновляется вечный цикл и проверка процессов продолжается. Если fgrep не находит символы "cu" (возвращается ненулевой статус завершения), то выполняется строка 14, которая выдает сообщение о том, что программа cu свободна, и работа программы завершается. Таким образом, мы сразу же знаем, что линия cu открыта для использования, поэтому мы можем поскорее занять ее. ---------------------------------------------------- ИМЯ: talk ---------------------------------------------------- talk Обращение к последовательному порту НАЗНАЧЕНИЕ Выполняет командную строку, подготавливающую последовательный порт для общения с другой системой. ФОРМАТ ВЫЗОВА talk [-bBAUD] [-l] [-tTTY] [-u] Опции: -b установить новую скорость обмена -l протоколировать все поступающие данные -t использовать другой порт tty -u использовать принятую в UNIX скорость обмена 9600 ПРИМЕР ВЫЗОВА talk -b300 -t01 -l Обратиться к последовательному порту tty01 на скорости 300 бод и протоколировать выводные данные в текстовый файл. ТЕКСТ ПРОГРАММЫ 1 : 2 # @(#) talk v1.0 Talk to the serial port Author: Russ Sage Обращение к последовательному порту 4 BAUD="1200" 5 TTY="tty11" 6 PIPE="" 8 for ARG in $@ 9 do 10 case $ARG in 11 -b*) BAUD="`echo $ARG|cut -c3-`";; 12 -l) echo "logging in /tmp/talk.$$" 13 PIPE="| tee /tmp/talk.$$";; 14 -t*) TTY="tty`echo $ARG|cut -c3-`";; 15 -u) BAUD="9600";; 16 *) echo "talk: invalid argument $ARG" >&2 17 echo "usage: talk [-bBAUD] [-l] [-tTTY] [-u]" >&2 18 echo " -b baud rate" >&2 19 echo " -l log the output" >&2 20 echo " -t use another tty" >&2 21 echo " -u 9600 baud to UNIX" >&2 22 exit 1;; 23 esac 24 done 26 eval cu -s$BAUD -l$TTY dir $PIPE ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ ARG Аргумент из командной строки BAUD Скорость обмена, которую нужно указать программе cu PIPE Содержит строку, создающую конвейер для захвата данных TTY Номер используемого порта tty ОПИСАНИЕ ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ talk? Регистрация в удаленной системе расширяет горизонты ваших вычислительных возможностей. Учитывая, что UNIX становится все более распространенной системой среди микро-ЭВМ, системы UNIX, пригодные для связи, скоро будут везде. Кроме того, вы можете вызвать из вашей системы UNIX много систем типа досок объявлений, функционирующих на микро-ЭВМ. Нам нужен хороший интерфейс для управления модемной линией и облегчения ее использования. Нам необходимо захватывать данные, если это возможно, изменять скорость обмена и менять терминальный порт, если в этом есть потребность. Все это делает командный файл talk. ЧТО ДЕЛАЕТ talk? Программа talk генерирует командную строку, основанную на подразумеваемой конфигурации. Эта конфигурация такова: 1200 бод, подключение к терминальной линии /dev/tty11 (последовательный порт 1 в системе SCO XENIX), захват данных не производить. Все подразумеваемые параметры можно изменить в тексте исходного файла, а терминальная линия должна быть установлена с учетом специфики вашей системы. Если вы хотите изменить скорость обмена, укажите с помощью опции -b нужную вам скорость (подразумевается, что это одна из стандартных скоростей, поддерживаемых программой cu). Например,"talk -b2400" устанавливает скорость 2400 бод. Указанная скорость передается команде cu, которая непосредственно изменяет характеристики вашего подключения. Важно иметь в виду, что эта скорость должна быть определена в файле L-devices. Если вы хотите захватить все данные, выводимые на ваш экран, включите опцию протоколирования, указав -l. Файл с захваченными данными будет называться /tmp/talk.$$, где $$ - уникальный идентификатора процесса вашего текущего интерпретатора shell. Это имя выдается на экран при вызове данной опции, так что вы увидите его на вашем экране. Уникальность имен файлов обеспечивается для того, чтобы вы не потеряли по недосмотру регистрационные файлы от предыдущих сеансов работы (или чтобы, по крайней мере, было очень мало шансов, что это произойдет). Если у вас факультативный последовательный порт с модемом или если вы хотите подключаться к любой из возможных линий, примените опцию -t. Вместе с этой опцией укажите номер tty, который будет затем передан в команду cu. Это очень полезная опция, если у вас много различных линий для использования cu. Если вы не используете ваш последовательный порт для подключения модема, а имеете прямое подсоединение к другой системе UNIX, опция -u тотчас же установит скорость обмена 9600 бод. Заметим, что того же эффекта можно было бы достичь, указав -b9600, но опцию -u проще вводить и запоминать. ПРИМЕРЫ 1. $ talk -l -t12 Подключиться к дополнительному последовательному порту и захватывать данные, которые проходят на экране. 2. $ talk -u Подключиться к основному последовательному порту с использованием скорости 9600 бод. Не включать захват данных. 3. $ talk -b2400 -t04 -u Внимание! Сначала опция -b устанавливает скорость 2400, но далее следует опция -u, которая переустанавливает значение скорости на 9600. 4. $ talk -u -l -b4800 Снова будьте внимательны! Сначала линия подключается напрямую со скоростью 9600 бод. Затем включается протоколирование. Наконец, значение скорости меняется с 9600 на 4800. Если на самом деле линия, к которой вы обращаетесь, работает на скорости 9600 бод, вы должны, если это возможно, понизить скорость, нажимая ~%b для генерации сигнала break. ПОЯСНЕНИЯ В строках 4-6 устанавливаются действия, выполняемые программой talk по умолчанию. Эти действия можно полностью изменить путем редактирования исходного файла. Главное достоинство этих умолчаний в том, что если такую конфигурацию вы используете чаще всего, то вам достаточно просто ввести "talk", без всяких опций. Строка 4 инициализирует переменную BAUD значением 1200, это значение по умолчание для скорости модема. Строка 5 присваивает переменной TTY значение tty11, что соответствует первому последовательному порту аппаратуры. Обычно нужно tty00, но SCO XENIX имеет виртуальную консоль, причем tty02-tty10 являются отдельными экранами, доступ к которым осуществляется с одного консольного устройства. Если это не так в вашей системе, укажите здесь правильное значение TTY. В строке 6 переменная PIPE инициализируется пустой строкой, так как конвейер применяется для протоколирования данных, а по умолчанию захват данных не выполняется. Строки 8-24 представляют собой цикл, который перебирает все аргументы командной строки. В строках 10-23 используется оператор выбора среди опций для выполнения требуемых функций. Строка 11 проверяет, начинается ли данная опция с символов -b, после которых следует что-то еще. Если да, то символы, следующие после -b, вырезаются и заносятся в переменную BAUD. Обратите внимание, что именно поэтому вы должны набирать "-b2400", а не "-b 2400". В строке 12 проверяется, хотите ли вы включить протоколирование. Если да, то на экран выводится имя протокольного файла, а переменная PIPE устанавливается так, чтобы направить стандартный вывод по конвейеру программе tee системы UNIX. Программа tee - это универсальная конвейерная программа расщепления, которую можно использовать для посылки копии потока данных в определенный пункт назначения, не воздействуя на основной конвейер. В данном случае мы применяем программу tee для посылки данных, проходящих через последовательный порт, на экран и в наш регистрационный файл /tmp/talk/.$$. (Если вы представите себе водяную трубу с T-образным стыком, то поймете, что происходит.) Строка 14 проверяет, начинается ли опция с -t. Если это так, то вырезается номер терминала. Здесь можно передать любое значение tty, но не забывайте, что этот номер tty должен также присутствовать в файле /usr/lib/uucp/L-devices. Благодаря этому файлу, программа cu знает, что терминальное устройство подключено к разрешенному порту. В строке 15 проверяется, собираетесь ли вы подключаться к системе UNIX напрямую. Если да, скорость обмена автоматически устанавливается на 9600 бод в целях повышения пропускной способности терминала. Строки 16-22 выполняют проверку ошибок. Если какая-либо опция, переданная в командной строке, не соответствует никакому из предыдущих образцов оператора case, этот факт фиксируется здесь, выдаются сообщения об ошибках и командный файл завершается. Строка 26 - это волшебная строка. Поскольку все shell-переменные получили свои значения, мы можем использовать их в командной строке, чтобы подставить в нее необходимые значения. Сначала применяется команда eval. Она раскрывает все имена переменных, заменяя их на соответствующие значения. В данном случае мы формируем полную командную строку утилиты cu: скорость берется из переменной BAUD, линия из TTY, а подсоединение прямое. Если мы не ведем протоколирование данных, значение PIPE нулевое и оно будет отброшено при синтаксическом разборе. Если же переменная PIPE содержит команду для отправки данных в протокольный файл, команда eval обеспечивает это, организовывая такой конвейер, как мы указали. ДОСТУП ИЗ UNIX В UNIX Теперь давайте рассмотрим полновесное общение двух систем UNIX. Имеется область, в которой UNIX опередила свое время. Система uucp позволяет связать несколько машин воедино и создать то, что в некоторых отношениях является виртуальным окружением, позволяющим вам работать на любой машине. Функционирование такой сети основано на удаленной регистрации в системе (cu(1)), дистанционном выполнении команд (uux(1)), электронной почте (mail(1)), передаче файлов (uucp(1), uucico(1)) и опознавании узла системы (uname(1) и uuname(1)). Поскольку мы занимаемся реализацией коммуникаций типа UNIX-UNIX, давайте рассмотрим некоторые способы физического соединения UNIX-машин в одну рабочую среду. СВЯЗЫВАНИЕ UNIX-МАШИН В рабочей обстановке машинные конфигурации постоянно меняются в целях тестирования, из-за аппаратных изменений, перестановок и переездов и т.д. Планировать конфигурацию ваших машин нужно так, чтобы она была максимально гибкой, это поможет избежать хаоса и разлада. Ваши потребности влияют на то, как вы соедините различные UNIX-машины. Если имеется блок определения приоритетного запроса к порту (port contender), вам приходится иметь с ним дело. Одни линии могут быть подсоединены напрямую, другие напрямую через блок опреде- ления приоритетного запроса к порту, третьи через модемные коммутато- ры. Для того чтобы научиться иметь дело со всеми этими возможностями, попробуем представить эти конфигурации в графическом виде. Первый тип подключения - прямое подключение (см. рис. 8-7). Слева показана вызывающая система, справа вызываемая. Вызывающая система использует последовательный порт для вывода, поэтому на этом порту не должно быть процесса getty. Инициирующая команда "cu -ltty00 -s9600 dir" обеспечивает подключение к последовательному порту tty00 на очень высокой скорости обмена. Прямые подсоединения могут поддерживать такую скорость. Сам кабель должен быть выполнен в виде нулевого модема (рассмотренного ранее в данной главе). В вызываемой системе задействованы процессы getty, работающие со скоростью 9600 бод на входящей терминальной линии. Когда пользователь вводит регистрационное имя, getty выполняет процесс login, запрашивающий пароль, и если этот пароль верный, запускается shell. Рис. 8-7. Прямое подключение одной системы UNIX к другой ------------------------------------------------------------------- DTE-1 DTE-2 +---------+ +---------+ | | | | | UNIX 1 | | UNIX 2 | | | Нулевой модем | | | tty00 |-------------------->| tty00 | | | | | | | | | +---------+ +---------+ ДЕЙСТВИЯ ДЕЙСТВИЯ 1. Нет getty 1. getty 9600 tty00 cu -ltty00 -s9600 dir login имя_пользователя sh 2. uucp файл 2. getty 9600 tty00 unix 2!~/user login uucp uucico ------------------------------------------------------------------- При использовании uucp происходят аналогичные вещи. Команда uucp генерирует процесс uucico, инициирующий вызов системы, показанной справа. Регистрационная последовательность та же самая, за исключением того, что вместо запуска интерпретатора shell в конце этой последовательности действий запускается еще один процесс uucico, который общается с вызывающим процессом. Следующая конфигурация - прямое подключение через селектор порта - показана на рис. 8-8. Здесь тоже кабель, идущий от DTE-1 к селектору порта, должен быть нулевым модемом. Рис. 8-8. Прямое подключение через селектор порта ------------------------------------------------------------------- +---------+ +----------+ +---------+ | | | | | | | UNIX 1 | | | | UNIX 2 | | | Нулевой | Селектор | Прямой | | | tty00 |--------->| порта |-------->| tty00 | | | модем | | кабель | | | | | | | | +---------+ +----------+ +---------+ ДЕЙСТВИЯ ДЕЙСТВИЯ 1. cu -ltty00 -s9600 dir 1. getty tty00 9600 login имя_пользователя sh 2. uucp файл 2. getty 9600 tty00 unix 2!~/user login uucp uucico ------------------------------------------------------------------- Селектор порта принимает любое количество входных линий и переключает их на меньшее количество фиксированных входных линий компьютера. Таким образом, можно получить доступ ко всем терминалам, не имея входной линии, которая часто бы пустовала, поскольку она предназначена определенному лицу. Регистрационная последовательность в точности такая же, как и для прямого подключения, кроме каких-либо дополнительных нажатий на клавиши, применяемых для прохождения через селектор. Обычно возврат каретки активизирует линию, чтобы получить регистрационную подсказку. Последняя конфигурация (на рис. 8-9) представляет собой дистанционное подключение двух систем UNIX. Каждое терминальное устройство DTE соединяется со своим модемом прямым кабелем. DTE-1 вызывает DTE-2 либо вручную с помощью cu, либо с помощью утилиты uucp, использующей uucico и программу набора телефонного номера. Самое большое отличие в том, что это подсоединение работает на скорости 1200 бод. Это значит, что либо DTE-2 запускает 1200-бодовый процесс getty, либо если getty имеет скорость 9600, то вам нужно сбросить ее. Для того чтобы понизить скорость, в программе cu требуется ввести ~%b в качестве сигнала break. Или, если вы работаете с помощью uucp, можно поместить строку BREAK в файле L.sys, чтобы отправить ее в вызванную систему. Рис. 8-9. Дистанционное соединение двух систем UNIX ------------------------------------------------------------------- +---------+ +---------+ | | | | | UNIX 1 | ***** _||_ ***** | UNIX 2 | | | Прямой * * _||_ * * Прямой | | | tty00 |------->* модем *-- || --* модем *------->| tty00 | | | кабель * * || * * кабель | | | | ***** || ***** | | +---------+ +---------+ ДЕЙСТВИЯ ДЕЙСТВИЯ 1. cu -ltty00 -s9600 dir 1. getty 1200 tty00 login имя_пользователя sh 2. uucp файл 2. getty 1200 tty00 unix 2!~/user login uucp uucico ------------------------------------------------------------------- ОБЛАСТИ ДЛЯ ПЕРЕДАВАЕМЫХ ФАЙЛОВ Когда вы пересылаете файлы между машинами, uucp придерживается определенных протоколов и стандартов. Один из них связан с тем, откуда и куда могут поступать файлы. Чтобы свести возможную неразбериху к минимуму и обеспечить определенную степень защиты, создаются защищенный и публичный каталоги для хранения стоящих в очереди заданий и переданных файлов. Наиболее важен каталог /usr/spool/uucp. Он содержит LOGFILE, что дает возможность с помощью команды "tail -f LOGFILE" заглянуть в операции передачи во время их выполнения. Транзакции uucp и mail попадают в этот каталог. Обычно транзакция состоит из управляющего файла (C.*) и файла данных (D.*). Когда одна машина используется в качестве центрального узла, ее каталог uucp может заполниться очень большим количеством файлов. Необходимо обычное сопровождение и постоянное слежение за файлами занятости (LCK* и STST*), чтобы быть уверенным, что все работает правильно. Следующий интересный каталог /usr/spool/uucppublic, чаще всего известный под названием PUBDIR (это shell-переменная). Он содержит каталоги, названные по имени каждого пользователя, чтобы хранить файлы, проходящие транзитом с одной машины на другую. Большинство каталогов имеют все права доступа, что обеспечивает другим пользователям возможность копировать файлы. Я посчитал полезным создать переменную среды интерпретатора shell, которая содержит маршрутный префикс моего каталога в /usr/spool/uucppublic, т.е. P=/usr/spool/uucppublic/russ. Теперь я могу обращаться к файлам, вводя $P/*. Это значительно сокращает ввод и упрощает пересылку файлов в этот каталог и из него. Переменная PUBDIR поддерживается синтаксисом uucp. В данном примере используется синтаксис uucp: $ uucp * remote!~/user Эта команда копирует каждый файл текущего каталога в систему "remote", затем обозначение ~/ превращается в префикс /usr/spool/uucppublic. Если в этой команде user не является каталогом, копируемые файлы получают имя user, а не копируются в каталог с именем user. Вы должны сами создать каталог, после чего применить к нему команду chmod 777, чтобы в него можно было копировать. Для справки отметим, что указание ^user превращается программой uucp в $HOME/user, а ^/user превращается uucp в $PUBDIR/user. Еще один способ ввода команды с помощью shell-переменных выглядит так: $ uucp * remote!$P Такая команда копирует все файлы в мой каталог PUBDIR. Если я зарегистрировался в этой системе, я могу ввести: $ ls -al $P или $ cd $P $ ls -al для того, чтобы увидеть все скопированные файлы. Один из моментов, за которым вы должны следить,- разрушительные командные файлы типа "uuclean". Эти программы обычно запускаются процессом cron или некоторыми другими фоновыми программами. Они проходят по всем областям системы, связанным с uucp, находят файлы, к которым не было обращений определенный период времени, и удаляют их. Это может быть катастрофическим, если вы используете PUBDIR в качестве временной области хранения. Вот как может выглядеть одна из таких "очищающих" операций: PATH=/usr/bin:/bin export PATH cd /usr/spool/uucp find C. D. TM. X. XTMP -type f -mtime +7 -exec rm {} \; cd /usr/spool/uucppublic find . -type f -mtime +7 -exec rm {} \; Если в вашей системе работают такие очищающие командные файлы, имеется несколько способов сохранения файлов от неумышленного уничтожения. Первый способ - постоянно обрабатывать все файлы утилитой touch, чтобы они не распознавались оператором find, который ищет старые файлы. Это можно сделать так: $ find $P -exec touch {} \; Утилита touch обновляет дату доступа и изменения файла. Фигурные скобки означают, что нужно поместить в них литеральное имя, соответствующее оператору find. Вам желательно оформить это в виде запланированного процесса, который запускается чаще, чем программа очистки! Другая стратегия - проанализировать очищающую программу (или командный файл). Она запускается суперпользователем (root)? Если нет, то команда "chmod 000 $P" может помешать ей вести поиск имен внутри моего каталога. Если же программа очистки запущена суперпользователем, то, конечно, никакие ограничения прав доступа ее не остановят. В какое время она запускается? Могу ли я приказать ей пройти мимо меня, не заглядывая в мои файлы? Что является стартовым каталогом для очищающего командного файла? Углубляясь в эти вопросы, мы можем собрать много информации о том, что делает этот командный файл и какие действия мы можем предпринять, чтобы он нам не навредил. Может показаться, что самый легкий способ - просто удалить программу очистки (в предположении, что вы имеете на это право). Это, однако, не способствует поддержке свободного пространства и чистых каталогов. К тому же если вы хотите запретить очистку каталогов, которые очень важны для вас, то вы должны нести ответственность за их сопровождение. СЕТЕВАЯ БЕЗОПАСНОСТЬ Каталог uucppublic, как мы уже видели, содержит файлы, передаваемые транзитом между системами. Обычно все подкаталоги в uucppublic имеют режим доступа rwxrwxrwx. Это сразу же порождает проблему защиты, ведь кто угодно может создать, разрушить или изменить файлы в этих каталогах. Такие права доступа должны соблюдаться для любого каталога, который является источником или адресатом для файлов, передаваемых с помощью uucp. Uucp требует, чтобы все промежуточные каталоги имели разрешение на чтение и запись для всех пользователей. Если uucp берет из каталога исходные файлы, должны быть обеспечены права на чтение. Если же uucp записывает файлы в этот каталог, нужны права на запись в каталог-адресат. Если вы хотите, чтобы файлы uucp попадали прямо в ваш регистрационный каталог, вы должны разрешить запись в ваш каталог для всех окружающих. Широко открытый доступ на запись позволяет доставлять файлы прямо к вашему порогу, но вы не знаете, кому вы открываете двери. Если вы заботитесь о безопасности, вам не пон ПРИЕМЫ П. может записать все, что угодно, в ваше рабочее пространство. Одно из решений - разблокировать ваш регистрационный каталог, но заблокировать все ваши подкаталоги, кроме тех, которые нужны для uucp. Основная проблема при этом - так установить все права доступа, чтобы каждый файл обрабатывался надлежащим образом. Более простое решение - держать ваши каталоги для uucp за пределами вашего регистрационного дерева каталогов. Это избавляет вас от проблемы безопасности, но означает, что вы должны вручную копировать файлы после их попадания в каталог туда, где вы хотите их фактически разместить. ОГРАНИЧИТЕЛЬНЫЕ ФАЙЛЫ Когда удаленная система регистрируется в центральной системе с помощью uucp, несколько файлов в центральной системе определяют, какие возможности имеет удаленная система. Эти конфигурационные файлы размещаются в каталоге /usr/lib/uucp. Первый из таких файлов называется L.cmds. Он содержит имена всех команд центральной системы, которые можно выполнить из удаленной системы. Если удаленная система посылает команду посредством uux, то команда выполняется только при условии, что имя этой команды присутствует в файле L.cmds. Следующий файл - USERFILE - определяет, к каким каталогам центральной системы может иметь доступ удаленная система. Вы можете ограничить пересылки одним каталогом или разрешить доступ к любому файлу системы. По умолчанию в файле USERFILE имеется такая запись: uucp, / что позволяет пользователю uucp (подразумеваемому пользовательскому имени процесса uucico) читать и писать файлы в любом месте дерева, начиная от корня и двигаясь вниз, т.е. фактически во всей системе. Это открывает лазейки в системе защиты, например: uucp central!/etc/passwd /tmp Здесь извлекается парольный файл из другой системы. С помощью этого файла можно найти имена пользователей без паролей, и другие люди могут прорваться в вашу систему. Более строгий файл USERFILE выглядит так: uucp /usr/spool/uucppublic /tmp что ограничивает файловые пересылки только указанными каталогами. Это препятствует предыдущей попытке пересылки парольного файла. Последний файл L.sys, вероятно, наиболее важен для uucp с точки зрения системы защиты. Он содержит имена узлов, телефонные номера, регистрационные имена и пароли для всех удаленных систем, известных центральной системе. Если бы какая-то часть этой информации была доступна широкой публике, кто-нибудь смог бы выполнить пересылку с помощью uucp из удаленной системы и претендовать на роль центральной системы. Новая система HoneyDanber uucp в System V кое-что делает для того, чтобы не давать удаленным системам перехватывать почту и пересылки данных путем маскировки под другие удаленные системы. В главе 9 более подробно рассматриваются вопросы безопасности программы uucp и коммуникаций вообще. В следующем примере показан файл L.sys, в котором определены два разных вида систем: системы типа прямого подключения и удаленные системы с номеронабирателем (dial-up systems). remote Any ACU 1200 5551212 ogin:--ogin: uucp word: uucp selector Any ACU 1200 5551213 \d--CLASS--CLASS A ogin:--ogin: uucp word: uucp direct Any tty00 9600 tty00 ogin:-@-ogin: uucp word: uucp Запись для системы "remote" отражает, что это линия с набором номера, может быть вызвана произвольное число раз ("any time"), доступна через ACU (automatic call unit - автоматическое устройство вызова) со скоростью 1200 бод и по номеру 5551212. Регистрационная последовательность определена в виде регистрационного имени uucp и пароля uucp. Слово "ogin" - не опечатка. Uucp использует подсказку "ogin:" для того, чтобы отличить ее от обычной подсказки login системы UNIX. Распознавание шаблона "ogin:" более надежно, чем использование "Login:" или "login:". Указание "Any" можно заменить на определенные интервалы времени, если 24-часовый доступ не разрешен. Заметим, что обозначение "ACU" соответствует записи ACU в файле L-devices (как рассмотрено ранее). В следующей записи файла L-devices имена cua0 и cul0 связаны с устройством, присоединенным к модему, в данном случае /dev/tty00: ACU cul0 cua0 1200 Эту связь можно проверить с помощью команды "ls -li /dev/tty* /dev/cul* /dev/cua*". Система "selector" в нашем файле L.sys также имеет набор номера, только подключается через коммутатор порта. Для общения с коммутатором порта необходима дополнительная информация, которая начинается с символов "\d". Поля в файле L.sys следуют в таком порядке: "ожидание посылка ожидание посылка ...". Когда мы в первый раз подключаемся к селектору порта, в нашу линию ничего не выводится. Просто он так работает. Селектору нужен символ , чтобы стать активным, а первое поле uucp означает ожидание. Как нам ничего не дождаться и послать возврат каретки? Путем указания uucp ожидать невозможный символ, например control-D (\d). Uucp никогда не получит его, поэтому по тайм-ауту эта программа выдаст возврат каретки (-). Если слово CLASS приходит назад, когда мы посылаем CR, то мы отправляем символ "A", который означает класс системной идентификации, указанный в данной записи. Когда связь устанавливается, мы ищем "ogin:" в качестве регистрационной подсказки. Если мы не находим ее, то посылаем символы возврата каретки. Это может потребоваться по той причине, что инициирующий процесс getty в системе A может быть настроен на 9600 бод. Тогда мы должны будем послать либо символы возврата каретки, либо символы break, чтобы сбросить скорость обмена до 1200 бод. Последняя системная запись "direct" не использует ACU и телефонный номер. Она собирается обращаться к терминальной линии tty00 на скорости 9600 бод, чтобы получить регистрационную последовательность. Здесь нет селектора порта, через который нужно пройти, а есть просто прямая линия. В файле L-devices эта линия описана так: DIR tty00 0 9600 ОТЛАДКА КОММУНИКАЦИЙ В тех случаях, когда uucp работает неправильно, можно воспользоваться некоторыми хитростями отладки. Последовательность действий по отладке обычно проходит по такому циклу: попытаться передать файл, локализовать проблему, разрешить ее, сделать еще одну передачу. Здесь мы рассмотрим локализацию проблемы и выполнение еще одной пересылки. Если после проверки и перепроверки всех конфигурационных файлов имеют место отказы при передаче файлов, запустите вручную программу /usr/lib/uucico с некоторыми активными отладочными флагами. Они помогут увидеть, как происходит рукопожатие. Вот командная строка для отладочного режима: /usr/lib/uucp/uucico -r1 -x9 -ssystem_name где r1 указывает программе uucico стартовать в ведущем (master) режиме, вызывая system_name, а x9 указывает уровень отладочных сообщений. Если вы хотите получать от uucico поменьше подробностей, можете понизить уровень отладки до x4 или другого значения. Отладочный вывод варьируется в диапазоне от x1 до x9. Типичная последовательность для этой команды выглядит так. Во -первых, поставить некоторые файлы в очередь для того, чтобы направить их в другую систему. Благодаря постановке файлов в очередь, вы избегаете автоматического запуска процесса uucico. После того как файлы поставлены в очередь и готовы к передаче, запустите отладочный режим и следите за происходящим. Это выглядит примерно так: --------------------------------- | | $ uucp -r *.c remote!~/src | $ /usr/lib/uucp/uucico -r1 -x4 -sremote | Если вам нужно только активизировать передачу с помощью uucp в обычном режиме, то проще всего применить команду mail. Направьте почтой некоторый текст пользователю другой системы - и механизм uucp сразу же начнет работу. Следующая команда приводит к тому, что этот механизм вызывает систему "remote" и запускает утилиту rmai(1) в другой системе, чтобы передать по почте файл "dummy" пользователю "user": $ mail remote!user < dummy Есть команда, которая явно вызывает /usr/lib/uucp/uucico - это команда uusub(1M), размещенная в каталоге /usr/lib/uucp. Она вызывается с указанием имени системы, с которой вы хотите связаться. Большинство систем имеют такую команду. Если у вас ее нет, пользуйтесь uucico. Если такая коман