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:
- 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:
Ihr seht nun alle relevanten Pakete, die das Skript bereinigen kann../purgerc -l
- 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
aus und entfernt die entsprechenden Pakete.dpkg -l | grep ^rc | awk {'print $2'} | xargs dpkg -P
- Übersicht über entfernte Pakete
Nach dem Entfernen gibt das Skript eine Übersicht über die entfernten Pakete aus:Packages removed successfully: package1 package2 ...
- 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()