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

7

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

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

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

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

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

    
задан drgrog 12.05.2014 в 08:08
источник

3 ответа

7

Все Ubuntu ISO ([UKLX] buntu / Ubuntu-gnome) содержат файл .manifest , который содержит список всех предварительно установленных пакетов в ISO. Вы можете найти эти файлы манифеста в одном и том же каталоге загрузки, как эти ISO, на любых зеркалах ISO Ubuntu. Возьмем список доступных выпусков Ubuntu в качестве примера; если у вас есть Trusty 64-бит, например, ссылка манифеста будет Ссылка .

Итак, как только у вас есть этот файл, просто сравните список пакетов в нем со списком всех установленных пакетов в вашем 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 opt подавляет строки, которые имеют оба файла, и -2 подавляет строки, которые имеет только второй файл (файл манифеста). Таким образом, в конечном итоге ваш вывод содержит только строки, которые только один файл имеет, и который дает вам пакеты, которые вы установили вручную с момента установки ОС.

Итак, у вас есть это.

Edit

Если вы также хотели бы увидеть версию пакета рядом с именем пакета в выходном файле, как указал 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 работа

    
ответ дан Flint 12.05.2014 в 10:17
3

Метод initial-status.gz и dpkg-query из Ссылка дает самый точный и сжатый список для моих нужд.

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> и от Ссылка включает в себя множество зависимостей и других пакетов, которые могут быть помечены как« обязательные »и установлены автоматически. Например, в нем перечислены libvlc5 и vlc-data , тогда как вышеописанный метод перечисляет только vlc .

Метод history.log из Ссылка не будет перечислять все пакеты, если журналы не вернитесь до установки релиза. Он также содержит множество команд upgrade , которые необходимо отфильтровать.

Метод dpkg --get-selection , который является принятым ответом из аналогичный вопрос, перечисляет все пакеты и зависимости, в том числе установленные с выпуском. Он не перечисляет только те, которые установлены явно.

    
ответ дан drgrog 12.05.2014 в 15:55
0

Большое спасибо и поздравляем тех, кто придумал эту жемчужину скрипта !!!
Я хотел добавить свои 2 ¢, и я применил дату установки, которую я вывел из $ 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}?).*//') $n
done < /tmp/packages | sort
    
ответ дан Papou 25.05.2018 в 19:00