Domanda Generazione di elenchi di pacchetti installati manualmente e interrogazione di singoli pacchetti


Mi piacerebbe avere una lista di pacchetti installati manualmente da apt o aptitude e essere in grado di scoprire se a foobar il pacchetto è stato installato manualmente o automaticamente. C'è un modo pulito per farlo dalla riga di comando?


146
2017-08-16 17:07


origine


Vedere questa risposta su unix.stackexchange.com per una soluzione che filtra i pacchetti di azioni. - Dirk Bergstrom
Possibile duplicato? - askubuntu.com/questions/365 - jrg♦
possibile duplicato di È possibile dire quali pacchetti ho installato che non si trovano nell'installazione di vanilla? - Jorge Castro
Soluzione davvero buona che esclude i pacchetti installati di default: Ubuntu elenca i pacchetti installati in modo esplicito - pcworld
Attento ai commenti delle risposte qui. Le persone non dicono in che modo vengono mostrati più pacchetti, ma stanno dimenticando che ci sono pacchetti di dipendenze installati da un manuale installato. - Andre Figueiredo


risposte:


Puoi usare uno di questi due one-liner. Entrambi producono esattamente lo stesso risultato sulla mia macchina e sono più precisi di tutte le soluzioni proposte finora (6 luglio 2014) in questa domanda.

utilizzando apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

utilizzando aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Pochissimi pacchi cadono ancora attraverso le fessure, anche se ho il sospetto che questi siamo effettivamente installato dall'utente, subito dopo l'installazione attraverso l'impostazione di localizzazione della lingua o ad es. tramite il programma di installazione del codec Totem. Inoltre, anche le versioni di linux-header sembrano accumularsi, anche se ho solo installato il metapacchetto non specifico della versione. Esempi:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Come funziona:

  1. Ottieni l'elenco dei pacchetti installati manualmente. Per aptitude, l'aggiuntivo sed rimuove gli spazi bianchi rimanenti alla fine della linea.
  2. Ottieni l'elenco dei pacchetti installati subito dopo una nuova installazione.
  3. Confronta i file, emetti solo le righe nel file 1 che non sono presenti nel file 2.

Altre possibilità non funzionano altrettanto bene:

  • Usando il ubuntu-14.04-desktop-amd64.manifest file (Qui per Ubuntu 14.04) anziché /var/log/installer/initial-status.gz. Altri pacchetti vengono mostrati come installati manualmente anche se non lo sono.
  • utilizzando apt-mark showauto invece di /var/log/installer/initial-status.gz. apt-mark per esempio non include il pacchetto xserver-xorg, mentre l'altro file lo fa.

Ho usato vari altri post StackExchange come riferimenti, tuttavia nessuno funziona così come la soluzione di cui sopra:

Entrambi elencano più pacchetti rispetto alla soluzione precedente.

EDIT: cosa fare se hai eseguito l'aggiornamento da una versione precedente:

Se hai aggiornato Ubuntu da una versione all'altra, probabilmente dovrai modificare questo processo. In tal caso, controllerei il file manifest della versione più recente (vedi sopra) oltre al file initial-status.gz della versione corrente. Puoi farlo facilmente aggiungendo un altro confronto. Usare solo il file manifest non funzionerà, poiché il file manifest purtroppo non contiene tutto ciò che fa il file initial_status.gz (ho controllato).


165
2017-07-06 15:01



Questo non ha funzionato per me perché /var/log/installer/initial-status.gz manca. Inoltre voglio sapere se questo dipende dal marchio di apts di manual o no? - Anwar
Purtroppo non c'è manifest per le versioni del server. - Antti Haapala
Ho eseguito il showmanual comando (sotto). E usare comm per confrontare le due liste (ordinate). Il showmanual il risultato mi ha dato 1.840 Di Più pacchetti unici da apt-mark showmanual non mostrato da questo metodo. NESSUN pacchetti erano unici per l'output di questo comm-comando. Penso che sia più interessante registrarlo per il mio PC, 894 i pacchetti sono elencati in Entrambi i risultati. Non sono sicuro del motivo per cui esiste una tale discrepanza. Alcuni (molti?) Pacchetti sembrano essere specifici del rilascio. Altri come XOrg, componenti GTK e lib* le cose potrebbero essere aggiornamenti. Comunque questa risposta è un ottimo inizio. - will
Ho appena confrontato le tue soluzioni con apt-mark showmanual. È interessante vedere quante differenze sono visibili. la tua lista ha 238 pacchetti mentre i pacchetti 1717 di resi showmanual. Dei 2179 pacchetti installati, ci sono solo 223 in entrambi gli elenchi, 15 sono solo nella tua (esempi: nodejs, lightdm) e 223 sono solo in showmanual (esempi: xserver-xorg, ubuntu-desktop). Sembra che la tua lista sia più utile, ma senza sapere da dove vengono queste differenze, non è facile decidere ... (ma sono abbastanza sicuro di aver installato nginx e lightdm manualmente ...) [mi dispiace che abbia appena scritto lo stesso ;)] - Daniel Alder


Nelle versioni più recenti del pacchetto apt, c'è anche il comando apt-mark

apt-mark showmanual

54
2018-05-17 16:21



Esattamente la risposta che stavo cercando. - Wolfer
Questo mostra molto più pacchetti di quelli che ho installato manualmente. - Umang
@ Umang Hai ragione. Direi che non era così quando ho scritto questa risposta. Non c'è motivo sul mio sistema da considerare linux-image-3.11.0-*-generic ecc. come manuale - Daniel Alder
@ Uhm, forse questo ti aiuterà askubuntu.com/questions/432743/..., ma la risposta non è accettata. Il fatto è che molti pacchetti di una nuova installazione sono già contrassegnati come manuali. Ma ci sono ancora alcune cose strane. Per rimanere con il mio esempio: linux-image-3.13.0-24-generic è manuale ma corrente linux-image-3.13.0-27-generic è automatico. Sembra che un aggiornamento di un pacchetto di riferimento (in questo caso linux-image-generic, che ha cambiato le dipendenze), il marchio manuale viene impostato automaticamente - Daniel Alder
@DanielAlder alcuni pacchetti di una nuova installazione dovrebbero essere contrassegnati come manuali. Se nessun pacchetto è contrassegnato come manuale, l'intero sistema potrebbe essere cancellato con apt-get autoremove. Questo non è sicuramente quello che vuoi. - Anton K


apt-mark showauto | grep -iE '^foobar$' uscirà "foobar" se il pacchetto è stato installato automaticamente, niente altro.

aptitude search '!~M ~i' elencherà i pacchetti che non sono stati installati automaticamente. È un peccato che aptitude non faccia parte dell'installazione predefinita su Ubuntu Desktop a partire da 10.10.


19
2017-08-16 17:32



aptitude searchmostra TUTTI i pacchetti non solo quelli che vengono installati manualmente (presumo che sia ciò che l'OP voleva) - Oli♦
@ Oli: esamina i modelli di ricerca attitudinale; il modello che sto usando dovrebbe fare esattamente ciò che l'OP vuole. - Li Lo
io corse esso. Mostra un intero carico di pacchetti che non sono installati. - Oli♦
Colpa mia. Corretto. Grazie. - Li Lo
Sto usando qualcosa che non va bene aptitude search '!~M ~i' e elenca 1043 pacchetti. Non c'è modo di installare manualmente molti pacchetti. - ThatGraemeGuy


Per Ubuntu 16.04, controlla il file di registro /var/log/apt/history.log.

Per esempio:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

Non è perfetto, ma è abbastanza buono per chiarire esattamente ciò che ho installato a mano. Metti un -B 1 su grep per vedere quando è stato installato.

Esempio di output

Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade

Non sono sicuro se questo preleva aptitude o no. Non sembra raccogliere le installazioni dall'app desktop Ubuntu Software.


11
2018-02-04 18:48





Il seguente script stamperà tutti i pacchetti che non sono impostati per l'installazione automatica e quindi sono stati installati manualmente:

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

si basa su come apt-mark stampa i pacchetti installati automaticamente.


8
2017-08-16 19:42



Complimenti a te, signore. Questo in realtà funziona, in contrasto con la risposta accettata. - Irfy
mostra solo un paio di pacchetti per me --- sicuramente manca un sacco di loro. - Rmano
Lo stesso qui, sicuramente manca i pacchetti installati manualmente, subito dopo averli installati. - David Ljung Madison
utilizzando sys.exit(1) senza import sys potrebbe causare un errore nelle versioni più recenti di Python. O import sys o usare exit(1). - Videonauth


Come diverse persone hanno commentato, apt-mark showmanual sembra essere un po 'bacato (e l'ho segnalato come bug 727799). Quando lo sto usando, in realtà segnala un sacco di cose che non sono nemmeno loggate in / var / lib / apt / extended_states (dove questo dovrebbe essere memorizzato) e apt-get non sta loggando cose come installato in / var / lib / apt / extended_states (solo in / var / lib / dpkg / status). Lo script python di txwikinger sopra disegna direttamente da / var / lib / apt / extended_states ma se lo si utilizza oggi la sintassi potrebbe non funzionare (il mio ha appena iniziato a generare errori con Kubuntu 13.10). La sintassi aggiornata è:

#!/usr/bin/python
import sys

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

Per me questa è stata una lista molto breve di 5 elementi che non sembrano essere precisi neanche.


5
2017-10-26 23:28



utilizzando sys.exit(1) senza import sys potrebbe causare un errore nelle versioni più recenti di Python. O import sys o usare exit(1). - Videonauth


Per ottenere un elenco di tutti i pacchetti (non installati, installati dall'utente o installati di default, tra tutti i PPA), apt impiega il seguente metodo:

apt list [option]

Le possibili opzioni utili per questo sono:

--installed per visualizzare solo i pacchetti che sono installati sul sistema (su circa 50.000+)

--manual-installed per elencare i pacchetti che erano espressamente installato da un comando, direttamente o come dipendenze.

In alternativa, puoi fare:

apt list --manual-installed | grep -F \[installed\] per ottenere un elenco di pacchetti che derivano solo dai comandi utente e dalle loro dipendenze e per ottenere informazioni aggiuntive su di essi come la versione e l'architettura supportate (x86, x86_64, amd64, tutti, ecc.)


4
2018-02-07 14:01





Come disse Li Lo, apt-mark showauto dovrebbe farti avere una lista di cose automaticamente installate.

Ora per mostrare le cose che vengono installate manualmente, risulta che c'è un bel modificatore di ricerca semplice per aptitude. Ma tu non vuoi farlo. Vuoi scrivere un enorme comando bash che fa un po 'di scienza missilistica.

Nota: Questa è più un'illustrazione di quanto sei figo, vedrai come svelare massicci comandi di bash a tutti i tuoi amici. 

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

L'ho spezzato su due righe per essere leggibile. Cosa fa questo?

  • Per prima cosa interrogiamo dpkg per un elenco di pacchetti che sono installati.
  • Filtriamo quelli per quelli effettivamente installati (non solo la configurazione residua)
  • Sminuzziamo lo stato
  • Confrontiamo quella lista con la lista automatizzata da apt-mark
  • Scavalchiamo perché possiamo.

1
2017-08-16 17:41



Dubito che sia accurato, dal momento che dpkg mostra spesso pacchetti che non sono installati - txwikinger
So cosa vuoi dire ma il mio bash-fu non è abbastanza forte. So che è possibile mostrare lo stato da dpkg-query, grep in basso e quindi tagliare lo stato. Avrò un andare. - Oli♦
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort) è propriamente meglio;) - LassePoulsen


Se nessuno ti dà una bella risposta usando un comando apr-something puoi farlo una strada difficile. Apt-get memorizza le informazioni in / var / lib / apt / extended_states. Qualsiasi file che viene installato automaticamente verrà aggiunto a questo file. Se si installa un pacchetto già in questo file manualmente, il pacchetto rimarrà in questo file ma con Auto-installato: 0 nella seconda riga. Non è cancellato

Nota: come previsto, risposte migliori potrebbero funzionare se sono apparse modifiche al posizionamento dei file. Tengo il mio solo nel caso in cui le informazioni sul percorso del file siano utili.


1
2017-08-16 17:44



No. Ho dato una rapida occhiata a quel file per scoprire che Liferea è stato contrassegnato come auto-installato. Ho fatto un apt-get install liferea e non è stato installato, ma ho ottenuto l'output che era qualcosa con l'effetto di "contrassegnato come installato manualmente". Ora liferea è ancora nel file, tranne che la riga successiva ha un 0 invece di a 1. Inoltre, dovresti cambiare la tua regex pattern in " foobar$" invece di solo foobar. - Umang
È vero. Colpa mia, nel mio sistema non c'è linea con 0, ma dovrebbe essere un evento raro. Aggiorno la risposta per ogni evenienza. - Javier Rivera