@ Карта сайта News Автора!

Bog BOS: rsh и r*-команды: принципы работы, использование и настройка

Последние изменения:
2015.11.18: hard: обновлена статья про ИБП и их мониторинг

Последнее изменение файла: 2017.02.02
Скопировано с www.bog.pp.ru: 2017.03.26

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", в котором все байты передаются на сервер "как есть". Поддерживается возможность динамического изменения размера окна виртуального терминала (в пикселях и колонках/строках).

rlogin

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

Синтаксис:
rlogin [-8E] [-e escape-символ] [-l имя-пользователя] удаленный-хост

Ключи:

escape-последовательности (распознаются только в начале строки, escape-символ можно задавать ключом -e):

rsh

Позволяет выполнять команду на удаленном хосте (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)

rcp - копирование файлов между хостами (оба могут быть удаленными). Имя файла записывается в виде: [[user@]host:]file. Если файл назначения является именем директории, то исходный(е) файл(ы) копируются в нее. Относительные имена отсчитываются относительно домашней директории соответствующего пользователя на соответствующем хосте. Имена могут быть защищены (апострофами, кавычками или обратной косой) от локальной интерпретации. Опции:

Сервер in.rshd

Сервер 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

Сервер 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

Файлы /etc/hosts.equiv и .rhosts в домашнем каталоге содержат список хостов и имён пользователей, которым разрешено и запрещено иметь доступ к сервисам rlogind и rshd без пароля. Каждая запись на отдельной строке. Строки, начинающиеся с '#', являются комментариями. Первое поле строки описывает хост, с которого приходит запрос. Второе поле, если оно указано, описывает имя пользователя на удалённом хосте. Если перед именем хоста стоит знак '-', то запросы с данного хоста отвергаются. Если перед именем удалённого пользователя стоит знак '-', то запросы от этого пользователя отвергаются. Перед именем хоста или пользователя может стоять знак '+' (по умолчанию). Если строка стоит только из знака '+', то принимаются запросы с любого хоста и от имени любого пользователя.

При использовании NIS можно использовать сетевые группы (@имя-группы).

Файл должен быть обычным файлом, принадлежать root или пользователю и закрыт на запись другим пользователям.

Сервер in.rexecd

Сервер in.execd запускается из xinetd (/etc/xinetd.d/rsh) и обслуживает запросы 512/tcp (exec). Для аутентификации используется имя (до 16 символов) и незашифрованный пароль (до 16 символов). Для stderr используется дополнительный канал (см. rsh).

Синхронизация файлов на удаленных хостах (rsync)

Аналогично 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) и текстовые. Глобальные параметры:

параметры модулей

Пример использования для резервного копирования.

До RHEL/CentOS никак не доберётся версия 3.1, в которой увеличен параллелизм, ускорен --inplace и появился --preallocate.

lsyncd

lsyncd (пакет lsyncd 2.0.4 в EPEL5 и EPEL6) - сервер, отслеживающий изменяемые файлы в дереве каталогов с использованием inotify и запускающий rsync. Требует наличия lua. Необходимо учитывать, что каждый каталог необходимо отдельно поставить на "прослушку", что требует много времени и ресурсов (сам 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"},
--	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). Исследование производительности.

rdist

Позволяет осуществить массовую автоматическую рассылку файлов с локального хоста на несколько сотен хостов с проверкой наличия места, рассылкой извещений о проблемах, исполнением завершающих процедур и т.п.. Сохраняет имя владельца, имя группы, права доступа и время модификации файла. Самый подходящий инструмент, если необходимо автоматизировать обновление пакетов на нескольких сотнях компьютеров. В качестве транспорта позволяет использовать rcmd(3) с помощью демона rdistd (не рассматриваю из-за проблем с безопасностью), rsh (не рассматриваю по тем же причинам) и ssh (не забудьте снять setuid). Канал передачи используется неэффективно в отличие от rsync

Опции:

Опции журнализации.

Формат конфигурационного файла.

rsh в IOS

Смотри в описании Cisco IOS (немного подумав, я остановил этот сервис, чего и вам советую).

Ссылки

@ Карта сайта News Автора!

Bog BOS: rsh и r*-команды: принципы работы, использование и настройка

Последние изменения:
2015.11.18: hard: обновлена статья про ИБП и их мониторинг

TopList

Copyright © 1996-2017 Sergey E. Bogomolov; www.bog.pp.ru (КГБ знает все, даже то что у Вас на диске ;)