Jak wyświetlić historię instalacji apt-get?


18

Jak mogę wyświetlić historię apt-get installpoleceń, które ręcznie wykonałem?

Wydaje mi się, że wszystkie dostępne metody pokazują wszystko, co zostało zainstalowane od samego początku instalacji Ubuntu.

Jak mogę wyświetlić historię od apt-get installczasu zakończenia procesu instalacji systemu?


No tak. Czego jeszcze możesz się spodziewać? Czy chcesz pokazać tylko te, które uruchomiłeś z terminala, a nie te, które były obsługiwane przez GUI lub coś takiego? Proszę edytować swoje pytanie i wyjaśnienia.
terdon

@terdon Okay dokonał nowej edycji
TellMeWhy

1
Istnieje dzienniki dpkgw /var/log/dpkg.log*.
Velkan

1
@ParanoidPanda To się nie udaje na różne sposoby. Obcięcia historii, rzeczy działają w innych powłokach, rzeczy są usuwane z historii lub nigdy nie są tam umieszczane, rzeczy instalowane ze skryptów, rzeczy uruchamiane przez innych użytkowników itp.
Squidly

1
@MrBones: Wiem i wyraziłem to w mojej odpowiedzi (i w komentarzach poniżej). Jednak OP poprosił o sposób wyświetlenia wszystkich instancji, gdy ręcznie wykonali apt-get installpolecenie instalacji pakietu, a ja dostarczyłem rozwiązanie, które daje tę informację, chyba że plik historii został zmieniony w określony sposób (np .: wpisy mają został usunięty).

Odpowiedzi:


20

Myślę, że odpowiedź podane tutaj przez Kos jest najlepszym sposobem widziałem do tej pory. Chociaż, jak używa Software Center apt, wszystko, co zainstalowałoby, również byłoby wymienione.

Polecenie to:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install (?!.*--reinstall)\K.*'

Przetestuję to, kiedy wrócę do domu i zaakceptuję, jeśli
zadziała

To nie jest! sprawdź aktualizację: askubuntu.com/a/680405/320386
Kos

Użyj tego, jest bardziej bezpieczniejsze dla tego zadania: zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?=.* install ) \K.*' | sed '1,4d': grep -Po '^Commandline:(?=.* install ) \K.*'filtruje tylko apt-getpolecenia zawierające installz przednią i tylną przestrzeń, sed '1,4d' może być uzależnione od konkretnej instalacji; w moim 1,4usuwa dokładnie liczbę wpisów pochodzących z Ubiquity, które chcesz usunąć. Daj mi znać, jeśli liczba jest taka sama w twojej instalacji, w ten sposób przynajmniej będziemy mieli linię bazową: |
Kos

@kos Dostaję dodatkowe wiersze, takie jak apt-get -o APT::Status-Fd=4 -o APT::Keep-Fds::=5 -o APT::Keep-Fds::=6 -q -y --no-remove install linux-genericnowe polecenie. Czy są to linie wszechobecności?
Arronical

Nie, wyglądają jakby pochodziły z Software Updater; nie ma sposobu na odróżnienie od poleceń uruchamianych od użytkownika i poleceń uruchamianych przez jakiś apt-getinterfejs użytkownika, oprócz Ubiquity, które działa tylko raz (na przykład aptdaemonwpisy będą również wyświetlane przez to polecenie). Najlepszym rozwiązaniem jest jednak użycie tego polecenia, które przynajmniej wyklucza wpisy dotyczące wszechobecności.
Kos

9

Wystarczy wpisać następujące polecenie w terminalu, aby wyświetlić wszystkie dzienniki instalacji.

grep " install " /var/log/dpkg.log

3

Aby uprościć odpowiedź @Arronical, fajną sztuczką, której nauczyłem się ostatnio, jest możliwość przechwytywania zcat -qfzarówno plików txt, jak i txt.

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install (?!.*--reinstall)\K.*'

staje się

zcat -qf /var/log/apt/history.log* | grep -Po '^Commandline: apt-get install (?!.*--reinstall)\K.*'

Od man Zcat:

   -q --quiet
          Suppress all warnings.
   -f --force
          Force  compression  or  decompression  even if the file has multiple links or the corre‐
          sponding file already exists, or if the compressed data is read from  or  written  to  a
          terminal.  If  the  input  data is not in a format recognized by gzip, and if the option
          --stdout is also given, copy the input data without change to the standard  output:  let
          zcat  behave  as  cat.  If -f is not given, and when not running in the background, gzip
          prompts to verify whether an existing file should be overwritten.

2

Oto skrypt, który drukuje tylko aktualnie zainstalowane pakiety najwyższego poziomu , gdzie „pakiety najwyższego poziomu” są zdefiniowane jako pakiety atp, od których nie zależą żadne inne pakiety atp. Jeśli takie programy najwyższego poziomu zostały zainstalowane przez atp lub menedżera pakietów, takiego jak synaptic, to zostały one ręcznie wybrane przez użytkownika.

#!/bin/sh
NumDaysAgo=18
find /var/lib/dpkg/info -name "*.list" -mtime -$NumDaysAgo \
    -exec stat -c $'%y\t%n' {} \; | \
sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list,,' | \
sort -r | \
while read Date Time Xxx Pkg
do 
    lncnt=$(apt-cache --installed rdepends $Pkg | wc -l)
    if [ $lncnt -eq "2" ]
        then echo "$Date $Time $Pkg"
    fi
done
echo "JOB COMPLETED: $BASH_SOURCE"

Pakiety są drukowane w odwrotnej kolejności, przy założeniu, że użytkownik będzie chciał szybciej uzyskać nowsze informacje, a ponieważ program działa wolno.

Przebieg programu:

  • Program najpierw gromadzi na liście wszystkie zainstalowane pakiety, czytając nazwy plików pod /var/lib/dpkg/info/. Czasy modyfikacji pliku to czasy instalacji.
  • Ta lista jest sortowana w odwrotnej kolejności.
  • Dla każdego zainstalowanego pakietu $Pkgwywoływane jest apt-cache rdepends $Pkg żądanie odwrotnych zależności od $Pkg. Jeśli nie ma żadnych zależności, oznacza to, że jest to pakiet najwyższego poziomu i drukowane są informacje o paczce: data i godzina nazwa_pakietu

Uwagi:

  • Skrypt zależy od formatu wyjściowego, apt-cache rdepends $Pkgktóry był przeznaczony dla ludzkich oczu i może ulec zmianie w przyszłych wersjach apt.
  • Kod nazw plików gromadzących części w / var / lib / dpkg / info / pochodzi z tego postu unix.stackexchange . Jak wskazał ten plakat „mikel” ,dpgk logi historii nie są wiarygodne, ponieważ zostaną osiągnięte po osiągnięciu określonego poziomu.
  • Strona podręcznika użytkownika dla apt-chache
  • Wywołanie apt-cache rdepends ...jest prawdopodobnie bardzo wolne, ponieważ każde połączenie jest obliczane przez iterację wszystkich zależności. Dlatego powyższy skrypt rozpoczyna się od najnowszych instalacji, aby zaoferować użytkownikowi jak najwięcej natychmiastowych korzyści.
  • --installedFlag poapt-cache kontroli, że pakiety dpkg-instalowane są również apt-zainstalowany. Gdyby użytkownik lub inne oprogramowanie instalacyjne ominęło apt i bezpośrednio użyło dpkg, byłoby to możliwe. TEN PRZYPADEK NIE BYŁ TESTOWANY, ale myślę, że coś zauważalnego wydrukowano by na wyjściu standardowym lub na błędzie
  • Dane wyjściowe nie obejmują ręcznie wybranych pakietów, na których później polegał wyższy pakiet. Dane wyjściowe mogą również zawierać pakiety, które zostały zainstalowane przez apt przez inne oprogramowanie instalacyjne innych firm, a zatem nie są tak naprawdę instalowane ręcznie. Jeśli jednak celem danych wyjściowych jest podstawa do przywrócenia systemu Linux z /homekatalogu kopii zapasowej, który zawierał wspomniane oprogramowanie innych firm, to dane wyjściowe byłyby odpowiednie.
  • Niektóre nazwy pakietów zawierają numery wersji, a niektóre nie. Wspomniany tylko po to, by uświadomić ten fakt.

1

Jeśli chcesz zobaczyć wszystkie rzeczy, które zainstalowałeś, uruchamiając:

sudo apt-get install [package]

I nie pomieszałeś z historią bash, ani nie chcesz przeglądać historii tego rodzaju instalacji dla innego użytkownika (lub wszystkich użytkowników), możesz po prostu uruchomić:

history | grep "apt-get install"

I to powinno zapewnić ci najważniejsze wyniki.


1
Czy dzięki temu zdobędę całą historię?
TellMeWhy

@DevRobot: Jeśli ręcznie nie zmodyfikowałeś wpisów z apt-get installnimi w .bash_historypliku lub nie usunąłeś tego pliku, polecenie wyświetli wszystkie instancje po wykonaniu polecenia z ciągiem apt-get installna nim na koncie użytkownika (nawet jeśli uruchom komendę jako root, a zatem nie dokładnie jako konto użytkownika - to komenda uruchamia się z sudo).

2
Może to mieć problem, jeśli wpiszesz więcej niż 200 poleceń
Arronical

2
@ Podczas zgłaszania roszczeń należy się spodziewać dowodu elektronicznego ;-)
Rinzwind

1
Ja sam zakładam, że 500 to domyślna wartość ( gnu.org/software/bash/manual/html_node/… ).
Rinzwind

1

Jeśli chcesz historię apt-get installpoleceń, użyj następującego polecenia:

grep "apt-get install" .bash_history

Wynik:

ravan@ravan:~$ grep "apt-get install" .bash_history

sudo apt-get install --no-install-recommends ubuntu-mate-core ubuntu-mate-desktop
sudo apt-get install xfce4
sudo apt-get install xfce4.12
sudo apt-get install pgadmin
sudo apt-get install touchegg
sudo apt-get install aptitude
sudo apt-get install aptitude
sudo gedit .bash_history | grep "apt-get install" 
sudo apt-get installvim
grep "apt-get install" .bash_history
cat .bash_history | grep "apt-get install" 

Aby uzyskać więcej informacji, patrz Informacje dodatkowe .

Jest również bardziej szczegółowe informacje dotyczące instalacji w /var/log/apt/W history.logi history.log.X.gzplików oraz term.logi term.log.X.gzplików

Jeśli chcesz historię tylko apt-getzawartych poleceń, to

history | grep apt-get


apt-mark showmanualpokazuje wszystkie pakiety zainstalowane podczas instalacji systemu operacyjnego, a nie tylko te faktycznie zainstalowane ręcznie. To dziwny sposób, żeby się zachowywał!
Arroniczny

1
To niekoniecznie podaje konkretne szczegóły dotyczące historii. To, na co ludzie muszą patrzeć, to /var/log/apt/history.logi podobne pliki. Otrzymasz tylko listę ręcznie wybranych i automatycznie wybranych pakietów. Z tej odpowiedzi nie podajesz żadnej chronologicznej historii tego, co zostało zainstalowane, co zostało usunięte, co zostało zaktualizowane itp.
Thomas Ward

@Arronical - Gdzie jest strona man apt -mark showmanual? Nie widzę tego na stronie podręcznika systemu Ubuntu 16.04 LTS dla apt: < manpages.ubuntu.com/manpages/xenial/en/man8/apt.8.html >.
Craig Hicks


0

Aby zobaczyć, co zainstalowałeś i usunąłeś, ponownie zainstalowałeś itp. Więcej informacji o podróży instalacji apt-get.

Odpowiedź można zmienić na alias:

alias apted='zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | fgrep Commandline: | cut -d " " -f 2- | grep -P "^|install"'

0

Zauważ, że niektóre argumenty można ustawić przed instalacyjnym, tak jak robi to skrypt virtualmin podczas instalacji: apt-get -y install nazwa_pakietu.

Więc jeśli chcesz przechwytywać wszystkie polecenia instalacyjne, musisz zmienić zapytanie regularne.

zcat -qf /var/log/apt/history.log* | grep -Po '^Commandline: apt-get.*install (?!.*--reinstall)\K.*'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.