Последнее изменение файла: 2007.02.08
Скопировано с www.bog.pp.ru: 2010.03.19
Bog BOS: rsh и r*-команды: принципы работы, использование и настройка
Обеспечивают возможность удаленного выполнения команд (rsh, rexec
(устарел), rlogin)
и копирования файлов (rcp). Надстроенные над базовым уровнем rsh/rcp команды
rsync и rdist позволяют синхронизировать состояние файлов/директорий
на нескольких компьютерах.
В современных условиях запуск rsh-сервера представляется чистым
безумием с точки зрения безопасности, так что рекомендую обратить
внимение на SSH. Но если сервер запущен кем-то
другим ;), то воспользоваться им можно. К тому же команды rsync и rdist
позволяют использовать в качестве транспортного уровня SSH вместо rsh.
Стандарты: RFC-1258 (устарел), RFC-1282. Протокол использует
513 порт TCP (login), 514 порт TCP (выполнение команды shell)
и обеспечивает поддержку виртуального терминала на удаленном
хосте. В отличие от протокола telnet предполагается, что на обоих хостах
установлена ОС Unix и нет нужды договариваться о параметрах соединения.
В результате, реализация протокола получается более простой.
При инициализации соединения клиентская программа посылает имя пользователя
на локальном хосте, имя пользователя на удаленном хосте и тип терминала.
Имена пользователя используются для аутентификации (пароль может
запрашиваться или не запрашиваться в зависимости от настройки сервера).
Для синхронизации вывода используются символы
DC3/DC1 (Cntr-S, Cntrl-Q). Поддерживает режим "raw", в котором все
байты передаются на сервер "как есть". Поддерживается возможность
динамического изменения размера окна виртуального терминала (в пикселях
и колонках/строках).
Позволяет выполнять команду на удаленном хосте (514/TCP).
Стандартный ввод rsh передается на стандартный ввод удаленной команды.
Стандартный вывод удаленной команды передается на стандартный вывод rsh.
stderr удаленной команды передается на stderr rsh по дополнительному каналу.
Сигналы INT, HANG, TERM передаются удаленной команде.
-n - вместо стандартного ввода использовать /dev/null
-l имя-пользователя - задает имя пользователя на удаленном
хосте (по умолчанию совпадает с именем пользователя на локальном хосте)
команда - команда для исполнения на удаленном хосте;
если не указана, то производится rlogin (513/TCP)
На клиентской машине необходимо открыть порты 1023/TCP и 1022/TCP
(1022 для stderr; это в надежде, что одновременно не может исполняться больше одного rsh ;).
Файл /usr/bin/rsh имеет права rws и владельца root, чтобы иметь возможность
открыть исходящий порт ниже 1023.
rcp - копирование файлов между хостами (оба могут быть удаленными).
Имя файла записывается в виде:
[[user@]host:]file.
Если файл назначения является именем директории, то исходный(е) файл(ы)
копируются в нее. Относительные имена отсчитываются относительно домашней
директории соответствующего пользователя на соответствующем хосте.
Имена могут быть защищены (апострофами, кавычками или обратной косой)
от локальной интерпретации. Опции:
-p (сохраняет время модификации и, по возможности, права доступа)
-r (рекурсивно копировать всю директорию, файл назначения д.б. директорией)
Сервер in.rshd запускается из xinetd (/etc/xinetd.d/rsh) и обслуживает
запросы 514/tcp (shell, cmd). Исходный порт клиентского запроса должен быть в интервале 512-1023.
По IP адресу определяется имя хоста клиента. Имя пользователя (до 16 символов) на удалённом хосте
извлекается из потока. Для авторизации используются файлы /etc/hosts.equiv и ~/.rhosts.
Ключи (для /etc/xined.d/rsh надо использовать "server_args = -l"):
-a (двойная проверка имени и IP адреса)
-h (разрешить удалённое выполнение команд с правами root)
-l (не использовать пользовательские .rhosts при авторизации; необходимо проверять,
что реализация libc поддерживает этот запрет)
Сервер in.rlogind запускается из xinetd (/etc/xinetd.d/rsh) и обслуживает
запросы 513/tcp (login). Исходный порт клиентского запроса должен быть в интервале 512-1023.
Для авторизации используются файлы /etc/hosts.equiv и ~/.rhosts.
Ключи (при использовании PAM ключи -h, -l и -L не действуют, см. /etc/pam.conf
и README.pam_rhosts):
-a (двойная проверка имени и IP адреса)
-h (разрешить использование .rhosts для root)
-l (не использовать пользовательские .rhosts при авторизации; необходимо проверять,
что реализация libc поддерживает этот запрет)
Файлы /etc/hosts.equiv и .rhosts в домашнем каталоге содержат список хостов
и имён пользователей, которым разрешено и запрещено иметь доступ к сервисам rlogind и rshd без пароля.
Каждая запись на отдельной строке. Строки, начинающиеся с '#', являются комментариями.
Первое поле строки описывает хост, с которого приходит запрос.
Второе поле, если оно указано, описывает имя пользователя на удалённом хосте.
Если перед именем хоста стоит знак '-', то запросы с данного хоста отвергаются.
Если перед именем удалённого пользователя стоит знак '-', то запросы от этого пользователя отвергаются.
Перед именем хоста или пользователя может стоять знак '+' (по умолчанию).
Если строка стоит только из знака '+', то принимаются запросы с любого хоста и от имени любого
пользователя.
При использовании NIS можно использовать сетевые группы (@имя-группы).
Файл должен быть обычным файлом, принадлежать root или пользователю
и закрыт на запись другим пользователям.
Сервер in.execd запускается из xinetd (/etc/xinetd.d/rsh) и обслуживает
запросы 512/tcp (exec). Для аутентификации используется имя (до 16 символов) и незашифрованный
пароль (до 16 символов). Для stderr используется дополнительный канал (см. rsh).
Аналогично rcp позволяет копировать файлы между
хостами, но ускоряет процесс т.к. передает только
измененные части (хитрый алгоритм на основе сравнения контрольных сумм).
Позволяет копировать ссылки (links), специальные устройства (device), владельца
и группу файла, права доступа. Позволяет использовать в качестве транспорта как
rsh, так и
ssh. Включает сервер rsyncd (доступ
анонимный или с аутентификацией), порт 873/TCP.
Я сервер не использую (не люблю, когда пароли лежат в открытом виде)
и потому не описываю.
Имя файла записывается в виде:
[[user@]host:]file.
Если файл назначения является именем директории, то исходные файлы копируются
в нее. Если имя исходной директории завершается обычной косой чертой,
то копируется содержимое директории, а не сама директория (почувствуйте
разницу ;).
Относительные имена отсчитываются относительно
домашней директории соответствующего пользователя на соответствующем хосте.
Если в качестве параметров указано только имя удаленного файла/директории,
то выдается листинг. Нельзя копировать с одного удаленного хоста на другой.
rsync должен быть установлен на обоих концах.
Опции:
опции диалога:
-v (увеличить болтливость: один раз - имена передаваемых файлов;
два раза - имена пропускаемых файлов; три раза - отладочная печать)
-q (совсем тихо)
--version
--progress (только в сочетании с -v)
--stats (статистика эффективности алгоритма)
--help
-n (не делать реальной пересылки, только отчет о предполагаемых действиях)
какие файлы включать в список проверки перед пересылкой
-r (рекурсивное копирование)
-x (не пересекать границы файловой системы при рекурсии)
--exclude=шаблон
--cvs-exclude (стандартный набор исключений, используемый cvs: *~, *.bak,
*.o, core и т.д., включая содержимое файлов .cvsignore)
--exclude-from=имя-файла
--include=шаблон
--include-from=имя-файла
правила проверки на совпадение файлов
-I (пересылать файл даже если длина и время модификации совпадает на обоих
концах)
--size-only (определять необходимость пересылки только по совпадению
размеров файла)
--modify-window=секунд (если разница времени модификации меньше указанного
числа, то файлы считаются одинаковыми; по умолчанию - 0)
-c (на исходном конце считается контрольная сумма (MD4) файла, на приемном
конце она сравниваются с контрольной суммой локальной копии; если суммы
совпадают, то пересылка не происходит)
-u (не изменять, если приемный файл новее исходного)
--existing (изменять только существующие файлы)
-W (копировать файлы целиком, не задействуя алгоритм сравнения)
backup (сохранять старую версию изменяемого файла)
-b (делать backup, суффикс по умолчанию - '~')
--suffix=суффикс (суффикс для backup)
--backup-dir (backup в указанную директорию)
обработка ссылок
-l (сохранять символьные ссылки; пропускаются по умолчанию)
--copy-links (обрабатывать символьные ссылки как обычные файлы)
--safe-links (игнорировать ссылки, указывающие вовне приемного дерева,
и абсолютные ссылки)
-H (воссоздавать жесткие ссылки на приемном конце; срабатывает только
если оба (а больше?) файла входят в список пересылки)
сохранение атрибутов файла
-a (архивный режим: синоним -rlpogDt)
-p (сохранять права доступа)
-o (сохранять владельца файла; только для root)
--numeric-ids (вместо имени владельца и группы пересылается uid и gid)
-g (сохранять группу файла; получатель должен быть членом группы)
-D (сохранять устройство; только для root)
-t (сохранять время модификации; очень рекомендуется, если предполагается
повторная пересылка)
правила удаления
--delete (удалять на приемной стороне файлы, не существующие на исходной
стороне)
--delete-excluded (удалять, если "несуществование" вызвано действием
шаблона исключения)
--delete-after (удалять после передачи, а не до)
--ignore-errors (удалять даже при ошибках ввода/вывода)
--max-delete=число (не удалять более указанного числа файлов)
--force (удалять непустые директории; действует также при замене
директории обычным файлом с тем же именем)
-R (относительные имена: в действительности передает имя файла из командной
строки целиком вместе с именем директории, а не только файловую часть имени;
осторожнее с символьными ссылками!)
-S (эффективно обрабатывать файлы с дырками)
--block-size=размер (размер блока для сравнения контрольных сумм - 700)
-e ssh (транспортный уровень; можно через переменную окружения RSYNC_RSH)
--rsync-path=путь (путь к rsync на удаленном хосте)
--partial (сохранять частично переданные файлы)
--timeout=секунд (по умолчанию 0 - бесконечность)
--temp-dir=директория (где хранить файлы во время пересылки)
--compare-dest=директория
--compress (gzip, но используется информация о пересылаемых структурах,
что при большом числе неизмененных файлов будет полезно)
Синтаксис шаблона (и не лениво людям придумывать свои
правила описания шаблонов?):
если шаблон начинается с обычной косой черты, то он сопоставляется
с началом имени файла, иначе с концом имени файла
если шаблон завершается косой чертой, то он сопоставляется только
с директорий
метасимволы *, ? и [ действуют как в шаблонах shell
если в шаблоне имеются две ** подряд, то все метасимволы могут
сопоставляться с косой чертой, иначе их действие останавливается
косыми чертами
если шаблон содершит нефинальную косую черту, то он сопоставляется
полному имени файла, иначе последнему компоненту; только учтите, что
алгоритм работает рекурсивно
Позволяет осуществить массовую автоматическую рассылку файлов
с локального хоста на несколько сотен хостов с проверкой наличия места,
рассылкой извещений о проблемах, исполнением завершающих процедур и т.п..
Сохраняет имя владельца, имя группы, права доступа и время модификации файла.
Самый подходящий инструмент, если необходимо автоматизировать обновление
пакетов на нескольких сотнях компьютеров. В качестве транспорта позволяет
использовать rcmd(3) с помощью демона rdistd
(не рассматриваю из-за
проблем с безопасностью), rsh (не рассматриваю по тем же причинам)
и ssh (не забудьте снять setuid).
Канал передачи используется неэффективно в отличие от rsync
Опции:
-A число (минимальное число свободных inode перед копированием)
-a число (минимальное число свободных байт перед копированием)
-D (отладочная печать)
-d имя=значение (переопределение переменной из конфигурационного файла)
-F (не распараллеливать пересылку)
-f имя-конфигурационного-файла
-l опции-локального-журнала
-L опции-удаленного-журнала
-M число (максимальное число параллельных пересылок; по умолчанию - 4)
-m хост (ограничить пересылку указанным хостом; может быть несколько)
-n (печатать команды без реального исполнения)
-o опции-через-запятую
verify (только проверить, что файлы на всех хостах не устарели)
noexec (не пересылать файлы формата a.out; а ELF?)
younger (не пересылать файлы, которые моложе на удаленном хостк;
обычно проверяется на несовпадение mtime и size)
compare (проводить полное бинарное сравнение файлов перед пересылкой вместо
сравнения mtime и size)
follow (копировать файл, на который указывает символьная ссылка, а
не саму ссылку)
ignlnks (не предупреждать о неразрешимых ссылках)
chkreadonly (предварительно проверять, что удаленный файл не лежит в
файловой системе, открытой только на чтение)
quiet
remove (удалять на удаленном хосте файлы, которых нет на локальном хосте)
nochkowner (несовпадение владельца файла не является поводом для пересылки)
nochkgroup (то же для группы)
nochkmode (то же для прав доступа)
nodescend (не делать рекурсивный обход)
numchkgroup (использовать gid вместо имени группы)
numchkowner (использовать uid вместо имени владельца)
savetargets (делать backup переименовав файл в файл.OLD)
sparse (эффективно обрабатывать файлы с дырками)
-p путь-rdistd
-P /usr/local/bin/ssh (использовать в качестве транспорта ssh;
выполняется команда: ssh хост -l удаленное-имя-пользователя rdistd -S)
-t секунд (timeout)
[имя ...] (имя файла или метки конфигурационного файла;
по умолчанию - все файлы)