add-apt-repository: команда не найдена — исправление в Ubuntu и Debian

DataMobile
это российское программное обеспечение для терминалов сбора данных
и мобильных устройств. Входит в Единый реестр российских программ

add-apt-repository: команда не найдена — исправление в Ubuntu и Debian — техническая иллюстрация
Задать вопрос
Наши специалисты ответят на любой интересующий вопрос по услуге

Ошибка sudo: add-apt-repository: command not found обычно означает отсутствие пакета software-properties-common. Однако установка утилиты и подключение совместимого репозитория — две разные задачи. Ниже разберём обе: от проверки системы до источников deb822, подписей, выбора версии и возврата изменений.

Настройка APT: дистрибутив, пакет утилиты, совместимость источника, Signed-By и проверка выбранной версии
Порядок проверки и настройки. Команды, ограничения и диагностика приведены в статье.

1. Проверьте дистрибутив и архитектуру

Почему название ошибки не описывает всю причину

Shell ищет исполняемый файл по PATH; sudo может применять другой secure_path; Python-программа затем загружает системные модули; сама add-apt-repository изменяет источники, но пакеты устанавливает APT. Поэтому различайте четыре стадии: команда не найдена, команда не запускается, источник не обновляется, нужный пакет не выбирается. Установка software-properties-common исправляет только первую при исправной пакетной базе.

Команды ниже предназначены для Debian 13/Ubuntu 24.04 с штатным APT. Сначала выясните точный релиз, архитектуру, root/sudo и источник сети. Для минимального Docker-image отсутствие утилиты нормально: дополнительный репозиторий часто задают .sources-файлом в сборке образа, а не интерактивным мастером. Все изменения сначала воспроизводят на тестовой VM того же релиза.

Сначала определите систему, для которой предназначена инструкция. Кодовое имя Ubuntu нельзя подставлять в репозиторий Debian, даже если обе системы используют apt. Производные дистрибутивы могут иметь собственный релиз и отдельную базу пакетов.

cat /etc/os-release
dpkg --print-architecture
command -v apt-get
command -v add-apt-repository

В os-release важны ID, VERSION_ID и VERSION_CODENAME; ID_LIKE показывает родство, но не гарантирует совместимость. В документации поставщика сверяют поддерживаемые релизы и архитектуры. Пакет amd64 не предназначен для arm64; изменение строки sources этого не исправит. Для контейнера проверяют его собственный os-release, а не версию хоста.

На актуальном Debian путь /usr/bin/add-apt-repository принадлежит software-properties-common: это подтверждает официальный поиск содержимого пакетов. Старый совет установить python-software-properties переносить в современные системы не следует.

2. Установите пакет и подтвердите результат

Приведённые команды подходят системе Debian/Ubuntu с настроенными штатными источниками и доступом к ним. sudo требует делегированных административных прав; ошибка отсутствия sudo в минимальном контейнере — отдельный вопрос.

sudo apt-get update
apt-cache policy software-properties-common
sudo apt-get install software-properties-common
command -v add-apt-repository
dpkg-query -W -f='${Package} ${Version} ${Status}\n' software-properties-common
add-apt-repository --help

После apt-get update убедитесь, что нужные индексы обновились без ошибок. Установленная утилита должна отображаться в command -v, а dpkg-query — показывать install ok installed. Название пакета не обязательно совпадает с именем исполняемого файла. Успех последней команды не доказывает успешность всех предыдущих: проверяйте вывод и код завершения каждого шага.

На сервере сначала просмотрите предложенный список новых пакетов и зависимостей. Не добавляйте -y, пока не понимаете изменение. Если задача состоит лишь в настройке штатного источника apt, отдельная утилита может вообще не требоваться.

Проверьте состояние до установки и после неё

apt-cache policy software-properties-common
dpkg-query -W software-properties-common
printf '%s\n' "$PATH"
sudo apt-get -s install software-properties-common

Если Candidate=(none), проблема не в имени утилиты: штатные индексы отсутствуют, источник отключён или серия/архитектура не содержит пакет. В apt-get -s проверьте Inst/Conf/Remv: симуляция должна предлагать ожидаемые зависимости, а не удаление сервисов. Реальная установка выполняется следующими командами раздела только после изучения результата.

Если apt-get update сообщает ошибки, не считать последующий install подтверждением актуального источника: APT мог использовать старые индексы. Сохраните полный вывод конкретного failing URI, не ограничиваясь последней строкой. После установки dpkg -S /usr/bin/add-apt-repository должен показать владельца файла, --help — запущенную программу.

3. Отличите отсутствие команды от ошибки PATH

Если пакет установлен, проверьте наличие файла и его владельца. Это позволяет обнаружить повреждённую установку, другой namespace контейнера или отличающийся путь поиска у sudo.

dpkg -L software-properties-common | grep '/add-apt-repository$'
ls -l /usr/bin/add-apt-repository
dpkg -S /usr/bin/add-apt-repository
sudo /usr/bin/add-apt-repository --help
sudo -l

Если полный путь работает, а короткое имя нет, изучают PATH и sudo secure_path. Не исправляйте это копированием файла в случайный каталог или chmod 777. Если файл отсутствует при корректном статусе пакета, можно переустановить именно software-properties-common после выяснения причины удаления.

Python traceback означает, что программа найдена и запущена; это уже не command not found. Не переназначайте /usr/bin/python3 на самодельный интерпретатор. Системные Python-модули apt и software-properties зависят от поставляемой дистрибутивом среды. Отдельные приложения запускают в venv, не меняя системный Python.

Разберите PATH, отсутствующий файл и Python traceback

command -v add-apt-repository
type -a add-apt-repository
ls -l /usr/bin/add-apt-repository
head -n 1 /usr/bin/add-apt-repository
dpkg --verify software-properties-common

type -a помогает увидеть wrapper/alias перед системным файлом; первая строка показывает интерпретатор. В dpkg --verify отмечается отличие от метаданных пакета, а не автоматически злонамеренность. Если системный файл отсутствует, после выяснения причины используйте sudo apt-get install --reinstall software-properties-common и повторите проверки. Если traceback с python3-apt, проверьте /usr/bin/python3 --version и соответствующий пакет python3-apt. Не выполняйте pip install apt в системный Python как замену библиотеке дистрибутива.

Ошибка permission denied при запуске также не command not found. Проверьте права файла и noexec mount: findmnt -T /usr/bin/add-apt-repository. Перенос программы в /tmp обходит причину и может нарушить policy; восстановите пакет или штатную настройку пути.

4. Почему Ubuntu PPA нельзя считать репозиторием Debian

PPA публикует бинарные пакеты для конкретных серий Ubuntu. Даже одинаковые имена библиотек не гарантируют одинаковые ABI, зависимости и сборочные параметры. Установка утилиты на Debian не превращает Ubuntu PPA в поддерживаемый источник Debian.

Перед подключением выясните: кто сопровождает источник, есть ли серия вашей системы, доступна ли нужная архитектура, какие пакеты он заменяет, как будут поступать обновления безопасности. Для Debian сначала рассматривают штатный архив, backports соответствующего релиза и официальные инструкции самого поставщика.

Справка add-apt-repository для Ubuntu описывает варианты добавления и удаления источников. Подставлять произвольный найденный PPA в серверную систему без анализа зависимости нельзя. Переименование codename в строке источника скрывает проверку совместимости, а не решает её.

Пример безопасного выбора источника

Допустим, задача — новая версия одного приложения. Сначала проверьте штатный Candidate; затем источник backports своего Debian либо официальный репозиторий поставщика; для Ubuntu — PPA с опубликованной сборкой именно noble/вашей серии. Наличие PPA для jammy не означает, что строку можно переименовать в noble. Даже если зависимости установятся, ABI и поведение приложения могут отличаться.

Пример намеренно использует placeholder владельца/архива, потому что доверие к PPA — отдельное решение. После проверки поддержки на Ubuntu, не Debian:

sudo add-apt-repository --no-update ppa:OWNER/ARCHIVE
sudo apt-get update
apt-cache policy TARGET_PACKAGE
apt-get -s install TARGET_PACKAGE

OWNER/ARCHIVE/TARGET_PACKAGE заменяют данными проверенного источника; это не существующий рекомендуемый PPA. --no-update разделяет добавление и обновление, позволяя посмотреть созданный файл. Если поставщик даёт .sources и Signed-By, используйте его процедуру вместо PPA-синтаксиса. Не смешивайте две формы одного архива, иначе получите дубли.

5. Сохраните текущее состояние APT

Перед изменением сделайте снимок конфигурации и установленных пакетов. Каталог backup ограничивается root: конфигурация прокси или закрытого репозитория может содержать чувствительные сведения, поэтому её не прикладывают к публичной заявке целиком.

STAMP=$(date -u +%Y%m%dT%H%M%SZ)
BACKUP=/root/apt-before-$STAMP
sudo install -d -m 700 "$BACKUP"
sudo cp -a /etc/apt "$BACKUP/apt"
dpkg-query -W -f='${binary:Package}\t${Version}\n' | sudo tee "$BACKUP/packages.tsv" >/dev/null
apt-cache policy | sudo tee "$BACKUP/policy.txt" >/dev/null

Запишите имена файлов, которые будете добавлять или менять. Для нового источника предпочтителен отдельный файл с понятным именем. Не заменяйте весь sources.list ради одного пакета: так можно потерять security-обновления, корпоративное зеркало и настройки pinning.

Резервная копия sources не является резервной копией пакетов или данных приложения. Для обновления важного сервиса дополнительно нужен его штатный backup и проверенная процедура восстановления.

Составьте список затрагиваемых файлов

find /etc/apt/sources.list.d -maxdepth 1 -type f -printf '%f\n'
apt-mark showhold
apt-cache policy
sudo dpkg --audit

Holds могут объяснить, почему пакет не обновляется, но снятие всех hold — плохой диагностический шаг. Снимок /etc/apt фиксирует источники, preferences и настройки; список установленных версий нужен для сравнения. Закрытые auth.conf/прокси могут содержать секреты, поэтому этот backup имеет режим root-only.

Для возврата запишите: имя добавленного файла, fingerprint ключа, целевой пакет, предыдущую и новую версии, зависимости и данные сервиса. Если добавленный архив обновит десятки библиотек, простой возврат .sources не восстановит исполняемую среду. Для важного сервиса нужен снимок/backup приложения до install, а не после ошибки.

6. Прочитайте источник deb822

Современный формат .sources содержит отдельные поля вместо длинной строки deb. Пример ниже показывает официальный архив Debian 13 trixie. Это образец чтения формата, а не команда добавить дубликат уже существующего источника. Для другой версии Suite будет другой.

Types: deb
URIs: https://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Для security используют отдельную запись с URI https://security.debian.org/debian-security и Suite trixie-security. Не переносите эти имена в Ubuntu. Поле Components задаёт компоненты архива, Types: deb — бинарные пакеты, Signed-By ограничивает ключи проверки источника.

Документация sources.list объясняет обе формы записи. Чтобы временно выключить отдельную deb822-запись, добавляют Enabled: no, затем обновляют индексы. Не удаляйте официальный архив, пока нет доказанного работающего замещения.

Разберите deb822 построчно

Types выбирает deb для бинарных пакетов и deb-src для исходников. URIs задаёт корень архива, Suites — серии, Components — его компоненты. Architectures ограничивает получение индексов; Signed-By связывает архив с конкретным ключом; Enabled: no выключает stanza. Между отдельными stanza оставляют пустую строку. Расширение файла должно быть .sources, а не произвольное .txt.

Types: deb
URIs: https://packages.vendor.example/apt
Suites: REPLACE_SUPPORTED_SUITE
Components: main
Architectures: amd64
Signed-By: /etc/apt/keyrings/vendor-archive-key.asc
Enabled: no

Это учебный несуществующий источник, по умолчанию выключенный. Не запускайте update с ним как с рабочим URI. Замените адрес и Suite по документам поставщика, затем проверьте отсутствие другого файла с тем же архивом, убедитесь в ключе и только потом включите. Signed-By ограничивает набор доверенных ключей для данного источника; он не запрещает архиву публиковать пакет с именем штатной библиотеки.

7. Подключайте ключ через Signed-By

Штатный Debian keyring устанавливается пакетами дистрибутива. Локальный ключ стороннего архива обычно хранится в /etc/apt/keyrings, а не в общем доверенном наборе. ASCII-armored файл имеет расширение .asc, бинарный экспорт — .gpg.

sudo install -d -m 755 /etc/apt/keyrings
gpg --show-keys --with-fingerprint ./vendor-archive-key.asc
sudo install -m 644 ./vendor-archive-key.asc /etc/apt/keyrings/vendor-archive-key.asc

До install получите публичный ключ по официальному каналу поставщика и сравните полный fingerprint с независимой опубликованной документацией. Команды предполагают уже полученный проверенный файл. В отдельной .sources-записи используют Signed-By: /etc/apt/keyrings/vendor-archive-key.asc и именно поддерживаемые поставщиком URI/Suite.

Согласно apt-secure, проверка подписанного Release и хешей защищает цепочку доставки архива, но не доказывает безвредность его сопровождающего. trusted=yes, отключение проверки подписи и старые рецепты apt-key не нужны для корректного подключения современного источника.

Проверьте полный fingerprint, доступ _apt и формат

gpg --show-keys --with-fingerprint ./vendor-archive-key.asc
sudo -u _apt test -r /etc/apt/keyrings/vendor-archive-key.asc
namei -l /etc/apt/keyrings/vendor-archive-key.asc

Сверяйте полный отпечаток, не короткий key ID. Ключ — публичный, режим 644 обычно достаточен; приватного ключа подписания на клиенте не должно быть. Если поставщик даёт ASCII armor, .asc соответствует содержимому. Для бинарного OpenPGP экспорта используют .gpg; простое переименование расширения не преобразует формат. keyring в .kbx не заменяет экспортированный файл автоматически.

Ротацию выполняют по опубликованной процедуре поставщика: иногда нужен новый ключ и обновлённый Signed-By. Отключение expiry/подписи превращает проверку источника в формальность. Корпоративное HTTPS-зеркало требует доверия к его CA; глобально выключать TLS Verify для APT не нужно.

8. Проверьте, откуда будет установлен пакет

После подключения источника обновите индексы и исследуйте конкретный пакет. В примере nginx используется только как объект чтения policy и моделирования установки; это не рекомендация обновить веб-сервер.

sudo apt-get update
apt-cache policy nginx
apt-cache madison nginx
apt-get -s install nginx

Candidate — предлагаемая версия, Installed — установленная. В таблице policy видны URI и приоритеты доступных версий. В симуляции проверьте удаляемые пакеты, обновления зависимостей и смену происхождения. Не ограничивайтесь строкой «пакет найден».

Pinning требует точных условий origin/release и контроля policy после изменения. Чрезмерный приоритет стороннего источника может заменить больше пакетов, чем планировалось. Для единичного обновления нужен список затрагиваемых пакетов и согласованное окно работ; флаг симуляции не проверяет запуск приложения после реальной установки.

Прочитайте Candidate, priorities и план установки

Installed: 1.0-1
Candidate: 1.1-1
Version table:
   1.1-1 500
      500 https://packages.vendor.example/apt suite/main amd64 Packages
*** 1.0-1 100
      100 /var/lib/dpkg/status

Это пример, не реальные версии nginx. Installed — текущее состояние dpkg, Candidate — выбор APT при данных индексах и policy. Число 500 — pin priority; звёздочки показывают установленную версию. Кандидат может происходить из стороннего архива с тем же именем пакета. Поэтому сравнивайте origin/release и зависимости, а не только большее число версии.

apt-get -s install пакет=версия помогает проверить точный выбор, но версия должна быть доступна в policy. apt-get -s -t trixie-backports install пакет применяют только при подключённом официальном backports собственного релиза. Backports не равно смешению stable/testing. Для постоянного pinning используйте apt_preferences и перепроверьте policy; слишком высокий приоритет способен разрешить неожиданный downgrade.

9. Разберите типовые ошибки обновления

Temporary failure resolving указывает на DNS или путь до резолвера: проверьте getent hosts имени зеркала и сетевой маршрут. HTTP 404 часто означает неправильную серию или закрытый релиз; сначала сверяют URI/Suite. Сообщение о Release file не исправляют отключением apt-secure.

NO_PUBKEY требует проверить, какой источник и какой Signed-By используются. Ключ должен быть читаем пользователем _apt, а каталог — доступен для обхода. EXPKEYSIG может означать ротацию или истечение ключа; обновление берут с официального канала. Ошибка времени действия Release требует также проверки системных часов.

timedatectl status
getent hosts deb.debian.org
systemctl status apt-daily.service apt-daily-upgrade.service --no-pager
sudo dpkg --audit

При блокировке apt выясните, какой процесс выполняет операцию, и дождитесь завершения. Удаление lock-файлов у активного dpkg создаёт риск повреждения состояния. dpkg --configure -a используют после подтверждённого прерывания операции, а не как универсальный первый шаг при любой ошибке сети.

Диагностический маршрут для ошибок update

Сначала DNS имени зеркала, затем TCP/TLS/HTTP, затем корректность Suite/Release, затем подпись и индексы. getent hosts воспроизводит системное разрешение, curl -I конкретного HTTPS URI проверяет другой слой. Время timedatectl важно для TLS и сроков Release. Прокси может менять путь APT: анализируйте только необходимые поля, не публикуя auth.

getent hosts deb.debian.org
curl -I https://deb.debian.org/debian/dists/trixie/InRelease
timedatectl status
sudo fuser /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock
sudo dpkg --audit

404 у dists/серия/InRelease обычно требует сверить серию, а не получить ещё один ключ. NO_PUBKEY означает отсутствие подходящего ключа для указанного Release; conflicting Signed-By — дублирующиеся определения одного источника. Если lock занят, выясните процесс и дождитесь штатного завершения; удаление файла не прекращает транзакцию. После подтверждённого прерывания sudo dpkg --configure -a завершает настройку уже распакованных пакетов; apt-get -f install сначала моделируют, потому что он может предложить удаления.

10. Возврат и критерии завершения

Для нового отдельного источника восстановите только затронутый файл или отключите его через Enabled: no. Затем снова выполните apt-get update и apt-cache policy целевых пакетов. Восстановление конфигурации не понижает уже установленную версию: downgrade рассматривается отдельно с зависимостями и совместимостью данных приложения.

Работа завершена, когда утилита найдена, индексы нужных архивов обновляются с проверкой подписей, Candidate происходит из ожидаемого источника, симуляция не показывает неожиданных удалений, а установленный сервис прошёл собственную проверку. Сохраните имя добавленного источника, fingerprint, изменённые версии и способ возврата. Это превращает разовое исправление команды в управляемую настройку APT.

Отмена источника и отмена обновления — разные процедуры

Для собственного нового .sources добавьте Enabled: no либо верните прежний файл. Обновите индексы, сравните policy целевых пакетов и убедитесь, что исчез сторонний Candidate. Не удаляйте весь sources.list.d. Ключ можно убрать только после проверки, что другие stanza не ссылаются на него.

Уже установленный пакет остаётся новой версии. Для возврата сначала проверьте доступность прежней версии и симуляцию с её зависимостями, затем совместимость конфигурации/данных. Не делайте массовый downgrade всего сервера по одному пакету. Заключительная проверка включает dpkg --audit, отсутствие неожиданных hold/Remv, запуск изменённого сервиса и его функциональный тест. Источник считается готовым только при рабочем подписанном обновлении, понятном происхождении и воспроизводимом возврате.

Заказать услугу
Оформите заявку на сайте, мы свяжемся с вами в ближайшее время и ответим на все интересующие вопросы.