Перейти к содержанию

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.

Установление сеанса

  1. Инициатор устанавливает соединение (link)
  2. Слушатель переходит в состояние LSSTATE_WAIT_IDENT (или LSSTATE_WAIT_VERS при использовании --no-auth)
  3. Инициатор передаёт свою Identity (если не используется --no-id)
  4. При использовании --allowed-hash слушатель проверяет Identity и при несоответствии отправляет ошибку протокола
  5. Инициатор передаёт VersionInformationMessage для проверки совместимости
  6. Слушатель отвечает VersionInfoMessage и переходит в LSSTATE_WAIT_CMD
  7. Инициатор отправляет ExecuteCommandMessage (может быть пустой командой)
  8. Слушатель проверяет команду против настроек (-A или -C) и при ошибке отправляет ошибку протокола
  9. Слушатель запускает программу и переходит в режим сеанса

Цикл сеанса

Состояние слушателя LSSTATE_RUNNING:

  • WindowSizeMessage — установка размера окна дочернего tty
  • StreamDataMessage — поток данных для дочернего процесса (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 — управление идентичностями