|
Bog BOS: rsh и r*-команды: принципы работы, использование и настройка |
Последние изменения: |
Последнее изменение файла: 2019.04.29
Скопировано с www.bog.pp.ru: 2024.12.14
Обеспечивают возможность удаленного выполнения команд (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", в котором все байты передаются на сервер "как есть". Поддерживается возможность динамического изменения размера окна виртуального терминала (в пикселях и колонках/строках).
Позволяет входить в удаленную систему с виртуального терминала.
Синтаксис:
rlogin [-8E] [-e escape-символ] [-l имя-пользователя] удаленный-хост
Ключи:
escape-последовательности (распознаются только в начале строки, escape-символ можно задавать ключом -e):
Позволяет выполнять команду на удаленном хосте (514/TCP). Стандартный ввод rsh передается на стандартный ввод удаленной команды. Стандартный вывод удаленной команды передается на стандартный вывод rsh. stderr удаленной команды передается на stderr rsh по дополнительному каналу. Сигналы INT, HANG, TERM передаются удаленной команде.
Синтаксис:
rsh [-n] [-l имя-пользователя] удаленный-хост [команда]
Ключи:
На клиентской машине необходимо открыть порты 1023/TCP и 1022/TCP (1022 для stderr; это в надежде, что одновременно не может исполняться больше одного rsh ;). Файл /usr/bin/rsh имеет права rws и владельца root, чтобы иметь возможность открыть исходящий порт ниже 1023.
rcp - копирование файлов между хостами (оба могут быть удаленными). Имя файла записывается в виде: [[user@]host:]file. Если файл назначения является именем директории, то исходный(е) файл(ы) копируются в нее. Относительные имена отсчитываются относительно домашней директории соответствующего пользователя на соответствующем хосте. Имена могут быть защищены (апострофами, кавычками или обратной косой) от локальной интерпретации. Опции:
Сервер 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"):
Сервер 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):
Файлы /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 должен быть установлен на обоих концах. Опции:
Синтаксис шаблона (и не лениво людям придумывать свои правила описания шаблонов?):
Переменные окружения:
Типичный пример использования:
Для использования протокола обмена с сервером rsync (TCP/873) надо ставить два символа двоеточия между именем хоста и именем файла вместо одного или использовать URI вида "rsync://[имя-пользователя@]хост[:порт]/модуль/путь". Сервер rsync обеспечивает доступ не ко всему файловому пространству, а к набору модулей (получить список можно командой "rsync имя-сервера::"). Некоторые модули могут требовать аутентификации. Имеются возможности использовать прокси (HTTP proxy или nc) и запускать разовый rsync сервер по транспортному каналу rsh/ssh. Для запуска сервера rsync используется автономный режим или механизм xinetd (/etc/xinetd.d/rsync). Ключи запуска:
Настройки конфигурации задаются в файле /etc/rsyncd.conf (rsyncd.conf(5)). Сервер rsync перечитывает файл настроек при каждом соединении клиента. Файл имеет строчный формат (каждая строка имеет формат "имя = значение"; комментарии начинаются с символа '#'; пробелы игнорируются, кроме как внутри значения и имени модуля) и делится на глобальную секцию (без заголовка) и секции модулей (заголовком секции является имя модуля в квадратных скобках). Значения делятся на логические (0, 1, no, yes, false, true) и текстовые. Глобальные параметры:
параметры модулей
Пример использования для резервного копирования.
[имя-синхронизируемого-каталога] path = куда-класть-копию read only = false # преобразование символьных ссылок по потребности uid = 0 gid = 0 auth users = имя-пользователя-rsync secrets file = /etc/rsync.secret strict modes = true hosts allow = ip-адрес-клиента ...
имя-пользователя-rsync:пароль ...
rsync -a --delete --exclude лишнее --delete-excluded --password-file=/root/rsync.password путь/ \ имя-пользователя-rsync@сервер::имя-синхронизируемого-каталога/
До RHEL/CentOS никак не доберётся версия 3.1, в которой увеличен параллелизм, ускорен --inplace и появился --preallocate.
lsyncd (пакет lsyncd 2.0.4 в EPEL5 и EPEL6) - сервер, отслеживающий изменяемые файлы в дереве каталогов с использованием inotify и запускающий rsync. Требует наличия lua. Необходимо учитывать, что каждый каталог необходимо отдельно поставить на "прослушку", что требует много времени и ресурсов (1kB несвопируемой памяти на каталог, и сам lsyncd занимает 1GB на 2 миллиона каталогов).
Ключи запуска:
Настройка inotify временно
echo 16777216 > /proc/sys/fs/inotify/max_user_watches echo 65536 > /proc/sys/fs/inotify/max_queued_events
Настройка inotify в /etc/sysctl.conf
fs.inotify.max_user_watches = 16777216 fs.inotify.max_queued_events = 65536
При необходимости (при получении сообщения о переполнении) max_queued_events необходимо увеличить.
Скопировать пример настройки /usr/share/doc/lsyncd-2.0.4/examples/lrsync.lua в /etc/lsyncd.conf.lua и отредактировать (представляет собой программу на Lua)
settings = { logfile = "/var/log/lsyncd.log", -- statusFile = "/tmp/lsyncd.stat", -- 200MB на 2 млн каталогов -- statusInterval = 1, -- и обновляется каждую секунду! -- logfacility = user, -- inotifyMode = "CloseWrite", maxDelays = 5000 } sync{ default.rsync, source="/каталог/", -- может быть несколько target="имя-пользователя-rsync@сервер-rsync::имя-ресурса/", target=... exclude={".Trash", ".thumbnails", "/temp"}, rsyncOps={"-lptgoDs", "--delete", "--ignore-errors", "--no-whole-file", "--inplace", "--password-file=/root/rsync.password"}, -- rsyncOps={"-a") - плохая идея, т.к. включает "-r" -- delay=3600 delay=10, -- записываемый файл будет обновляться каждые 10 секунд! -- одна только расстановка inotify на 2.5 миллиона каталогов занимает 2 часа (холодный старт) -- init = function(event) -- синхронизацию обеспечить внешними средствами после раскрутки -- log("Normal","Skipping startup synchronization...") -- end } sync{ ... } ...
Запуск:
lsyncd [-nodaemon] /etc/lsyncd.conf.lua
При остановке накопленный список не сбрасывается, хотя дожидается завершения уже начавшейся передачи. По умолчанию, inotify настраивается на закрытие файла на запись. По сигналу HUP перезапускается.
Пропускает создание файлов нулевой длины. Изменённые, но незакрытые файлы не пересылаются. Видимо имеется квадратичная зависимость от количества файлов в списке (и у lsyncd и у rsync), так что большие delay и maxDelays (5000?) применять с осторожностью. При инициализации может возникать "OVERFLOW on inotify event queue", после чего lsyncd начинает всё сначала (учитывать при использовании внешней синхронизации). При этом в журнал может попасть несколько гигабайт.
Статистика inotify в /sys/kernel/slab/inotify_event_cache и /sys/kernel/slab/inotify_watch_cache (slabs, slab_size, total_objects).
Кстати, fanotify (слежение сразу за всей иерархией) добрался до glibc (sys/fanotify.h) в версии 2.13 (в RHEL6.2 - 2.12), документация пока только в почтовых рассылках, не все нужные события отслеживаются (modify). Пример в clamav (on-access scanner), systemd (readahead). Исследование производительности.
Позволяет осуществить массовую автоматическую рассылку файлов с локального хоста на несколько сотен хостов с проверкой наличия места, рассылкой извещений о проблемах, исполнением завершающих процедур и т.п.. Сохраняет имя владельца, имя группы, права доступа и время модификации файла. Самый подходящий инструмент, если необходимо автоматизировать обновление пакетов на нескольких сотнях компьютеров. В качестве транспорта позволяет использовать rcmd(3) с помощью демона rdistd (не рассматриваю из-за проблем с безопасностью), rsh (не рассматриваю по тем же причинам) и ssh (не забудьте снять setuid). Канал передачи используется неэффективно в отличие от rsync
Опции:
Опции журнализации.
Формат конфигурационного файла.
Смотри в описании Cisco IOS (немного подумав, я остановил этот сервис, чего и вам советую).
|
Bog BOS: rsh и r*-команды: принципы работы, использование и настройка |
Последние изменения: |