Узнайте, какие пакеты были установлены после установки OS

Как я узнаю, какие пакеты были установлены, так как ОС была установлена? Я не хочу знать все установленные пакеты, только те, которые не были частью начальной установки ОС и были явно установлены впоследствии.

Ради этого вопроса, позволяет, принимают новую установку, поскольку я предполагаю, что обновления дистрибутива усложнили бы ситуацию. Я предпочел бы использовать командную строку, но решение GUI будет в порядке, если команда или сценарий не будут доступны.

У меня был беглый взгляд на страницы справочника dpkg и aptitude, но не видел ничего очевидного. Кроме того, вывод apt-cache show package-name или dpkg -s pkg-name кажется, не дает дат, которые могут быть сравнены с датой установки ОС (который я должен был бы разработать, как добраться также).

Я имею logwatch на сервере, который отправляет ежедневные уведомления о том, что было установлено. Мое предположение - то, что это анализирует dpkg.log. Я не уверен, что этот метод был бы решением, поскольку многие записи установки, возможно, были logrotated, особенно в более старых системах. И идеально это должно работать на любую систему, рабочий стол или сервер.

Также было бы замечательно, если вывод мог бы включать версию пакета, в настоящее время устанавливаемого, но это может спрашивать слишком много, и я могу всегда написать сценарий его позже, после того как у меня есть имена пакета.

7
задан 12 May 2014 в 16:21

3 ответа

начальная-буква-status.gz и dpkg-запрос метод от https://unix.stackexchange.com/a/80520/9132 дает самый точный и краткий список для моих потребностей.

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

, Почему мне нравится он, и не другие:

явное сравнение метод от Flint ответ и от https://unix.stackexchange.com/a/3624/9132 включает много зависимостей и другие пакеты, возможно отмеченные, как 'требуется' и установлено автоматически. Например, это перечисляет libvlc5 и vlc-данные , тогда как метод только выше списков vlc.

history.log метод от https://askubuntu.com/a/250530/16741 не перечислит все пакеты, если журналы не возвратятся до установки выпуска. Это также содержит много из обновление команды, которые должны были бы быть отфильтрованы.

dpkg - получать-выборы метод, который является принятым ответ от подобного вопроса, перечисляет все пакеты и зависимости, включая установленных с выпуском. Это не перечисляет только установленных явно.

3
ответ дан 17 November 2019 в 03:37

Весь ISO Ubuntu ([UKLX] buntu/Ubuntu-gnome) идет .manifest файл, который содержит список всех предварительно установленных пакетов в ISO. Можно найти те файлы манифеста в том же dir загрузки как те ISO на любых зеркалах ISO Ubuntu. Возьмите список доступных релизов Ubuntu как пример; если Вы имеете Trusty 64-разрядный, например, явной ссылкой был бы http://releases.ubuntu.com/trusty/ubuntu-14.04.2-desktop-amd64.manifest.

Таким образом, после того как Вы имеете этот файл, просто сравниваете список пакетов в нем против списка всех установленных пакетов в Вашем использовании Ubuntu comm команда

$ curl -O http://releases.ubuntu.com/trusty/ubuntu-14.04-desktop-amd64.manifest
$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
        <( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort )

Объяснить что comm делает, это берет вход из 2 файлов - сначала каждый предоставляет список всех в настоящее время устанавливаемых пакетов и второго файл манифеста. -3 выберите подавляет строки, которые оба файла имеют и -2 подавляет строки, которые только имеет второй файл (файл манифеста, который является). Таким образом в конце Ваш вывод содержит только строки, что только файл, который каждый имеет и это дает Вам пакеты, которые Вы установили вручную, так как ОС была установлена.

Таким образом, там у Вас есть он.

Править

Если также требуется видеть версию пакета рядом с именем пакета в выводе, как Slyvain Pineau указал, канал comm команда выше к xargs dpkg-query -W -f='${binary:Package} ${Version}\n' таким образом, это становится

$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
           <( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort ) | \
           xargs dpkg-query -W -f='${binary:Package} ${Version}\n

Или альтернативно, с awk полностью, Это также дает тот же результат как команду выше

awk 'FNR==NR {arr[$1];next} !($1 in arr) { print $0 }' ubuntu-14.04-desktop-amd64.manifest <( dpkg-query -W -f='${binary:Package} ${Version}\n' )

См. эту ссылку для объяснения о том, как awk cmd работают

7
ответ дан 23 November 2019 в 06:26

Большое спасибо и поздравления тем, кто придумал тот драгоценный камень сценария!!!
Я хотел добавить свои 2¢, и я прикрепил дату установки, которую я вывожу из $info.
Я не осваивал детали, почему файлы $info обновляются или не и когда, но это работает на практике.
Мой сценарий перечисляет последние обновления не пакеты зависимости, добавленные после установки.
Давая ему периодическую проверку, я видел то, что я вручную зарегистрирую без незамужней мисс.
Таким образом, пакеты пакетов установлены по той же причине. К сожалению, повреждение обновлений тот порядок.
После обновления системы у меня был список моих добавленных пакетов, которые обновление не обновило сопровождаемый теми, которых оно сделало.
Аккуратный!Приятного отдыха.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
0
ответ дан 23 November 2019 в 06:26

Другие вопросы по тегам:

Похожие вопросы: