Найти пакеты, установленные из определенного хранилища с способностью
Я ищу что-то аналоговое по этому вопросу: Zypper: Как отобразить все пакеты из определенного репозитория?
Поскольку я на Ubuntu, мне нужно решение на основе aptitude: как я могу получить список установленных пакетов из определенного репозитория?
Используя aptitude, чтобы искать установленные пакеты за пределами стабильной ветки, вы можете использовать:
aptitude search "?narrow(?installed,?not(?archive(stable)))"
Чтобы увидеть версии, а также имена пакетов (а не описания), вы можете использовать команду с опцией формата ( -F
для краткости) следующим образом.
aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))"
Для получения дополнительных форматов ознакомьтесь с man-страницей (здесь есть документация с опциями avail ).
Это работает, например, в Debian, если вы устанавливали пакеты за пределами Squeeze (путем запуска, например, apt-get install -t sid package-name
.
Вы можете посмотреть, где установлен установленный пакет из apt-cache policy
, использование выглядит следующим образом:
apt-cache policy <package-name>
Например, мой пакет python-numpy отображает следующий результат:
$ LANG=C apt-cache policy python-numpy python-numpy: Installed: 1:1.6.2-1 Candidate: 1:1.6.2-1.2 Version table: 1:1.7.0-1 0 1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages 1:1.6.2-1.2 0 500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages *** 1:1.6.2-1 0 100 /var/lib/dpkg/status 1:1.4.1-5 0 990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages 990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages
Это означает, что я являюсь одной версией текущей ветки sid / main, поэтому у меня установлена старая версия sid. Я вижу, что у меня нет стабильной, потому что это еще 1.4.1-5
, и я сейчас на 1.6.2-1
.
Во время отправки этот пакет уже был обновлен:)
После прочтения информационной страницы aptitude и дюжины попыток я, наконец, получил следующее:
aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))'
или эквивалент) :
aptitude search '~S ~i (!~Atesting ~Aunstable)'
Он будет искать пакеты, установленные из нестабильных архивов любого репозитория. Вы должны отфильтровать пакеты из архива по умолчанию (тестирование в приведенном выше примере).
Если вы хотите отфильтровать пакеты, установленные с сайта http://www.debian-multimedia.org/unstable:
aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages"))
Изменить: «Архив», «происхождение» и т. Д. Вычитаются из файла выпуска репозитория. К сожалению, не все инструменты могут смотреть на все эти строки, и для них используется различный синтаксис. Вы можете найти эти файлы как /var/lib/apt/lists/*Release
. Или просто введите apt-cache policy
для получения обзора. Apt-cache изменил свой выходной формат: более поздние версии используют стиль apt_preferences.
-
Suite:
илиArchive:
(старое имя!)- Aptitude search
?archive(___)
или~A___
- Формат aptitude:
%t
- Apt_preferences:
release a=___
- Примеры Ubuntu:
natty-backports
,trusty-security
,stable
- Aptitude search
-
Origin:
- Aptitude search
?origin(___)
или~O___
- Формат aptitude: n / a
- Apt_preferences:
release o=___
- Примеры Ubuntu:
Canonical
,Google, Inc.
,LP-PPA-dockbar-main
,Ubuntu
- Aptitude search
- Все остальные линии
- Aptitude: n / a
Изучите тег происхождения (например, o = Debian ) для каждого из ваших текущих хранилищ:
apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq
Затем найдите пакеты из (или не из) определенного источника:
aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"
Это не подходит для аудита безопасности, поскольку он полагается на каждый репозиторий для предоставления собственной информации о происхождении, но может оказаться полезным для устранения неполадок происхождения пакетов, которые присутствуют в нескольких хранилищах.
Для полноты: в системах Ubuntu вы также можете использовать Synaptic для этой задачи. В левом столбце вы можете фильтровать пакеты по их происхождению.
Я нашел это:
aptitude search "?origin (<repository>) ?installed"
Вы также можете найти список поисковых запросов, поддерживаемых здесь «aptitude search».
Сначала найдите подходящий файл (ы) для интересующего репозитория в / var / lib / apt / lists. Это должно быть возможно сделать программно, но мне не нужно это делать.
Используя Google Chrome в качестве примера, попробуйте следующее:
SEARCH_PATTERN=dl.google.com_linux_chrome # adjust to suit your needs for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' ) do if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null then echo ${PKG} fi done
И я получаю вывод:
google-chrome-stable
Dpkg -s возвращает 0, если пакет установлен и отличен от нуля в противном случае. В будущих справочных целях вывод
grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages
был
Package: google-chrome-beta Package: google-chrome-stable Package: google-chrome-unstable