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

Страницы

Расширенный поиск в статьях блога

16 апреля 2012 г.

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 [-8E] [-e escape-символ] [-l имя-пользователя] удаленный-хост

Ключи:

  • -8 - 8-битный ввод (любите ли вы русский язык ;)
  • -E - не обрабатывать escape-символы
  • -e escape-символ - задает escape-символ вместо стандартного символа '~'
  • -l имя-пользователя - задает имя пользователя на удаленном хосте (по умолчанию совпадает с именем пользователя на локальном хосте)

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

  • ~. - разорвать соединение

Позволяет выполнять команду на удаленном хосте (514/TCP). Стандартный ввод rsh передается на стандартный ввод удаленной команды. Стандартный вывод удаленной команды передается на стандартный вывод rsh. stderr удаленной команды передается на stderr rsh по дополнительному каналу. Сигналы INT, HANG, TERM передаются удаленной команде.

Синтаксис:
rsh [-n] [-l имя-пользователя] удаленный-хост [команда]

Ключи:

  • -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 поддерживает этот запрет)
  • -L (не использовать .rhosts и hosts.equiv)

Файлы /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 (обрабатывать символьные ссылки как обычные файлы)
    • --copy-unsafe-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_RSH=ssh
  • CVSIGNORE=шаблон

Типичный пример использования:

  • rsync -e ssh -vacu user@host:dir/ .
  • rsync -e ssh -vacu --exclude '.*.swp' . user@host:dir/

Для использования протокола обмена с сервером 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 - команда, выполняемая после передачи файла

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

  • настройки сервера в /etc/rsyncd.conf
    [имя-синхронизируемого-каталога]
    path = куда-класть-копию
    read only = false
    # преобразование символьных ссылок по потребности
    uid = 0
    gid = 0
    auth users = имя-пользователя-rsync
    secrets file = /etc/rsync.secret
    strict modes = true
    hosts allow = ip-адрес-клиента

    ...


  • содержимое файла /etc/rsync.secret (права - root:root 700)

    имя-пользователя-rsync:пароль
    ...


  • на клиентском компьютере в cron добавить вызов скрипта ()

    rsync -a --delete --exclude лишнее --delete-excluded --password-file=/root/rsync.password путь/ \
    имя-пользователя-rsync@сервер::имя-синхронизируемого-каталога/


  • на клиентском компьютере в файле /root/rsync.password только пароль; права - root:root 700



lsyncd (пакет lsyncd 2.0.4 в EPEL5 и EPEL6) - сервер, отслеживающий изменяемые файлы в дереве каталогов с использованием inotify и запускающий rsync. Требует наличия lua. Необходимо учитывать, что каждый каталог необходимо отдельно поставить на "прослушку", что требует много времени и ресурсов (сам lsyncd занимает 1GB на 2 миллиона каталогов).


Ключи запуска:



  • -delay секунд # задержка при сборе пакетов изменившихся файлов


  • -log уровень-сообщений # scarce (только ошибки), all (включая отладочные сообщения), Exec


  • -nodaemon


  • -pifile имя-pid-файла


  • имя-конфигурационного-файла


Настройка 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={"-asS", "--delete", "--ignore-errors", "--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), документация пока только в почтовых рассылках. Пример в clamav (on-access scanner), systemd (readahead). Исследование производительности.



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


Опции:



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


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



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



.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free