Все команды вызываются как efs <команда>. Глобальный флаг -v, --verbose включает подробный вывод и доступен для любой команды, -V, --version печатает версию.
Без установки: python -m efs.cli <команда>.
efs --install-completion # установить для текущей оболочки
efs --show-completion # показать скрипт, не устанавливаяДополняются имена команд, пути к файлам и значения перечислений: --format (oss, container), --tool (cdxgen, trivy), --gost-default (yes, no, indirect). Эти же значения проверяются при запуске — неверное отвергается с указанием допустимых. Входные файлы проверяются на существование до начала работы.
Генерация SBOM внешним сканером — cdxgen или trivy. Настройки берутся из секции scanner конфига, аргументы командной строки их перекрывают.
Конфиг нужен не всегда: если передать --tool (а при необходимости --target и --output), команда отработает и без него. Мастер efs init запускается только когда нет ни конфига, ни аргументов и команда выполняется в терминале; в CI вместо мастера выводится подсказка.
efs scan [--tool cdxgen|trivy] [--target PATH] [--output FILE] [--config PATH]| Аргумент | Описание |
|---|---|
--tool |
Инструмент: cdxgen или trivy |
--target |
Путь к исходникам или имя образа |
--output, -o |
Выходной файл SBOM |
--config |
Путь к .efs-config.json |
Аргументы командной строки перекрывают значения из конфига.
{
"scanner": {
"tool": "trivy",
"output": "bom.json",
"target": ".",
"options": {
"command": "fs",
"args": ["--scanners", "license"]
}
}
}Для cdxgen содержимое options записывается в .cdxgenrc. Для trivy: command — подкоманда (fs, image, repo), args — дополнительные аргументы CLI.
Файл .cdxgenrc.example в репозитории показывает настройки cdxgen, с которыми efs работает по умолчанию: спецификация 1.6, профиль generic, только обязательные поля, без формуляций и криптоданных. Скопируйте его в проект, если хотите править настройки cdxgen напрямую, минуя конфиг.
Работа с единым конфигом. Подробности о структуре — в описании конфига.
Собрать конфиг из SBOM: все purl попадают в components, язык программирования подставляется по экосистеме.
efs config init <sbom.json> [-o PATH] [-i EXTRA...]| Аргумент | Описание |
|---|---|
sbom.json |
Входной SBOM |
-i, --extra-input |
Дополнительные SBOM (несколько сервисов в одном конфиге) |
-o, --output |
Путь к конфигу (по умолчанию .efs-config.json) |
Повторный запуск сохраняет уже сделанные настройки: добавляет новые компоненты и удаляет исчезнувшие. Если рядом лежит конфиг под прежним именем .sbom-config.json, настройки переносятся из него.
Показать, что осталось незаполненным.
efs config status [--config PATH] [--all]Выводит количество компонентов с VCS, с provided_by, исключённых, без языка и без источника, а также таблицу проблемных. С флагом --all показывает и заполненные.
Найти ссылки на репозитории для компонентов, у которых их нет, и записать в конфиг.
efs config find-vcs [--config PATH] [--workers N]Источники: ecosyste.ms, PyPI, npm, Maven Central, RubyGems, NuGet, Debian Sources, а также предсказуемые адреса репозиториев дистрибутивов (Fedora, CentOS Stream, Rocky, ALT, Salsa, Launchpad). Каждый найденный адрес проверяется на то, что это действительно репозиторий. Результаты кешируются в ~/.cache/efs.
Компоненты, помеченные exclude или имеющие provided_by, пропускаются.
Перенести старые файлы маппингов в единый конфиг.
efs config migrate [--vcs PATH] [--gost PATH] [--exclude PATH] [-o PATH]Читает .purl_to_vcs.json, .purl_to_gost.json, .purl_exclude.json из текущей директории (или по указанным путям) и объединяет их в .efs-config.json.
Приведение сырого вывода сканера к перечню: очистка лишних полей, применение конфига, нормализация ГОСТ-свойств, удаление исключённых компонентов.
efs postprocess <input.json> <output.json> [--config PATH]
[--app-name X] [--app-version Y] [--manufacturer Z]
[--gost-default yes|no|indirect] [--strip-only] [--keep-all-fields]
[--provided-by NAME] [--pretty/--no-pretty]
[--purl-to-vcs FILE] [--purl-to-gost FILE] [--purl-exclude FILE]| Аргумент | Описание |
|---|---|
input |
Входной BOM (JSON) |
output |
Выходной файл |
--config PATH |
Путь к конфигу; по умолчанию ищется в текущей директории |
--app-name |
Название продукта (metadata.component.name) |
--app-version |
Версия продукта |
--manufacturer |
Организация-изготовитель |
--gost-default |
Значение ГОСТ-свойств по умолчанию (no) |
--strip-only |
Только очистить лишние поля, не трогать metadata |
--keep-all-fields |
Не удалять необязательные поля компонентов |
--provided-by NAME |
Проставить GOST:provided_by листовым компонентам без него |
--pretty / --no-pretty |
Форматировать JSON (по умолчанию да) |
Три последних аргумента (--purl-to-*) читают старые файлы маппингов и оставлены для совместимости. Конфиг имеет приоритет над ними.
Если конфиг найден, команда дописывает в него компоненты, которых там ещё нет, сразу подставляя язык по экосистеме — так новые зависимости не теряются между обновлениями SBOM. Существующие настройки не меняются, записи не удаляются, и файл не создаётся, если его не было.
Язык программирования проставляется в перечень независимо от конфига: он следует из purl.
efs postprocess bom.json result.json \
--app-name "МойПродукт" --app-version "1.0.0" --manufacturer "ООО МояКомпания"Валидация по JSON Schema (CycloneDX 1.6 с ГОСТ-ограничениями) и проверка заполненности перечня.
efs check <file.json> [--check-vcs] [--check-vcs-leaf-only] [--check-source-distribution]
[--format oss|container] [-e N]| Аргумент | Описание |
|---|---|
file.json |
Проверяемый файл |
--check-vcs |
Проверить, что URL типа vcs ведёт на git/svn/hg/fossil-репозиторий |
--check-vcs-leaf-only |
То же, но только для листовых компонентов |
--check-source-distribution |
Проверить, что URL типа source-distribution существует и указывает на архив |
Проверки ссылок ходят в сеть, поэтому команда печатает, сколько ссылок предстоит проверить, и отмечает прогресс на длинных перечнях.
Валидация линейна по числу компонентов: перечень на 1370 компонентов проверяется примерно за секунду, на 100 000 — меньше минуты. Флаг -e 0 выводит все замечания и на больших файлах заметно медленнее из-за самого вывода.
| --format | oss (по умолчанию) или container |
| -e, --errors N | Сколько замечаний печатать (0 — все, по умолчанию 10) |
Схема не требует ни ГОСТ-свойств, ни ссылки на исходный код, поэтому формально корректный файл может оказаться непригодным для сдачи. efs check дополнительно проверяет:
- заглушки
TODOв названии, версии и организации-изготовителе продукта; - компоненты без
GOST:attack_surfaceилиGOST:security_function; - компоненты без
GOST:source_langs; - компоненты, у которых нет ни ссылки на репозиторий, ни
GOST:provided_by— ссылка-заглушкаTODOсчитается отсутствующей; - образы контейнеров без назначения (
description) — при--format container.
Отдельного флага нет, результат виден по коду возврата:
| Код | Значение |
|---|---|
0 |
Файл соответствует схеме и заполнен |
1 |
Ошибки схемы или недоступные ссылки |
2 |
Ошибка вызова: неверный аргумент или отсутствующий файл |
3 |
Схема в порядке, но перечень не заполнен |
В конце печатается сводка по видам замечаний.
Объединение нескольких SBOM в один.
efs merge <in1.json> [in2.json ...] <out.json> --app-name X --app-version Y --manufacturer ZКаждый входной файл становится одним компонентом результата: берётся его metadata.component, а ГОСТ-свойства агрегируются из компонентов файла по правилу yes > indirect > no. Так собирается перечень уровня продукта из перечней отдельных сервисов.
Языки собираются иначе — объединением: компонент-сервис получает все языки своих компонентов, включая вложенные (важно для контейнерных SBOM), по одному свойству GOST:source_langs на язык. Если у metadata.component исходного файла язык уже указан, он сохраняется как есть.
Если все входные файлы — сырые отчёты trivy, объединение идёт иначе: компоненты, зависимости и уязвимости сливаются в один SBOM без предварительной обработки.
Режим определяется по metadata.tools: запись trivy при отсутствии отметки efs. efs postprocess записывает туда себя, поэтому обработанный файл — уже перечень, и он сливается обычным способом: один компонент продукта на файл.
trivy fs --format cyclonedx --output frontend.json ./frontend
trivy fs --format cyclonedx --output backend.json ./backend
efs merge frontend.json backend.json merged.json \
--app-name "МойПродукт" --app-version "1.0.0" --manufacturer "ООО МояКомпания"| Операция | Поведение |
|---|---|
| Компоненты-манифесты | Удаляются (package-lock.json, uv.lock — trivy добавляет их как application без purl) |
| Дедупликация | По purl; разные версии одного пакета остаются отдельными компонентами |
| Свойства дубликатов | Объединяются, свойства aquasecurity:trivy:* сохраняются как есть |
| Уязвимости | Дедуплицируются по идентификатору CVE, списки affects объединяются |
| Зависимости | Ссылки на схлопнутые дубликаты пересопоставляются, записи с одинаковым ref объединяются |
| Висячие ссылки | Отбрасываются — ссылки на удалённые манифесты и корни входных файлов в результат не попадают |
Смешивать сырые отчёты trivy с обычными SBOM в одном вызове нельзя. Результат объединения trivy-отчётов — сырой SBOM: для перечня пропустите его через efs postprocess.
Обогащение SBOM: поиск ссылок на репозитории, добавление ГОСТ-свойств, перенос метаинформации из предыдущей версии перечня.
efs update <input.json> <output.json> [--ref] [--props] [--gost] [--fix-all]
[--app-name X] [--app-version Y] [--manufacturer Z]
[--purl-to-vcs PATH] [--purl-to-gost PATH] [--update OLD]| Аргумент | Описание |
|---|---|
--ref |
Заполнить externalReferences на основе purl |
--props |
Добавить GOST:attack_surface и GOST:security_function |
--gost |
Проставить ГОСТ-свойства из файла маппинга |
--fix-all |
Применить всё сразу, пустые поля заполнить значением TODO |
--props, --gost и --fix-all попутно проставляют GOST:source_langs по типу purl, если язык ещё не указан, — чтобы результат проходил efs check.
| --update OLD | Перенести метаинформацию из перечня предыдущей версии |
Для новых проектов предпочтительнее конфиг: efs config init плюс efs config find-vcs делают то же самое, но результат сохраняется между обновлениями SBOM. Команда update полезна, когда конфига нет или нужно перенести данные из старого перечня.
Выгрузка перечня в документ.
efs export csv <input.json> <output.csv>
efs export odt <input.json> <output.odt> [--format oss|container] [-t]| Аргумент | Описание |
|---|---|
--format |
oss (по умолчанию) или container — форма для перечня образов контейнеров (только ODT) |
-t, --pa-fb-ontop |
Поместить записи «ПА» и «ФБ» в начало таблицы (только ODT) |
Если у компонента несколько свойств GOST:source_langs, в документ попадают все языки через запятую.
Графа «Адрес веб-ресурса, на котором расположен исходный код компонента» заполняется ссылкой на репозиторий или дистрибутив исходного кода. Если ссылки нет, но указан GOST:provided_by, в графу попадает название сертифицированного СЗИ — пустой она не остаётся.
Для --format container графа «Назначение» берётся из поля description образа; efs postprocess сохраняет его для компонентов типа container.
Интерактивный мастер: выбор сканера, генерация SBOM, создание конфига, поиск ссылок на репозитории, постобработка.
efs initШесть шагов: выбор сканера → генерация SBOM → создание конфига → поиск ссылок → постобработка → проверка готовности. Результат постобработки по умолчанию пишется в отдельный файл (bom.result.json), исходный SBOM не перезаписывается.
Подходит для первого запуска в новом проекте. Всё, что делает мастер, доступно и отдельными командами.