rnsh¶
rnsh — утилита для организации удалённого доступа к оболочке (shell) через сеть Reticulum. Позволяет создавать защищённые сеансы удалённого терминала между узлами сети Reticulum. Для простого выполнения команд также рекомендуется использовать утилиту rnx.
Примеры использования¶
Получение информации об Identity перед настройкой:
# На слушателе (сервере)
$ rnsh -l -p
# На инициаторе (клиенте)
$ rnsh -p
Запуск слушателя с разрешённой Identity:
$ rnsh -l -a 6d47805065fa470852cf1b1ef417a1ac -- /bin/zsh
Подключение к слушателю:
$ rnsh a5f72aefc2cb3cdba648f73f77c4e887
Запуск слушателя с анонсированием:
# Анонсировать при запуске и каждые 60 секунд
$ rnsh -l -b 60 -a <identity_hash>
Все опции командной строки¶
usage: rnsh [-h] [--config DIR] [-i FILE] [-s NAME] [-v] [-q] [-p] [-l]
[-b PERIOD] [-a HASH] [-n] [-N] [-A] [-C] [-m] [-w TIME]
[--version] [destination] [--] [program] [arg ...]
Утилита удалённой оболочки Reticulum
Позиционные аргументы:
destination шестнадцатеричный хеш назначения слушателя
program программа для запуска при подключении
arg аргументы программы
Опции:
-h, --help показать это сообщение и выйти
--config DIR альтернативная директория конфигурации Reticulum
-i FILE, --identity FILE
путь к файлу Identity для использования
-s NAME, --service NAME
имя службы для файла Identity (если не default)
-p, --print-identity
вывести информацию об Identity и выйти
-l, --listen режим слушателя (сервера)
-b PERIOD, --announce PERIOD
интервал анонсов в секундах (0 = только при запуске)
-a HASH, --allowed HASH
разрешить подключение указанной Identity (можно несколько)
-n, --no-auth отключить аутентификацию
-N, --no-id не идентифицироваться при подключении
-A, --remote-command-as-args
добавить удалённую команду к аргументам программы
-C, --no-remote-command
отключить выполнение команд от удалённой стороны
-m, --mirror вернуть код выхода удалённого процесса
-w TIME, --timeout TIME
таймаут подключения и запроса в секундах
-v, --verbose увеличить подробность вывода (можно несколько раз)
-q, --quiet уменьшить подробность вывода (можно несколько раз)
--version показать номер версии программы и выйти
Уровни логирования¶
| Уровень | Описание |
|---|---|
| CRITICAL | Полностью тихий режим |
| ERROR | Только ошибки (по умолчанию для инициатора) |
| WARNING | Предупреждения |
| INFO | Информация (по умолчанию для слушателя) |
| DEBUG | Отладочная информация |
Расположение файлов¶
- Файл Identity по умолчанию:
~/.reticulum/identities/rnsh - Директория конфигурации Reticulum:
~/.reticulum/(или указывается через--config)
Типичные сценарии использования¶
1. Настройка сервера для приёма подключений¶
# Запуск слушателя с разрешением конкретной Identity
$ rnsh -l -a <trusted_identity_hash>
# Запуск с указанием конкретной оболочки
$ rnsh -l -a <trusted_identity_hash> -- /bin/zsh
2. Подключение к удалённому терминалу¶
# Базовое подключение
$ rnsh <destination_hash>
# Подключение с использованием альтернативной Identity
$ rnsh <destination_hash> -i /path/to/identity
3. Запуск без аутентификации (не рекомендуется для продакшена)¶
# На стороне слушателя
$ rnsh -l -n
# На стороне клиента
$ rnsh <destination_hash> -N
4. Запуск с анонсированием службы¶
# Анонсировать при запуске и каждые 300 секунд
$ rnsh -l -b 300 -a <identity_hash>
5. Ограничение выполнения удалённых команд¶
# Запретить выполнение команд от клиента
$ rnsh -l -C -a <identity_hash>
# Или наоборот: команда клиента добавляется к аргументам программы
$ rnsh -l -A -a <identity_hash> -- /usr/local/bin/myapp
Как это работает¶
Слушатели (серверы)¶
Слушатель — это серверная часть rnsh. Каждый слушатель настраивается с:
- Identity RNS — криптографический идентификатор
- Именем службы — вместе с Identity формирует хеш назначения
Каждый слушатель должен использовать уникальную Identity. Параметр -s позволяет указать имя службы, что создаёт уникальный файл Identity.
Слушатель может быть настроен на запуск определённой команды при подключении. Инициатор также может передать свою командную строку. Обработка команд зависит от опций:
-C— командная строка инициатора не допускается, соединение будет разорвано-A— командная строка инициатора добавляется к настроенной командной строке слушателя- Без этих опций — используется первая допустимая команда из списка:
- Командная строка инициатора
- Аргумент командной строки слушателя
- Оболочка по умолчанию пользователя, от которого запущен слушатель
Если не установлена опция -n, инициатор должен пройти аутентификацию перед запуском команды. Программа запускается с хешем Identity инициатора в переменной окружения RNS_REMOTE_IDENTITY.
Инициаторы (клиенты)¶
Инициатор — это клиентская часть. Каждый инициатор имеет Identity, которая используется для аутентификации в сети Reticulum. Этот хеш необходимо настроить в слушателе для разрешения подключения.
Для получения хеша Identity используйте флаг -p.
Протокол¶
Протокол построен поверх Packet API Reticulum. Программное обеспечение обменивается объектами Message, которые инкапсулируются в объекты Packet.
Установление сеанса¶
- Инициатор устанавливает соединение (link)
- Слушатель переходит в состояние
LSSTATE_WAIT_IDENT(илиLSSTATE_WAIT_VERSпри использовании--no-auth) - Инициатор передаёт свою Identity (если не используется
--no-id) - При использовании
--allowed-hashслушатель проверяет Identity и при несоответствии отправляет ошибку протокола - Инициатор передаёт
VersionInformationMessageдля проверки совместимости - Слушатель отвечает
VersionInfoMessageи переходит вLSSTATE_WAIT_CMD - Инициатор отправляет
ExecuteCommandMessage(может быть пустой командой) - Слушатель проверяет команду против настроек (
-Aили-C) и при ошибке отправляет ошибку протокола - Слушатель запускает программу и переходит в режим сеанса
Цикл сеанса¶
Состояние слушателя LSSTATE_RUNNING:
WindowSizeMessage— установка размера окна дочернего ttyStreamDataMessage— поток данных для дочернего процесса (ID 0, 1, 2 = stdin, stdout, stderr)NoopMessage— холостая операция, слушатель отвечаетNoopMessage
При разрыве соединения дочерний процесс завершается.
Состояние инициатора ISSTATE_RUNNING:
ErrorMessage— печать ошибки, разрыв соединения, выходStreamDataMessage— поток данных (ID 0, 1, 2 = stdin, stdout, stderr)CommandExitedMessage— удалённая команда завершилась
При неожиданном разрыве соединения выводится сообщение и происходит выход.
См. также¶
- Основы RNS — введение в протокол Reticulum
- Утилиты RNS — обзор всех утилит командной строки
- rnx — удалённое выполнение команд
- rnid — управление идентичностями