Skip to content

CLI

CLI OpenKey (openkey) — интерфейс командной строки для разработчиков, которые хранят секреты, API-токены, SSH-ключи и материал .env в сейфе OpenKey. Она может работать полностью офлайн для генерации паролей, общаться с разблокированным desktop-приложением OpenKey через локальный нативный мост и опционально аутентифицироваться на self-hosted sync-сервере для pull шифротекста и короткоживущей CLI-сессии.

Требуется Node.js 20+.

Архитектура

Диаграмма ниже показывает, кто с кем общается. Генерация паролей остаётся офлайн. Команды сейфа предпочитают разблокированное desktop-приложение. Sync с сервером опциональна.

Архитектура OpenKey CLI: CLI общается с desktop-приложением через нативный мост, сканирует эту машину для discover и опционально синхронизирует шифротекст с self-hosted сервером
РежимКогда применяетсяЧто может делать
ОфлайнВсегдаgen — без приложения и сервера
Нативный мостDesktop-приложение разблокировано на этой машинеCRUD секретов, импорт через discover, search/get/copy по секретам и логинам
CLI-сессияПосле login + eval $(openkey unlock)Те же операции сейфа против локального кэша шифротекста; sync тянет с сервера

Как команда сейфа выбирает backend

Блок-схема: команда сейфа проверяет desktop-мост, затем OPENKEY_SESSION; иначе ошибка с подсказкой разблокировки
  1. Если desktop-мост отвечает → использовать режим native (предпочтительно; регистрация на сервере не нужна).
  2. Иначе, если OPENKEY_SESSION задана и валидна → использовать режим session (локальный кэш / материал с сервера).
  3. Иначе → команды, которым нужен сейф, завершаются с подсказкой разблокировать приложение или выполнить eval $(openkey unlock).

Мост принимает соединения только с локальной машины и только пока сейф разблокирован. На Unix используется сокет под известными путями OpenKey (переопределение через OPENKEY_NATIVE_SOCKET). На Windows — файл порта localhost под %LOCALAPPDATA%\OpenKey\ (переопределение через OPENKEY_NATIVE_PORT).

Установка

bash
cd openkey_cli
npm install
npm run build
npm link          # optional: puts `openkey` on your PATH

Без link:

bash
npx tsx src/cli.ts --help
# after build:
node dist/cli.js --help

Проверка:

bash
openkey --version
openkey status

Конфигурация и хранение

Локальное состояние CLI хранится в каталоге конфигурации платформы (режим файла 600 при поддержке):

ПлатформаПуть
macOS~/Library/Application Support/OpenKey/config.json
Linux~/.config/openkey/config.json (или $XDG_CONFIG_HOME/openkey/)
Windows%APPDATA%\OpenKey\config.json

Файл может содержать: URL сервера, email, access/refresh токены, salt и параметры KDF, обёрнутый ключ сейфа, длительность блокировки сессии, revision сервера и шифротекстный кэш записей/коллекций после sync. Мастер-пароль в открытом виде не хранится.

Команды config

bash
openkey config set-server https://openkey.example.com
openkey config show
openkey config set-lock 30    # session lifetime in minutes (1–1440, default 15)
  • set-server требует URL, начинающийся с http:// или https:// (завершающий слэш удаляется).
  • URL сервера по умолчанию до первого set: http://localhost:8000.

Глобальные опции

ФлагЭффект
--jsonJSON, читаемый машиной, на stdout для скриптов
--help / --versionСправка и версия

Ставьте --json перед подкомандой при использовании глобальных опций Commander, например openkey --json status.

Генерация паролей (gen)

Полностью офлайн. Не требует приложения или сервера.

bash
openkey gen
openkey gen -l 24 --no-symbols
openkey gen -l 32 -a -c
openkey --json gen -l 20
ОпцияОписаниеПо умолчанию
-l, --length <n>Длина (практический диапазон 4–64)20
--no-upperИсключить заглавные буквывыкл.
--no-lowerИсключить строчные буквывыкл.
--no-digitsИсключить цифрывыкл.
--no-symbolsИсключить символывыкл.
-a, --avoid-ambiguousИзбегать неоднозначных символов Il1O0oвыкл.
-c, --copyКопировать в буфер обмена вместо выводавыкл.

С -c человекочитаемый режим печатает подтверждение; JSON-режим возвращает { "copied": true, "length": N }. Без -c пароль выводится (или { "password": "..." } в JSON-режиме).

Статус и гигиена

bash
openkey status
openkey forget

status сообщает URL сервера, email, состояние входа, доступность моста, режим разблокировки (native / session), оставшееся время сессии и число записей в кэше.

forget стирает локальный конфиг CLI и кэшированный шифротекст. Не удаляет секреты внутри сейфа desktop-приложения. После forget снова выполните config set-server / login, если используете серверный режим.

Секреты разработчика (secret)

Секреты живут в зарезервированной области Secrets сейфа (__dev_secrets__), сгруппированы по устройству (метка машины; hostname по умолчанию). Команды требуют разблокированное desktop-приложение или валидную OPENKEY_SESSION.

Типы

ТипТипичное использованиеПримечания
apiTokenPAT, API-ключиПо умолчанию
sshKeyПриватные ключиПредпочитайте --file / --public-key-file
envSnippetПолные тела .envПредпочитайте --file
otherУниверсальный

Алиасы вроде ssh, api, token, env, .env нормализуются к типам выше.

secret add

bash
openkey secret add --name "GitHub PAT" --kind apiToken --secret ghp_...
openkey secret add -n "deploy key" -k sshKey -f ~/.ssh/id_ed25519 \
  --public-key-file ~/.ssh/id_ed25519.pub -H git.example.com -u git
openkey secret add -n "acme .env" -k envSnippet -f ./apps/api/.env -d laptop
ОпцияОписание
-n, --nameОтображаемое имя (обязательно)
-k, --kindsshKey | apiToken | envSnippet | other
-s, --secretInline-значение секрета (- читает stdin)
-f, --fileЧитать тело секрета из файла
--stdinЧитать секрет из stdin (лучше, чем токены в argv)
-u, --usernameОпциональное имя пользователя
-H, --hostОпциональный host
-d, --deviceМетка коллекции устройства (по умолчанию: hostname)
--public-key / --public-key-fileSSH публичный ключ
--passphrasePassphrase ключа
--notesПроизвольные заметки

Укажите --secret, --file или --stdin (непустой). Созданные записи возвращают UUID.

bash
printf '%s' "$TOKEN" | openkey secret add -n "CI token" --stdin

secret list / get / copy / rm / update / export / devices

bash
openkey secret list
openkey secret list -d laptop -k apiToken
openkey secret get "GitHub"
openkey secret copy ghp
openkey secret update "GitHub PAT" --secret ghp_new...
printf '%s' "$TOKEN" | openkey secret update "GitHub PAT" --stdin
openkey secret export -d laptop -o .env.local
openkey secret export --format exports   # for eval
openkey secret devices
openkey secret rm "old token" -y
  • list — таблица с префиксом UUID, именем, типом, устройством и замаскированным секретом. Опциональные фильтры -d/--device и -k/--kind.
  • get / copy / rm / update — совпадение по имени, host или префиксу UUID. При нескольких совпадениях подстроки побеждает точное имя/заголовок, host или уникальный префикс UUID (≥4 символа); иначе команда завершается с кандидатами.
  • update — патчит только переданные флаги (--name, --secret/--file/--stdin, --kind, --device, …). Требует обработчик updateSecret desktop-моста (OpenKey app этой версии) или CLI-сессию.
  • export — записывает секреты как dotenv (KEY=value; тела envSnippet inline) или shell-строки с --format exports. -o пишет файл с режимом 600 при поддержке.
  • devices — список меток коллекций устройств и счётчиков.
  • get печатает plaintext (или полный JSON-объект в режиме --json).
  • copy записывает plaintext в буфер обмена.
  • rm запрашивает подтверждение, кроме -y / --yes.

Инъекция секретов в shell (env / run)

bash
# Print export lines for eval (NAME or NAME=query)
eval $(openkey env DATABASE_URL)
eval $(openkey env DB=DATABASE_URL GH="GitHub PAT")

# Or run a child process with secrets in its environment
openkey run -e DATABASE_URL -e GH="GitHub PAT" -- npm start
ФормаЗначение
NAMEПеременная окружения NAME; ищет элемент сейфа по этому имени
NAME=queryПеременная окружения NAME; ищет по query (имя / host / UUID)

--json на env возвращает объекты с env, query, name, uuid и value. --raw печатает одно plaintext-значение (ровно одна привязка).

Обнаружение (discover)

Сканирует эту машину и импортирует новые секреты в группу устройства. Дедуплицирует против значений уже в сейфе (по типу + имени + отпечатку содержимого).

Поток discover: сканировать локальные источники, предпросмотр замаскированных значений, дедупликация отпечатков, затем сохранение в группу устройства сейфа
bash
openkey discover --dry-run
openkey discover -y
openkey discover -d workstation -p ~/src/acme -p ~/src/labs --depth 3
openkey discover --no-aws --no-env-vars
ОпцияОписаниеПо умолчанию
-d, --deviceИмя коллекции устройстваhostname
-p, --path <dir>Корень(и) проекта для обхода .env (повторяемый)cwd
--depth <n>Максимальная глубина каталогов для .env4
--no-sshПропустить приватные ключи в ~/.sshсканирование вкл.
--no-env-filesПропустить файлы .env / .env.*сканирование вкл.
--no-env-varsПропустить переменные окружения процессасканирование вкл.
--no-awsПропустить ~/.aws/credentialsсканирование вкл.
--no-ghПропустить токены GitHub CLI в hosts.ymlсканирование вкл.
--no-dockerПропустить registry auth в ~/.docker/config.jsonсканирование вкл.
--dry-runТолько список; не сохранятьвыкл.
-y, --yesИмпорт без интерактивного подтверждениявыкл.

Что сканируется

  • SSH — приватные ключи в ~/.ssh (пропускает known_hosts, authorized_keys, config, файлы .pub); прикрепляет соседний .pub, если есть.
  • Переменные окружения — известные имена (GITHUB_TOKEN, OPENAI_API_KEY, DATABASE_URL, …) и имена с секретоподобными суффиксами; пропускает PATH, HOME, OPENKEY_SESSION, OPENKEY_PASSWORD и т.д.
  • AWS — профили в ~/.aws/credentials.
  • GitHub CLI — записи oauth_token / token в ~/.config/gh/hosts.yml.
  • Docker — декодированные auths из ~/.docker/config.json.
  • Файлы .env — обход от корней, пропуская node_modules, .git, dist, virtualenv и т.д.; действуют лимиты размера и числа файлов.

Dry-run работает даже при заблокированном сейфе (только список). Сохранение требует разблокированный мост или сессию. Уже импортированные секреты помечаются как пропущенные.

Поиск по секретам и логинам

Эти команды ищут секреты разработчика и записи логинов:

bash
openkey search github
openkey get "GitHub"
openkey get "GitHub" --field username
openkey copy api.example.com --field totp
openkey totp "GitHub" -c
openkey logins
КомандаВывод
search <query>Замаскированная таблица (или JSON-превью); показывает доступность TOTP
get <query>Поле лучшего совпадения (--field password|username|url|totp|notes)
copy <query>Копия поля в буфер обмена (автоочистка через 45с; --keep чтобы отключить)
totp <query>Живой TOTP-код (-c копировать, -w наблюдать до Ctrl+C)
loginsСписок логинов с username / URL / флагом TOTP
doctorДиагностика Node, прав config, моста, сессии, /health сервера, буфера обмена

Неоднозначные совпадения подстрок предпочитают точное имя/заголовок, host или уникальный префикс UUID; иначе перечисляют UUID, тип и метку — уточните запрос. Предпочитайте secret get / secret copy, если нужна только секция Secrets.

Используйте secret set для upsert по имени + устройству (создать или обновить). sync --push отправляет локальный кэш шифротекста перед pull.

Опциональный self-hosted сервер

Используйте этот путь, когда desktop-приложение недоступно на машине (например доступ к сейфу только с телефона через sync) или когда нужен кэш шифротекста в CLI.

Поток сервера: set-server, login с auth_hash, pull шифротекста в локальный кэш, затем eval unlock для установки OPENKEY_SESSION для команд сейфа
bash
openkey config set-server http://localhost:8000
openkey login --email [email protected]
eval $(openkey unlock)
openkey sync

Установка сервера: Установка сервера.

Поток аутентификации

  1. login — запрашивает email (или -e) и мастер-пароль (или OPENKEY_PASSWORD). Выполняет prelogin для salt/KDF, выводит auth_hash через Argon2id, получает JWT, загружает обёрнутый материал ключа сейфа, проверяет пароль при развёртывании и затем тянет шифротекст в локальный кэш. Никогда не передавайте мастер-пароль флагом CLI.
  2. unlock — снова выводит ключ сейфа, обновляет токены/sync при доступном сервере и печатает shell-export для OPENKEY_SESSION (используйте eval $(openkey unlock)). Опции: -e/--email, --raw (только токен). JSON-режим выдаёт поля сессии.
  3. lock — печатает unset OPENKEY_SESSION (или JSON-подсказку), чтобы можно было eval $(openkey lock).
  4. logout — очищает access/refresh токены; сохраняет локальный кэш шифротекста. Сочетайте с lock, чтобы очистить env сессии.
  5. sync — требует login; тянет записи/коллекции и обновляет serverRevision.

Время жизни сессии по умолчанию 15 минут (config set-lock). Истёкшие сессии требуют снова unlock.

Переменные окружения

ПеременнаяНазначение
OPENKEY_SESSIONКороткоживущий зашифрованный blob сессии из unlock
OPENKEY_PASSWORDМастер-пароль для неинтерактивного login / unlock (только скрипты/CI)
OPENKEY_EMAILEmail аккаунта для неинтерактивного login / unlock
OPENKEY_NATIVE_SOCKETПереопределить путь сокета Unix-моста
OPENKEY_NATIVE_PORTПереопределить порт Windows-моста

Предпочитайте интерактивный запрос пароля на личных машинах. Относитесь к OPENKEY_PASSWORD и токенам сессии как к секретному материалу в логах CI.

Shell completions

bash
eval "$(openkey completion bash)"
eval "$(openkey completion zsh)"
openkey completion fish | source

Справочник команд

КомандаНужен доступ к сейфу?Описание
genНетОфлайн-генерация паролей
discoverСохранение: да* / dry-run: нетСканировать SSH / .env / env / AWS → группа устройства
secret add|list|get|copy|rm|update|export|devicesДа*Секреты разработчика
get / copy / search / totp / loginsДа*Секреты + логины (TOTP, выбор поля)
doctorНетДиагностика моста / сессии / сервера
env / runДа*Экспорт секретов в shell / дочерний процесс
completionНетCompletions bash / zsh / fish
statusНетСостояние моста / сессии / сервера
config set-server|show|set-lockНетКонфигурация CLI
login / logoutОпциональная auth сервера
unlock / lockОпциональная CLI-сессия
syncТребуется loginPull шифротекста с сервера
forgetНетСтереть локальный конфиг CLI + кэш

*Разблокированное desktop-приложение или валидная OPENKEY_SESSION после server login.

Модель безопасности

  • Команды list/search маскируют значения; используйте get / copy только когда нужен plaintext.
  • Sync-сервер хранит только шифротекст; CLI выводит ключи локально, как другие клиенты OpenKey.
  • Не передавайте мастер-пароль флагом; избегайте логирования OPENKEY_PASSWORD или OPENKEY_SESSION.
  • Трафик моста только локальный и требует разблокированный сейф.
  • Токены сессии истекают; уменьшайте время жизни через config set-lock на общих машинах.
  • forget очищает состояние CLI на диске; ротируйте токены сервера через logout, если машина стала недоверенной.

Разработка

bash
cd openkey_cli
npm test
npm run typecheck
npm run build

См. также