Erweiterte Befehle für Linux-Benutzer¶
Erweiterte Befehle bieten eine bessere Anpassung und Steuerung in speziellen Situationen, sofern Sie mit den Grundbefehlen vertraut sind.
Ziele: In diesem Kapitel werden zukünftige Linux-Administratoren Folgendes lernen:
Einige nützliche Befehle, die im vorherigen Kapitel nicht enthalten sind;
Einige erweiterte Befehle.
Benutzerbefehle, Linux
Vorkenntnisse:
Schwierigkeitsgrad:
Lesezeit: 23 Minuten
uniq-Befehl¶
Der uniq Befehl ist ein sehr mächtiger Befehl, der mit dem sort Befehl benutzt wird, insbesondere für die Analyse von Logdateien. Sie können Einträge sortieren und anzeigen, indem Sie Duplikate entfernen.
Um zu veranschaulichen, wie der uniq Befehl funktioniert, verwenden wir eine Datei firstnames.txt mit einer Liste von Vornamen:
antoine
xavier
steven
patrick
xavier
antoine
antoine
steven
Hinweis
uniq erfordert, dass die Eingabedatei sortiert ist, da sie nur aufeinander folgende Zeilen vergleicht.
Ohne Argument wird der uniq Befehl die gleichen Zeilen nicht anzeigen, die einander in der firstnames.txt Datei folgen:
$ sort firstnames.txt | uniq
antoine
patrick
steven
xavier
Um nur die Zeilen anzuzeigen, die nur einmal erscheinen, verwenden Sie die -u Option:
$ sort firstnames.txt | uniq -u
patrick
Um dagegen nur die Zeilen anzuzeigen, die mindestens zweimal in der Datei erscheinen, müssen Sie die -d Option verwenden:
$ sort firstnames.txt | uniq -d
antoine
steven
xavier
Um nur Zeilen zu löschen, die nur einmal erscheinen, verwenden Sie die -D Option:
$ sort firstnames.txt | uniq -D
antoine
antoine
antoine
steven
steven
xavier
xavier
Um schließlich die Anzahl der Vorkommnisse jeder Zeile zu zählen, verwenden Sie die -c Option:
$ sort firstnames.txt | uniq -c
3 antoine
1 patrick
2 steven
2 xavier
$ sort firstnames.txt | uniq -cd
3 antoine
2 steven
2 xavier
xargs Befehle¶
Der xargs Befehl erlaubt die Konstruktion und Ausführung von Befehlszeilen aus der Standardeingabe.
Der xargs Befehl liest Argumente von der Standardeingabe ein und führt den Befehl (/bin/echo) standardmäßig aus oder mehrere Male unter Verwendung der ursprünglichen Argumente aus, gefolgt von den Argumenten, die von der Standardeingabe gelesen werden.
Ein erstes und einfachstes Beispiel wäre Folgendes:
$ xargs
use
of
xargs
<CTRL+D>
use of xargs
Der xargs Befehl wartet auf eine Eingabe von stdin. Es werden drei Zeilen eingegeben. Das Ende der Benutzereingabe xargs wird durch die Tastaturfolge Ctrl+D festgelegt. xargs führt dann den Standardbefehl echo aus, gefolgt von den drei Argumenten, die der Benutzereingabe entsprechen, nämlich:
$ echo "use" "of" "xargs"
use of xargs
Es ist möglich, einen Befehl anzugeben, der von xargs ausgeführt werden soll.
Im folgenden Beispiel führt xargs den Befehl ls -ld auf dem Satz von Ordnern aus, die in der Standardeingabe angegeben sind:
$ xargs ls -ld
/home
/tmp
/root
<CTRL+D>
drwxr-xr-x. 9 root root 4096 5 avril 11:10 /home
dr-xr-x---. 2 root root 4096 5 avril 15:52 /root
drwxrwxrwt. 3 root root 4096 6 avril 10:25 /tmp
In der Praxis führt das Kommando xargs den ls -ld /home /tmp /root Befehl aus.
Was passiert, wenn der auszuführende Befehl nicht mehrere Argumente akzeptiert, wie z. B. beim Befehl find?
$ xargs find /var/log -name
*.old
*.log
find: paths must precede expression: *.log
Das Kommando xargs versucht, den find Befehl mit mehreren Argumenten hinter der -name Option auszuführen, die find dazu veranlasst einen Fehler zu generieren:
$ find /var/log -name "*.old" "*.log"
find: paths must precede expression: *.log
In diesem Fall der xargs Befehl muss gezwungen werden, den find Befehl mehrmals auszuführen (einmal pro Zeile als Standardeingabe). Die -L Option gefolgt von einem Integer erlaubt es Ihnen, die maximale Anzahl an Einträgen, die mit dem Befehl gleichzeitig bearbeitet werden sollen, anzugeben:
$ xargs -L 1 find /var/log -name
*.old
/var/log/dmesg.old
*.log
/var/log/boot.log
/var/log/anaconda.yum.log
/var/log/anaconda.storage.log
/var/log/anaconda.log
/var/log/yum.log
/var/log/audit/audit.log
/var/log/anaconda.ifcfg.log
/var/log/dracut.log
/var/log/anaconda.program.log
<CTRL+D>
Wenn wir beide Argumente in der gleichen Zeile angeben wollten, müssen wir die -n 1 Option verwenden:
$ xargs -n 1 find /var/log -name
*.old *.log
/var/log/dmesg.old
/var/log/boot.log
/var/log/anaconda.yum.log
/var/log/anaconda.storage.log
/var/log/anaconda.log
/var/log/yum.log
/var/log/audit/audit.log
/var/log/anaconda.ifcfg.log
/var/log/dracut.log
/var/log/anaconda.program.log
<CTRL+D>
Case Studie eines Backups mit einem tar basierend auf einer Suche:
$ find /var/log/ -name "*.log" -mtime -1 | xargs tar cvfP /root/log.tar
$ tar tvfP /root/log.tar
-rw-r--r-- root/root 1720 2017-04-05 15:43 /var/log/boot.log
-rw-r--r-- root/root 499270 2017-04-06 11:01 /var/log/audit/audit.log
Die Besonderheit des xargs Befehls ist, dass es das Eingabeargument am Ende des aufgerufenen Befehls erwartet. Dies funktioniert sehr gut mit dem obigen Beispiel, da die übergebenen Dateien die Liste der Dateien bilden, die dem Archiv hinzugefügt werden sollen.
Wenn wir nun das Beispiel des cp Kommandos nehmen und eine Liste von Dateien in ein Verzeichnis kopieren wollen, diese Liste der Dateien wird am Ende des Befehls hinzugefügt, aber was das cp Kommando am Ende des Befehls erwartet, ist das Ziel. Um dies zu tun, verwenden wir die Option -I um die Eingabeargumente irgendwo anders als am Ende der Zeile zu platzieren.
find /var/log -type f -name "*.log" | xargs -I % cp % /root/backup
Mit der Option -I können Sie ein Zeichen (in unserem Beispiel das % Zeichen) angeben, als Platzhalter für die Eingabedateien von xargs.
Das Paket yum-utils¶
Das yum-utils Paket ist eine Sammlung von Werkzeugen verschiedener Autoren für yum, die es einfacher und leistungsfähiger machen.
Anmerkung
Während yum in Rocky Linux 8 durch dnf ersetzt wurde der Paketname bleibt yum-utils, obwohl er auch als dnf-utils installiert werden kann. Dies sind klassische YUM Werkzeuge, die als CLI Shims auf DNF implementiert werden, um die Rückwärtskompatibilität mit yum-3 zu gewährleisten.
Nachfolgend finden Sie einige Beispiele für diese Dienstprogramme.
Das Kommando repoquery¶
Der Befehl repoquery wird verwendet, um die Pakete im Repository abzufragen.
Anwendungsbeispiele:
- Zeigt die Abhängigkeiten eines Pakets an (es kann ein installiertes oder nicht installiertes Softwarepaket sein), entspricht
dnf deplist <package-name>
repoquery --requires <package-name>
- Zeigt die Dateien, die von einem installierten Paket bereitgestellt werden (funktioniert nicht für nicht installierte Pakete), äquivalent zu
rpm -ql <package-name>
$ repoquery -l yum-utils
/etc/bash_completion.d
/etc/bash_completion.d/yum-utils.bash
/usr/bin/debuginfo-install
/usr/bin/find-repos-of-install
/usr/bin/needs-restarting
/usr/bin/package-cleanup
/usr/bin/repo-graph
/usr/bin/repo-rss
/usr/bin/repoclosure
/usr/bin/repodiff
/usr/bin/repomanage
/usr/bin/repoquery
/usr/bin/reposync
/usr/bin/repotrack
/usr/bin/show-changed-rco
/usr/bin/show-installed
/usr/bin/verifytree
/usr/bin/yum-builddep
/usr/bin/yum-config-manager
/usr/bin/yum-debug-dump
/usr/bin/yum-debug-restore
/usr/bin/yum-groups-manager
/usr/bin/yumdownloader
…
yumdownloader Befehl¶
Der yumdownloader Befehl lädt RPM-Pakete aus den Repositories herunter. Äquivalent zu dnf download --downloadonly --downloaddir ./ package-name
Anmerkung
Dieser Befehl ist sehr nützlich, um schnell ein lokales Repository für einige rpms zu erstellen!
Beispiel: yumdownloader lädt das samba rpm Paket und all seine Abhängigkeiten:
$ yumdownloader --destdir /var/tmp --resolve samba
oder
$ dnf download --downloadonly --downloaddir /var/tmp --resolve samba
| Option | Beschreibung |
|---|---|
--destdir |
Die heruntergeladenen Pakete werden im angegebenen Ordner gespeichert. |
--resolve |
Lädt auch die Paket-Abhängigkeiten herunter. |
Das Paket psmisc¶
Das psmisc Paket enthält Hilfsprogramme zur Verwaltung von Systemprozesse:
pstree: DerpstreeBefehl zeigt die aktuellen Prozesse auf dem System in einer baumartige Struktur an.killall: derkillallBefehl sendet ein Kill Signal an alle Prozesse, die mit dem Namen identifiziert werden.fuser: derfuserBefehl identifiziert diePIDvon Prozessen, die die angegebenen Dateien oder Dateisysteme verwenden.
Beispiele:
$ pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
# killall httpd
Unterbricht die Prozesse (-k Option), die auf die Datei /etc/httpd/conf/httpd.conf zugreifen:
# fuser -k /etc/httpd/conf/httpd.conf
watch Befehl¶
Der watch Befehl führt regelmäßig einen Befehl aus und zeigt das Ergebnis im Terminal im Vollbildmodus an.
Mit der Option -n können Sie die Anzahl der Sekunden zwischen jeder Ausführung des Befehls festlegen.
Anmerkung
Um den watch Befehl zu verlassen, müssen Sie Ctrl+C eingeben, und den Prozess beenden.
Beispiele:
- Zeigt das Ende der
/etc/passwdDatei alle 5 Sekunden an:
watch -n 5 tail -n 3 /etc/passwd
Ergebnis:
Every 5.0s: tail -n 3 /etc/passwd rockstar.rockylinux.lan: Thu Jul 1 15:43:59 2021
sssd:x:996:993:User for sssd:/:/sbin/nologin
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
- Überwachung der Anzahl der Dateien in einem Ordner:
watch -n 1 'ls -l | wc -l'
- Uhr anzeigen:
watch -t -n 1 date
install Befehl¶
Im Gegensatz zu dem, was der Name vermuten lässt, wird der Befehl install nicht zur Installation von Paketen verwendet.
Der Befehl kombiniert das Kopieren von Dateien (cp) und das Erstellen von Ordnern (mkdir) sowie die Zugriffsverwaltung (chmod, chown) und andere nützliche Funktionen (wie Backups).
install source dest
install -t directory source [...]
install -d directory
Optionen:
| Option | Beschreibung |
|---|---|
-b oder --backup[=suffix] |
ein Backup der Ziel-Datei erstellen. |
-d |
Argumente als Directory-Namen behandeln |
-D |
Erstellen aller Hauptkomponenten, bevor QUELLE nach ZIEL kopiert wird |
-g und -o |
setzt Eigentümer-Eigenschaft |
-m |
Berechtigungen setzen |
-p |
Datum und Uhrzeit der ursprünglichen Dateien behalten |
-t |
kopiert alle Quellargumente in den Ordner |
Anmerkung
Es gibt auch Optionen um den SELinux-Kontext zu verwalten (siehe man install).
Beispiele:
Mit der Option -d ein Verzeichnis anlegen:
install -d ~/samples
Quelldatei in einen Ordner kopieren:
install src/sample.txt ~/samples/
Diese beiden Anweisungen können auch mit einem einzigen Kommando bewerkstelligt werden:
$ install -v -D -t ~/samples/ src/sample.txt
install: creating directory '~/samples'
'src/sample.txt' -> '~/samples/sample.txt'
Dieses Kommando spart Zeit. Kombiniert Eigentümer-, Eigentümergruppen- und Rechteverwaltung zur Verbesserung und Zeitersparnis:
sudo install -v -o rocky -g users -m 644 -D -t ~/samples/ src/sample.txt
Anmerkung
In diesem Fall ist sudo notwendig, um die Eigenschaften zu ändern.
Sie können mit der Option -b auch ein Backup vorhandener Dateien erstellen:
$ install -v -b -D -t ~/samples/ src/sample.txt
'src/sample.txt' -> '~/samples/sample.txt' (archive: '~/samples/sample.txt~')
Wie Sie sehen, erstellt der Befehl install eine Sicherung, indem er eine Tilde ~ an den ursprünglichen Dateinamen anfügt.
Das Suffix kann mit der Option -S festgelegt werden:
$ install -v -b -S ".bak" -D -t ~/samples/ src/sample.txt
'src/sample.txt' -> '~/samples/sample.txt' (archive: '~/samples/sample.txt.bak')
Das Kommando tree¶
Anzeigen der Dateien oder Verzeichnisse innerhalb eines Verzeichnisses in einer Baumansicht.
| Optionen | Beschreibung |
|---|---|
-a |
Alle Dateien werden gelistet |
-h |
Zeigt die Größe verständlicher an |
-u |
Zeigt den Dateieigentümer oder die UID-Nummer an |
-g |
Zeigt den Besitzer der Dateigruppe oder die GID-Nummer an |
-p |
Zeigt die Datei-Privilegien an |
Zum Beispiel:
$ tree -hugp /etc/yum.repos.d/
/etc/yum.repos.d/
├── [-rw-r--r-- root root 1.6K] epel-modular.repo
├── [-rw-r--r-- root root 1.3K] epel.repo
├── [-rw-r--r-- root root 1.7K] epel-testing-modular.repo
├── [-rw-r--r-- root root 1.4K] epel-testing.repo
├── [-rw-r--r-- root root 710] Rocky-AppStream.repo
├── [-rw-r--r-- root root 695] Rocky-BaseOS.repo
├── [-rw-r--r-- root root 1.7K] Rocky-Debuginfo.repo
├── [-rw-r--r-- root root 360] Rocky-Devel.repo
├── [-rw-r--r-- root root 695] Rocky-Extras.repo
├── [-rw-r--r-- root root 731] Rocky-HighAvailability.repo
├── [-rw-r--r-- root root 680] Rocky-Media.repo
├── [-rw-r--r-- root root 680] Rocky-NFV.repo
├── [-rw-r--r-- root root 690] Rocky-Plus.repo
├── [-rw-r--r-- root root 715] Rocky-PowerTools.repo
├── [-rw-r--r-- root root 746] Rocky-ResilientStorage.repo
├── [-rw-r--r-- root root 681] Rocky-RT.repo
└── [-rw-r--r-- root root 2.3K] Rocky-Sources.repo
0 directories, 17 files
Das Kommando stat¶
Der Befehl stat zeigt den Status einer Datei oder eines Dateisystems an.
$ stat /root/anaconda-ks.cfg
File: /root/anaconda-ks.cfg
Size: 1352 Blocks: 8 IO Block: 4096 regular file
Device: 10302h/66306d Inode: 2757097 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-01-20 13:04:57.012033583 +0800
Modify: 2023-09-25 14:04:48.524760784 +0800
Change: 2024-01-24 16:37:34.315995221 +0800
Birth: 2
File– Zeigt den Pfad der Datei an.Size– Zeigt die Dateigröße in Bytes an. Wenn es sich um ein Verzeichnis handelt, werden die festen 4096 Bytes angezeigt, die der Verzeichnisname belegt.Blocks– Zeigt die Anzahl der zugewiesenen Blöcke an. Bitte beachten! Die Größe jedes Blocks in diesem Befehl beträgt 512 Byte. Die Standardgröße jedes Blocks inls -lsbeträgt 1024 Bytes.Device– Gerätenummer in dezimaler oder hexadezimaler Form.Inode– Ein Inode ist eine eindeutige Identifikationsnummer, die der Linux-Kernel einer Datei oder einem Verzeichnis zuordnet.Links- Anzahl Hard-Links. Hardlinks werden manchmal auch als physische Links bezeichnet.Access– Die letzte Zugriffszeit von Dateien und Verzeichnissen, d. h.,atimein GNU/Linux.Modify– Der letzte Änderungszeitpunkt von Dateien und Verzeichnissen, d. h.mtimein GNU/Linux.Change– Der letzte Zeitpunkt der Änderung der Eigenschaft, d. h.ctimein GNU/Linux.Birth- Birth time (Zeitstempel der Kreation). In einigen Dokumenten wird es alsbtimeodercrtimeabgekürzt. Sie benötigen eine Dateisystem- und Kernelversion, die höher als eine bestimmte Version ist, um die Erstellungszeit anzuzeigen.
Im Kontext der Dateien:
atime – Nach dem Zugriff auf den Dateiinhalt mit Befehlen wie cat, less, more und head kann die atime der Datei aktualisiert werden. Bitte beachten! Die atime der Datei wird nicht in Echtzeit aktualisiert und man muss aus Leistungsgründen eine Zeit lang warten, bevor sie angezeigt werden kann. mtime – Durch Ändern des Dateiinhalts kann die mtime der Datei aktualisiert werden (z. B. durch Anhängen oder Überschreiben des Dateiinhalts durch Umleitung). Da die Dateigröße eine Eigenschaft der Datei ist, wird auch die ctime gleichzeitig aktualisiert. ctime – Durch Ändern des Eigentümers, der Gruppe, der Berechtigungen, der Dateigröße und der Links (Soft- und Hardlinks) der Datei wird ctime aktualisiert.
Im Kontext der Verzeichnisse:
atime – Nachdem Sie mit dem Befehl cd ein neues Verzeichnis aufgerufen haben, auf das noch nie zuvor zugegriffen wurde, können Sie die atime dieses Verzeichnisses aktualisieren und korrigieren. mtime – Durch Ausführen von Vorgängen wie Erstellen, Löschen und Umbenennen von Dateien in diesem Verzeichnis werden mtime und ctime des Verzeichnisses aktualisiert. ctime – Wenn sich die Berechtigungen, der Eigentümer, die Gruppe usw. eines Verzeichnisses ändern, wird die ctime des Verzeichnisses aktualisiert.
Hinweis
- Wenn Sie eine neue Datei oder ein neues Verzeichnis erstellen, sind dessen
atime,mtimeundctimegenau gleich - Wenn der Dateiinhalt geändert wird, werden
mtimeundctimeder Datei zwangsläufig aktualisiert. - Wenn im Verzeichnis eine brandneue Datei erstellt wird, werden
atime,ctimeundmtimedieses Verzeichnisses gleichzeitig aktualisiert. - Wenn die
mtimeeines Verzeichnisses aktualisiert wird, muss diectimedieses Verzeichnisses aktualisiert werden.