Пакеты списка в способной основанной системе датой установки

Я думаю, что предвзятость прибывает не из формата пакета, а из несоответствий, которые раньше существовали в репозиториях Redhat.

Назад, когда Redhat был распределением (прежде чем дни RHEL, Fedora и Ядра Fedora), люди будут иногда оказываться в "Аду об/мин" или "Аду зависимости". Это произошло, когда репозиторий закончится с пакетом, который имел зависимости (несколько слоев глубоко, обычно), которые были взаимоисключающими. Или это возникло бы, когда два различных пакета имели две взаимоисключающих зависимости. Это было проблемой с состоянием репозитория, не с форматом пакета. "Ад об/мин" оставил отвращение к системам об/мин среди некоторого населения пользователей Linux, которые стали записанными проблемой.

105
04.06.2017, 16:19
11 ответов

ОСНОВАННЫЕ НА ОБ/МИН дистрибутивы как Red Hat легки:

rpm -qa --last

На Debian и других находящихся в dpkg дистрибутивах, Ваша определенная проблема легка также:

grep install /var/log/dpkg.log

Если файл журнала не был повернут, в этом случае необходимо попробовать:

grep install /var/log/dpkg.log /var/log/dpkg.log.1

В целом, dpkg и apt кажется, не отслеживаю дату установки, идущую отсутствием никакого подобного поля в dpkg-query страница справочника.

И в конечном счете старый /var/log/dpkg.log.* файлы будут удалены вращением журнала, так, чтобы путь, как гарантировали, не будет давать Вам всю историю Вашей системы.

Одно предложение, которое появляется несколько раз (например, этот поток) должно посмотреть на /var/lib/dpkg/info каталог. Файлы там предполагают, что Вы могли бы попробовать что-то как:

ls -t /var/lib/dpkg/info/*.list | sed -e 's/\.list$//' | head -n 50

Для ответа на вопрос о выборах вот, первичная обработка.

список сборки пакетов датами

$ find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' | \
    sort > ~/dpkglist.dates

список сборки установленных пакетов

$ dpkg --get-selections | sed -ne '/\tinstall$/{s/[[:space:]].*//;p}' | \
    sort > ~/dpkglist.selections

присоединитесь к 2 спискам

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.dates \
    > ~/dpkglist.selectiondates

По некоторым причинам это не печатает очень много различий для меня, таким образом, могла бы быть ошибка или недопустимое предположение о какой --get-selections средства.

Можно, очевидно, ограничить пакеты любой при помощи find . -mtime -<days> или head -n <lines>, и измените выходной формат как Вам угодно, например.

$ find /var/lib/dpkg/info -name "*.list" -mtime -4 | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list$,,' | \
    sort > ~/dpkglist.recent

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.recent \
    > ~/dpkglist.recentselections

перечислять только выборы, которые были установлены (измененный?) за прошедшие 4 дня.

Вы могли, вероятно, также удалить sort команды после проверки порядка сортировки, используемого dpkg --get-selections и сделайте find более эффективная команда.

68
27.01.2020, 19:29
  • 1
    мне обычно нравится apt-get больше, чем rpm, но теперь debian добирается-1 для того, чтобы не сохранять дату установки в базе данных. Прием debian включает все установленные пакеты, не только выбранные пакеты, но и это - хорошее начало. –  Elazar Leibovich 04.05.2011, 09:53
  • 2
    Для Debian Вы добираетесь, меньше хлама (удаляет half-installed записи), если Вы делаете: grep install\ /var/log/dpkg.log –  Pierz 22.11.2016, 18:13
  • 3
    @Mikel - Большой ответ. Я подробно остановился, 'собирают/var/lib/dpkg/info / *.list информация о файле' и добавленный код для отфильтровывания всех кроме "высокоуровневых пакетов" (пакеты ATP, от которых никакие другие пакеты ATP не зависят). Это <askubuntu.com/a/948532/723997>, сообщение отвечает на вопрос, "Как я могу просмотреть историю Кв. - добирается, установка управляет, чтобы я вручную выполнился?". метка набора –  Craig Hicks 22.08.2017, 08:26
  • 4
    Debian/Ubuntu: grep " install " /var/log/dpkg.log списки только строки “установки” вместо того, чтобы показать “состояния” также. –  dessert 20.12.2017, 21:54

Mikel показал, как сделать это на dpkg уровне. В частности, /var/lib/dpkg/info/$packagename.list создается, когда пакет установлен (и не изменен впоследствии).

При использовании инструментов APT (который Вы, по-видимому, сделали, так как Вы обеспокоены автоматически по сравнению с вручную установленными пакетами), существует история в /var/log/apt/history.log. Пока это не вращалось далеко, это отслеживает все установки APT, обновления и удаления, с аннотацией для пакетов, отмеченных, как автоматически установлено. Это - довольно недавняя функция, представленная в APT 0.7.26, таким образом, в Debian это появилось в сжатии. В Ubuntu, 10.04 имеет history.log но автоматически установленная аннотация не присутствует до 10.10.

20
27.01.2020, 19:29
  • 1
    Поскольку Mikel указал: "И в конечном счете старый/var/log/dpkg.log.* файлы будут удалены вращением журнала, так, чтобы путь, как гарантировали, не будет давать Вам всю историю Вашей системы".. Посмотрите этот <askubuntu.com/a/948532/723997> ответ для того, как обнаружить текущие высокоуровневые пакеты (значение тех, от которых никакой другой пакет не зависит), –  Craig Hicks 22.08.2017, 08:38

/var/log/apt/history.log файл имеет неловкий формат, по моему скромному мнению.

Дата начала: {дата} {время} Командная строка: {команда} {опции...} Установка: {пакет (версия)}..., {пакет (версия)}... Дата окончания: {дата} {время}

Я предпочел бы больше форматированной записи файла журнала

{дата} {время} {вкладка} {пакет} {вкладка} {версия} {вкладка} {команда} {опции }\\n

или некоторый XML, показывающий не только {пакет}, но и любой {зависимости}.

Как в настоящее время реализовано, можно обнаружить информацию, которую Вы ищете, но она требует, чтобы некоторая судебная обработка извлекла детали.

4
27.01.2020, 19:29

Грубо, но работы:

for fillo in `ls -tr /var/lib/dpkg/info/*.list` ; 
    do basename ${fillo} | sed 's/.list$//g' ; 
done > forens.txt

ls -ltr /var/lib/dpkg/info/*.list > forentime.txt

for lint in `cat forens.txt` ; do 
    echo -n "[ ${lint} Installed ] : " ; 
    echo -n "`grep /${lint}.list forentime.txt | awk '{ print $6, $7, $8 }'` : " ; 
    ( ( grep -A3 " ${lint}$" /var/lib/apt/extended_states | \
        grep '^Auto' > /dev/null ) && echo "Auto" ) || echo "Manual" ; 
done > pkgdatetime.txt
6
27.01.2020, 19:29
  • 1
    , шипение для парсинга вывода от ls. См. mywiki.wooledge.org/ParsingLs для примечаний по тому, почему это опасно / по сути ошибочный - более безопасная опция состоит в том, чтобы использовать также find -printf или stat --format генерировать поток, который может быть однозначно проанализирован. –  Charles Duffy 10.04.2015, 20:17
  • 2
    @CharlesDuffy Хорошая ссылка, но в целях простоты, с помощью ls -al --time-style=long-iso должно быть полезным. Кроме того, это, вероятно, неслыханно, с которым кто-то назвал бы пакет APT \n\t\r\v на его имя. –  not2qubit 26.04.2018, 14:12

У меня это работает в системе Debian, я предполагаю, что формат файла изменился с 2011 года. Эта система довольно свежая, поэтому я не ожидал, что этот будет работать в более старой системе, хотя это может потребоваться просто разархивировать журналы и использовать глобус для ссылки на все из них.

grep 'install ' /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d' '

Первые два поля в каждой строке файла /var/log/dpkg.log - это дата и время. Обратите внимание на конечный пробел с install в части grep, потому что обновления могут запускать установку, но если я правильно понял, вы хотели знать, что было установлено пользователями.

3
27.01.2020, 19:29

Отмечаю это, потому что вы упомянули, что приветствуются ответы других дистрибутивов. rpm имеет большой набор тегов формата вывода, одним из которых является INSTALLTIME. (Используя wget в качестве примера)

rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1
wget,1454014156

Он может быть отформатирован несколькими способами. Я использую его так:

rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1
wget,Thu 28 Jan 2016 03:49:16 PM EST

Эти две страницы содержат тонну отличной информации о решении проблем с метаданными RPM:

http://www.rpm.org/max-rpm/s1-rpm-query-parts.html

http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html

Сортировка этой информации даст вам рабочее решение для вашей проблемы.

1
27.01.2020, 19:29

GNU / Linux Debian не имеет встроенных инструментов для решения этой проблемы, но вся информация о программах, установленных стандартным способом , сохраняется в файлах с имя-программы.list в расположение / var / lib / dpkg / info / . Но информации об установленных вручную программах там нет.


Длинное однострочное решение :

for file_list in `ls -rt /var/lib/dpkg/info/*.list`; do \
    stat_result=$(stat --format=%y "$file_list"); \
    printf "%-50s %s\n" $(basename $file_list .list) "$stat_result"; \
done

Объяснение :

  1. ls -rt выводит файлы, отсортированные по дате изменения в обратном порядке, т.е. с самыми новыми файлами в конце списка.
  2. stat печатает дату файла в удобочитаемой форме.
  3. printf отображает имя пакета и дату его последней модификации.
  4. Цикл for в целом печатает имена пакетов и даты от самого старого до самого нового.

Пример вывода (усеченный):

.........................................
gnome-system-log                            2016-09-17 16:31:58.000000000 +0300
libyelp0                                    2016-09-17 16:32:00.000000000 +0300
gnome-system-monitor                        2016-09-17 16:32:00.000000000 +0300
yelp-xsl                                    2016-09-17 16:32:01.000000000 +0300
yelp                                        2016-09-17 16:32:03.000000000 +0300
gnome-user-guide                            2016-09-17 16:32:18.000000000 +0300
libapache2-mod-dnssd                        2016-09-17 16:32:19.000000000 +0300
.........................................
linux-compiler-gcc-4.8-x86                  2017-02-26 20:11:02.800756429 +0200
linux-headers-3.16.0-4-amd64                2017-02-26 20:11:10.463446327 +0200
linux-headers-3.16.0-4-common               2017-02-26 20:11:17.414555037 +0200
linux-libc-dev:amd64                        2017-02-26 20:11:21.126184016 +0200
openssl                                     2017-02-26 20:11:22.094098618 +0200
unzip                                       2017-02-26 20:11:23.118013331 +0200
wireless-regdb                              2017-02-26 20:11:23.929949143 +0200
nodejs                                      2017-02-26 20:11:33.321424052 +0200
nasm                                        2017-02-28 16:41:17.013509727 +0200
librecode0:amd64                            2017-03-01 10:38:49.817962640 +0200
libuchardet0                                2017-03-01 10:41:10.860098788 +0200
tree                                        2017-03-04 14:32:12.251787763 +0200
libtar0                                     2017-03-07 09:51:46.609746789 +0200
libtar-dev                                  2017-03-07 09:51:47.129753987 +0200

Основной недостаток этого решения - то, что оно плохо протестировано в производственной среде.

3
20.08.2021, 13:36

Вот тот -лайнер, который всем нужен и нужен:

for x in $(ls -1t /var/log/dpkg.log*); do zcat -f $x |tac |grep -e " install " -e " upgrade "; done |awk -F ":a" '{print $1 " :a" $2}' |column -t

В результате будут показаны все (новые)установленные и обновленные пакеты в хронологическом порядке.

Объяснение строки:

  • ls -1t-получить все dpkg.log*имена файлов в хронологическом порядке
  • zcat -f-ЕСЛИ файл имеет тип gzip , распаковать его, ИНАЧЕ просто передать содержимое.
  • tac-Обратный вывод cat , строки -на строку -, чтобы убедиться, что мы получаем правильный хронологический порядок.
  • grep-Проверяйте только установленные пакеты или обновления .
  • awk -F ':a'-Отделите поле архитектура от имени пакета
  • .
  • column -t-красиво напечатать столбцы, разделенные пробелом

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

Вывод:

2018-03-06  18:09:47  upgrade  libgomp1                     :armhf  6.3.0-18+rpi1                 6.3.0-18+rpi1+deb9u1
2018-03-05  15:56:23  install  mpg123                       :armhf  <none>                        1.23.8-1
2018-03-05  15:56:23  install  libout123-0                  :armhf  <none>                        1.23.8-1
2018-01-22  17:09:45  install  libmailtools-perl            :all    <none>                        2.18-1
2018-01-22  17:09:44  install  libnet-smtp-ssl-perl         :all    <none>                        1.04-1

Недостаток:

  • Как показано выше, он работает только с архитектурой ARM и требует небольшой модификации разделителя полей архитектуры
  • Нужно добавить в скрипт для простого псевдонима
  • Не тестировалось на других *nix-системах
7
20.08.2021, 13:36

Это грубо, но работает так же быстро, как и другие решения. Формат даты — ггггммддччммсс, что означает, что бит или изменение порядка и удаление формата приводит к числу, которое можно сортировать.

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

find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; \
| sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' \
| sort | awk '{print $2$3" "$1}' | sed '0,/RE/s/-//' \
| sed '0,/RE/s/-//' | sed '0,/RE/s/://' | sed '0,/RE/s/://' \
| sed '0,/RE/s/\\.//' | sed 's/:armhf//' | sort | awk '{print $2}'
1
20.08.2021, 13:36

Я достиг этого на Kubuntu с помощью следующих команд:

  1. Список пакетов.
  2. прочитать каждый стандартный ввод.
  3. сохранить полный путь (путь | дата создания )в формате "%n|%y" в переменную.
  4. сохранить имя файла в переменной
  5. если обе предыдущие команды были выполнены успешно, значения будут напечатаны в одной строке.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c '%n|%y' ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done

С уважением,

0
20.08.2021, 13:36

С ротацией лог-файлов в apt вы можете:

zcat -f /var/log/dpkg.log* | grep " install " | less
0
20.08.2021, 13:36

Теги

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