Последнее изменение файла: 2011.11.29
Скопировано с www.bog.pp.ru: 2012.02.04
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 ("rsync --daemon"; доступ анонимный или с аутентификацией), порт 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, но используется информация о пересылаемых структурах,
что при большом числе неизмененных файлов будет полезно)
--whole-file (пересылать файлы целиком, не пытаясь вычислить разницу)
--inplace (замена файлов "на месте", по умолчанию создаётся временный файл, который затем переименовывается)
Синтаксис шаблона (и не лениво людям придумывать свои
правила описания шаблонов?):
если шаблон начинается с обычной косой черты, то он сопоставляется
с началом имени файла, иначе с концом имени файла
если шаблон завершается косой чертой, то он сопоставляется только
с директорий
метасимволы *, ? и [ действуют как в шаблонах shell
если в шаблоне имеются две ** подряд, то все метасимволы могут
сопоставляться с косой чертой, иначе их действие останавливается
косыми чертами
если шаблон содершит нефинальную косую черту, то он сопоставляется
полному имени файла, иначе последнему компоненту; только учтите, что
алгоритм работает рекурсивно
Для использования протокола обмена с сервером rsync (TCP/873) надо
ставить два символа двоеточия между именем хоста и именем файла вместо одного
или использовать URI вида "rsync://[имя-пользователя@]хост[:порт]/модуль/путь".
Сервер rsync обеспечивает доступ не ко всему файловому пространству, а к набору модулей
(получить список можно командой "rsync имя-сервера::").
Некоторые модули могут требовать аутентификации.
Имеются возможности использовать прокси (HTTP proxy или nc) и запускать разовый rsync сервер
по транспортному каналу rsh/ssh.
Для запуска сервера rsync используется автономный режим или механизм xinetd (/etc/xinetd.d/rsync).
Ключи запуска:
--daemon
--address=адрес-привязки
--port=номер-порта
--bwlimit=КБ/сек # ограничение на пропускную способность передачи
--config=имя-файла-настроек
--no-detach # не уходить в фон
--log-file=имя-файла
--log-file-format=формат
--sockopts=опции-настройка-сокетов
--verbose
--ipv4
--ipv6
Настройки конфигурации задаются в файле /etc/rsyncd.conf (rsyncd.conf(5)).
Сервер rsync перечитывает файл настроек при каждом соединении клиента.
Файл имеет строчный формат (каждая строка имеет формат "имя = значение"; комментарии начинаются с символа '#';
пробелы игнорируются, кроме как внутри значения и имени модуля)
и делится на глобальную секцию (без заголовка) и секции модулей
(заголовком секции является имя модуля в квадратных скобках).
Значения делятся на логические (0, 1, no, yes, false, true) и текстовые.
Глобальные параметры:
motd file - имя файла, содержащего приветствие
pid file
port - номер входного порта (873)
address - адрес привязки входного порта (все)
socket options - см. setsockopt
параметры модулей
comment
path - имя каталога, который будет корнем модуля
use chroot - для запуска сервера треюуются права root, невозможно использовать абсолютные символьные ссылки
и ссылки вовне модуля (выключено)
numeric ids - отменить отображение имён для uid и gid (включено для chroot и выключено для прочих случаев
munge symlinks - модифицирует символьные ссылки (добавляет “/rsyncd-munged/”),
чтобы блокировать выход за рамки модуля, иначе rsync просто удаляет начальные "/" и ".." (включено)
charset - преобразование имён файлов
max connections - максимальное число одновременных соединений (0 - бесконечность)
log file (по умолчанию на syslog, открывается до chroot)
syslog facility - daemon
max verbosity - 1
lock file - используется для подсчёта числа соединений (/var/run/rsyncd.lock)
read only - по умолчанию запись запрещена
write only - false
list - показывать модуль в списке (true)
uid - от имени какого пользователя действовать (-2)
gid - от имени какой группы действовать (-2)
fake super - ?
filter - фильтр имён файлов на стороне сервера (клиент их не видит, не может записать или удалить);
приоритет фильтров в порядке убывания: "filter", "include from", "include", "exclude from", "exclude"
exclude - список шаблонов исключения для фильтра (через пробел)
exclude from - имя файла с шаблонами (о одному на строке)
include - список шаблонов разрешения для фильтра (через пробел)
include from - имя файла с шаблонами (о одному на строке)
incoming chmod - список (через запятую) параметров chmod для преобразования прав доступа входящих файлов;
применются в самом конце
outgoing chmod - список (через запятую) параметров chmod для преобразования прав доступа исходящих файлов;
применяются в начале преобразований
auth users - список допущенных пользователей (через пробел или запятую); имя пользователя не обязано существовать
в локальной системе; имена и пароли хранятся в "секретном" файле без шифрования;
при обмене пароли защищаются слабым методом;
данные не шифруются совсем;
по умолчанию - анонимный доступ под любым именем
secrets file - имена и пароли хранятся в "секретном" файле без шифрования в формате "имя:пароль"
(комментарии начинаются с '#'; пароль не более 8 символов?)
strict modes - проверять права доступа к "секретному" файлу
hosts allow - список шаблонов допущенных хостов (IP адреса, маски сетей, имена хостов, шаблоны имён)
hosts deny - список шаблонов недопущенных хостов; если используются и allow и deny, но допускаются и все,
непопавшие в оба списка
ignore errors - удалять файлы даже при наличии ошибок ввода/вывода
ignore nonreadable - делать вид, что недоступные файлы не существуют вовсе
transfer logging - пересылку каждого файла в журнал
log format - формат журнала пересылки файлов
timeout (0 - бесконечность)
refuse options - список недопустимых для клиентов опций через пробел
dont compress - список шаблонов имён файлов через пробел, которые не надо сжимать при отдаче (умолчание?)
pre-xfer exec - команда, выполняемая перед передачей файла
post-xfer exec - команда, выполняемая после передачи файла
Позволяет осуществить массовую автоматическую рассылку файлов
с локального хоста на несколько сотен хостов с проверкой наличия места,
рассылкой извещений о проблемах, исполнением завершающих процедур и т.п..
Сохраняет имя владельца, имя группы, права доступа и время модификации файла.
Самый подходящий инструмент, если необходимо автоматизировать обновление
пакетов на нескольких сотнях компьютеров. В качестве транспорта позволяет
использовать 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)
[имя ...] (имя файла или метки конфигурационного файла;
по умолчанию - все файлы)