Debian aufräumen - rc-Pakete mühelos mit meinem Python-Skript entfernen

Wenn Ihr Debian als Euer Betriebssystem verwendet, habt Ihr bestimmt schon einmal mit dem Befehl dpkg gearbeitet, um Pakete zu verwalten. Bei Debian, Ubuntu, etc. kommt es oft vor, dass Pakete mit dem Status „rc“ (removed and configuration files) auf Eurem System verbleiben und Platz beanspruchen. Das manuelle Entfernen dieser Pakete kann jedoch zeitaufwändig sein. In diesem Blog-Artikel stelle ich Euch ein von mir entwickeltes Python-Skript vor, das diesen Prozess automatisiert und vereinfacht.

Hintergrund

Wenn Ihr in Debian oder Ubuntu Pakete deinstalliert, bleiben in der Regel noch Paketbestandteile und Konfigurationsdateien zurück. Dass Reste vorhanden sind erkennt man am Paketstatus „rc“. Um solche Pakete zu identifizieren und zu entfernen, wird normalerweise der Befehl

dpkg -l | grep ^rc | awk {'print $2'} | xargs dpkg -P 

verwendet. Dieser Befehl filtert alle Pakete mit dem Status „rc“ aus der Liste der installierten Pakete und entfernt sie dann vollständig.

Das Python Skript

Mein Python-Skript vereinfacht diesen Vorgang und bietet einige zusätzliche Funktionen. Hier sind die Kernfunktionen des Skripts:

  1. Liste Pakete mit dem Status „rc“ auf
    Durch den Aufruf des Skripts ohne Argumente oder mit dem Argument -l könnt Ihr eine Liste der Pakete mit dem Status „rc“ anzeigen lassen:
    ./purgerc -l
    Ihr seht nun alle relevanten Pakete, die das Skript bereinigen kann.
  2. Entferne Pakete mit dem Status „rc“
    Durch den Aufruf des Skripts mit dem Argument -f werden alle Pakete mit dem Status „rc“ entfernt:
    ./purgerc -f
    Das Skript führt automatisch den Befehl
    dpkg -l | grep ^rc | awk {'print $2'} | xargs dpkg -P
    aus und entfernt die entsprechenden Pakete.
  3. Übersicht über entfernte Pakete
    Nach dem Entfernen gibt das Skript eine Übersicht über die entfernten Pakete aus:
    Packages removed successfully:
    package1
    package2
    ...
  4. Hilfemeldungen
    Durch den Aufruf des Skripts mit dem Argument -h oder -? erhaltet Ihr eine Hilfemeldung:
    ./purgerc -h

Verwendung und Sicherheit

Die Verwendung des Skripts erfolgt selbstverständlich auf eigene Gefahr!

Das Skript wurde unter Debian 12 entwickelt und setzt Python 3.7 voraus.

Um das Skript auszuführen, müsst Ihr sicherstellen, dass Ihr die erforderlichen Berechtigungen habt, Pakete zu entfernen. Dies wird normalerweise durch die Verwendung von sudo erreicht. Damit es von jedem beliebigen Verzeichnis aus aufgerufen werden kann, sollte es eventuell im Verzeichnis /usr/local/bin abgelegt werden.

Bitte beachtet, dass die Verwendung von shell=True bestimmte Sicherheitsrisiken mit sich bringen kann. In diesem Fall, da die Eingabe vom Benutzer nicht direkt in den Befehl eingefügt wird, sollte es jedoch in Ordnung sein. Wenn Ihr Euch dennoch Sorgen macht, könnt Ihr alternative Methoden wie die Verwendung von subprocess.Popen oder die Aufteilung des Befehls in separate Aufrufe in Betracht ziehen.

Mit diesem Python-Skript wird die Bereinigung von Debian-Paketen mit dem Status „rc“ einfacher und benutzerfreundlicher. Es bietet Euch eine klar strukturierte Möglichkeit, Pakete anzuzeigen, zu entfernen und eine Zusammenfassung der durchgeführten Aktionen zu erhalten. Verabschiedet Euch von komplexen Befehlen und automatisiert diesen Vorgang mit diesem nützlichen Skript

Das Skript „purgerc“

#!/usr/bin/env python3
import subprocess
import sys

def list_rc_packages():
    try:
        # Run dpkg command to list packages with status "rc"
        result = subprocess.run(['dpkg', '-l'], capture_output=True, text=True, check=True)
        lines = result.stdout.split('\n')
        rc_packages = [line.split()[1] for line in lines if line.startswith('rc')]
        
        if rc_packages:
            print("These packages can be purged:")
            print('\n'.join(rc_packages))
        else:
            print("No packages available to be purged.")
    except subprocess.CalledProcessError as e:
        print(f"Error: {e}")
        sys.exit(1)

def remove_rc_packages():
    try:
        # Run dpkg command to list packages with status "rc" and remove them
        result = subprocess.run('dpkg -l | grep "^rc" | awk \'{print $2}\' | xargs dpkg -P', capture_output=True, text=True, shell=True, check=False)
        if result.returncode == 0:
            removed_packages = result.stdout.strip().split('\n')
            print("Packages removed successfully:")
            print('\n'.join(removed_packages))
        else:
            print("No packages available to be purged.")
    except subprocess.CalledProcessError as e:
        print(f"Error: {e}")
        sys.exit(1)

def print_usage():
    print("Usage:")
    print("  purgerc             : List packages with status 'rc'")
    print("  purgerc -l          : List packages with status 'rc'")
    print("  purgerc -f          : Purge packages with status 'rc'")
    print("  purgerc -h or -?    : Show this usage message")

def main():
    if len(sys.argv) == 1:
        list_rc_packages()
    elif len(sys.argv) == 2:
        if sys.argv[1] == '-l':
            list_rc_packages()
        elif sys.argv[1] == '-f':
            remove_rc_packages()
        elif sys.argv[1] in ['-h', '-?']:
            print_usage()
        else:
            print("Invalid argument. Use -h or -? for usage.")
            sys.exit(1)
    else:
        print("Invalid number of arguments. Use -h or -? for usage.")
        sys.exit(1)

if __name__ == "__main__":
    main()