Linux Befehle
Kontrollstrukturen Datenträger und Dateisystem
Dateiverwaltung
Datum vergleichen
$fileName=/tmp/backup_lock date_file=$(stat -c %Y $filename) date_jetzt=$(date +%s) date_diff=$(expr $date_jetzt - $date_file)
Fehlerhaft codierte Dateinamen
Zum Umbenennen muss eventuell das Tool convmv nachinstalliert werden.
zypper in convmv
Befehl zum rekursiven Umbenennen aller Dateien in einem Verzeichnis.
convmv -f iso-8859-1 -t utf-8 -r --notest *
chmod
- Berechtigungen nur für Dateien bzw. Verzeichnisse ändern
find . -type f -exec chmod 444 {} \; # chmod auf Dateien find . -type d -exec chmod 555 {} \; # chmod auf Verzeichnisse
- Setzen des Set User Id Bit = SUID Bit
Vor die drei Ziffern wird eine 4 gestellt. Beispiel:
chmod 4755 filename
oder
chmod u+s /usr/sbin/exim4
ergibt
-rwsr-xr-x 1 root root 875104 Jan 2 2013 /usr/sbin/exim4
Das x beim Eigentümer wird durch s ersetzt. Diese Datei wird daraufhin immer unter der ID des Besitzers ausgeführt, egal von wem sie aufgerufen wurde.
- Rechte von Verzeichnissen
Betrachtet man ein Verzeichnis als Datei, dessen Inhalt eine Liste von Dateien ist, so erklärt sich die Wirkung der Zugriffsrechte von selbst.
- Ausführen heißt Öffnen des Verzeichnisses
- Schreiben heißt den Inhalt des Verzeichnisses verändern
- Lesen heißt in das Verzeichnis hineinschauen
Lesen ohne Ausführen ist also nicht möglich.
- Dateirechte, Benutzerrechte unter UNIX
Hervorragende Einführung Hier werden auch die Sonderrechte SUID, SGID erklärt.
http://www.linux-user.de/ausgabe/2003/12/066-acl/index.html
cp
- Dateien kopieren
So kopiert man auch versteckte Dateien:
cp -dpR Quellverzeichnis/.[a-z,A-Z,0-9]* Zielverzeichnis
oder
cp -dpR Quellverzeichnis/.[^.]* Zielverzeichnis # .[^.] bedeutet: beliebiges Zeichen ausgenommen Punkt
- Eine Datei verteilen auf bestimmte Verzeichnisse
for dir in `ls joomla_* -d` ; do cp /www/joomla_fg/administrator/components/com_weblinks/config.xml $dir/administrator/components/com_weblinks done
ls
Dateien anzeigen. Es gibt unter Suse standardmäßig einen Aliasbefehl: dir
- Nur Verzeichnisse anzeigen
ls -ld * | grep "^d"
lsof
Offene Dateien werden aufgelistet
rsync
- Wiederherstellen von Dateien aus Backup
rsync -av --numeric-ids /backup/server.hs/backup.0/home/user_1 /home # über SSH: rsync -avz --numeric-ids -e ssh primergy:/backup/server.hs/backup.0/home/user_1 /home
- Backup mit Rsync
# Ausschließen mehrerer Verzeichnisinhalte rsync -avz --numeric-ids --exclude=media/* --exclude=mnt/* --delete-excluded <quellverzeichnis> <zielverzeichnis>
# Verwendung eines Exclude Files rsync -avz --numeric-ids --exclude-from=excluded.txt --delete-excluded <quellverzeichnis> <zielverzeichnis>
- Leerzeichen im Zielverzeichnis
Wenn im Zielverzeichnis Leerzeichen enthalten sind, werden diese abgeschnitten. Das kann verhindert werden durch folgende Option
--protect-args
- Mehrere Dateien/Verzeichnisse excluden
Komplettes Backup auf einen gemountete Datenträger kopieren
rsync -avH --numeric-ids \ --exclude={/etc/fstab,/etc/default/grub,/boot/grub2/grub.cfg,/home,/root,/var,/srv} \ -e ssh 10.0.0.111:/media/disk/suseVirtualbox/backup.0/* /mnt/tmp
setuid
Durch das Setuid Bit wird eine ausführbare Datei mit den Rechten des Besitzers ausgeführt und nicht - wie sonst - mit den Rechten des aufrufenden Benutzers. Typischerweise gehört so eine Datei dem Administrator root.
Achtung: Das funktioniert angeblich nur mit Binärdateien, nicht mit einem Shellscript!
chmod +s Dateiname # oder chmod u+s Dateiname
tar
- Ein Archiv erstellen ohne Ordnerpfade
pwd=$(pwd) cd /usr/local/bin/bak tar cfv /www/download/bak.tar * cd $pwd
- Dateien in einem Archiv anzeigen
tar -tvf bak.tar
- TAR Archiv entpacken
tar -xf bak.tar
- XZ Archiv entpacken
XZ Archive sind verlustfrei gepackt.
cd /var/log/apache2 unxz ./access_log-20190617.xz tar -xf ./access_log-20190617
umask
Der Befehl ändert die Grundeinstellung der Zugriffsrechte bei neuen Dateien bzw. Verzeichnissen.
Standardwert für Dateien: 666
Standardwert für Verzeichnisse: 777
umask 0022
ergibt für Dateien: 666 - 022 = 644
ergibt für Verzeichnisse: 777 - 022 = 755
Man kann diesen Befehl in die Datei /etc/init.d/boot.local
eintragen, dann werden die Grundeinstellungen beim Systemstart gesetzt.
Anscheinend muss diese Einstellung für jeden Benutzer extra gesetzt werden. Also eintragen in ~/.bashrc
und ~/.profile
ImageMagick
Größe ändern - proportional
targetdir=verkleinert mkdir $targetdir for file in * ; do convert "$file" -resize 400x400 "$targetdir/$(basename "$file")"; done;
Exif Informationen löschen
Wenn Probleme mit Rotation, dann liegt das an den gespeicherten EXIF Informationen. Diese kann man löschen.
convert -strip orig.jpg stripped.jpg
# oder mogrify -strip orig.jpg # ganzes Verzeichnis for file in * ; do mogrify -strip $file ; done
HTML Bildergalerie
Erstellen einer HTML Bildergalerie mit 4 Spalten
montage *.jpg -title "Titel" -size 128x128 -tile 4x index.html
Auf der Indexseite wird eine ImageMap mit den Thumbnails erzeugt.
Indexprint
Indexprint mit Anzeige der Dateinamen erzeugen
montage -geometry 200x200+10+10 -label %f -tile 5x6 *.j*.[jJ][pP]*[gG] indexprint.png
Auf einer Seite befinden sich 30 Thumbnails. Beim Drucken des Indexprints sollte ein Seitenrand eingestellt werden.
jhead
jhead -autorot *.jpg
Stellt liegende Bilder auf
Prozesse verwalten
kill
- Mehrere Prozesse löschen
ps -e | grep pop3 | cut -f "1" -d " " | while read item ; do kill $item ; done
pkill
Prozesse beenden.
Mit pkill kann man auch einen Benutzer "abmelden".
pkill -KILL -u <username>
Netzwerk
ifconfig - ip
IP Adressen anzeigen
ip addr show
IP Adresse zuweisen
ifconfig eth0 10.80.12.100
ip addr add 192.168.100.20/24 dev eth0
route
Eine Route hinzufügen für das Gateway ins Internet
route add default gw 10.0.0.138
- Mail Kommandos
Nach dem Start des Programms mail kann man verschiedene Kommandos eingeben. Durch Eingabe von ? erhält man eine Liste der Befehle.
mail ?
- Alle Mails löschen
mail d *
- Mail an root senden
msg="Helle world" echo $msg | mail -s Testmail root
nmap
- Portscan durchführen:
# Portscan am eigenen PC nmap localhost # Portscan auf anderem Rechner nmap 10.80.12.5
- Rechner im Netzwerk scannen
nmap -sP 10.80.12.0/24
Ausgabe:
Host 10.80.12.92 appears to be up. MAC Address: 00:80:87:0B:D6:21 (OKI Electric Industry CO.) Host 10.80.12.93 appears to be up. MAC Address: 00:80:77:48:45:F4 (Brother Industries) Host 10.80.12.94 appears to be up. MAC Address: 00:04:00:EB:6C:28 (Lexmark International) Host 10.80.12.95 appears to be up. MAC Address: 00:C0:02:31:68:33 (Sercomm)
- Nur den Namen der eingeschalteten Geräte im LAN anzeigen
nmap -sP -R --system-dns 192.168.1.0/24 | grep -v down | grep Nmap\ scan\ report | cut -d " " -f 5
wget
Rekursiver Download von einem FTP Server
# Download nach ./joomla.eduhi.at/images: wget -r --user=joomla_408012 --password=password ftp://joomla.eduhi.at/images/*
# Download in das aktuelle Verzeichnis: wget -r --user=joomla_408012 --password=password --no-host-directories --cut-dirs=1 ftp://joomla.eduhi.at/images/*
Allgemein
at
- Befehl zu einer bestimmten Zeit ausführen
Einen bestimmten Befehl um 23:00 ausführen
at 23:00
Es erscheint der at-Prompt zur Eingabe eines Befehls. Eingabe abschließen mit STRG + D. Der Befehl wird unter einer Jobnummer gespeichert in
/var/spool/atjobs
- Job löschen
Beispiel: Job Nr. 3 löschen
atrm 3
- Jobs anzeigen
atq
alias
- Aufruf von Linux Kommandos in verkürzter Form
Beispiele:
alias wol_backup="wol 00:18:F3:23:BD:B8" alias lpr="lpr -o page-left=30 -o page-top=40"
- Aliases dauerhaft speichern in
~/.bashrc
Gespeicherte Aliases aufrufen durch
alias
- Alias löschen
# Beispiel: unalias wake_backup
chroot
Verschieben des Wurzelverzeichnisses = Root Verzeichnis
chroot /mnt /bin/bash # ergänzend: mount /proc mount /sys
wenn in /mnt ein Linux Rootsystem gemountet ist
date
Die Formatdefinition wird mit einem + eingeleitet.
- Alter einer Datei in Stunden
Stunden=`( ($(date +%s) - $(date +%s --reference $LOCKFILE)) / 3600 )`
- Zeit und Datum extrahieren
zeit=`date +%T | cut -c1-5` datum="`date +%A' '%d.%m.%Y`"
dmesg
Zeigt Kernelmeldungen beim Booten an.
find
- Suchen von Dateien in einem bestimmten Verzeichnis
Normalerweise beginnt die Suche im aktuellen Verzeichnis.
find /root -name "fileCopy.lock*"
In diesem Beispiel ist das Verzeichnis /root
der Startpunkt für die Suche.
Ein Kommando auf das Suchergebnis anwenden
Mit der Option -exec kann man nur einen Befehl ausführen. Die Konstruktion {} wird durch den Pfadnamen der gefundenen Datei(en) ersetzt.
* Bestimmte Bilder rekursiv löschen filename=DSC00079.jpg find . -name "$filename" -exec rm {} \;
# Beispiel für das Verzeichnis der Komponente Phocagallery in Joomla
In diesem Beispiel sollen folgende Dateien gelöscht werden:
DSC00079.jpg phoca_thumb_l_DSC00079.jpg phoca_thumb_m_DSC00079.jpg phoca_thumb_s_DSC00079.jpg
filename=DSC00079.jpg find . -name "*$filename" -exec rm {} \;
# Dateien löschen find . -name '*.bak' -exec rm {} \;
# Verzeichnisse löschen find . -name "*Foto laden*" -type d -exec rm {} -R \;
# Broken Symlinks finden und speichern find . -type l ! -execdir test -e '{}' \; -print > broken.links
# Broken Links löschen while read Zeile ; do rm "$Zeile" ; done < broken.links
- Schleife durch die Ausgabe des find Befehles
find . -name *.tif | \ while read file ; do # Bilder konvertieren: convert "$file" "`dirname "$file"`/`basename "$file" .tif`.jpg" # Dateinamen in Großbuchstaben: cp $file `dirname $file`/`basename $file | tr a-z A-Z` done
- Suchen und ersetzen von Text
find . -type f -name "*.php" | \ while read file ; do cp "$file" Datei.tmp sed -e s/'suchtext'/'ersatztext'/g Datei.tmp > "$file" done
- Suchtiefe einschränken
find . -type d -maxtepth 1 -name "joomla_*"
grep
- Text rekursiv in allen Dateien suchen
grep -r Suchtext /www/HS_Server/
- Nur in bestimmten Dateien suchen
grep -r --include "*.php" Suchtext /www/HS_Server/
hwinfo
Hardwareinfo ausgeben, Beispiele:
hwinfo --sound hwinfo --scanner
iconv
Textdateien konvertieren in andere Kodierung
# Beispiel cat Datei.html | iconv -f ISO_8859-15 > Datei.html # oder iconv -f ISO_8859-15 Quelldatei.html -o Zieldatei.html
Folgendes Script konvertiert alle html-Dateien und php-Dateien im aktuellen Verzeichnis:
/usr/local/bin/iconv.sh
loadkeys
loadkeys de
Deutsche Tastatur laden
lpr
Drucken von der Kommandozeile
- Datei im Querformat drucken und Ränder setzen
lpr -o page-left=30 -o page-top=40 -o landscape /etc/fstab
- Ausgabe eines Kommandos drucken
fdisk -l | lpr
- Standard Options
http://www.cups.org/documentation.php/options.html#OPTIONS
- Howto
http://www.cups.org/documentation.php/options.html
read
Variable einlesen mit editierbarem Vorgabewert
name="Ferdinand Anton" read -e -i "$name" -p "Please enter your name: " input echo $input
rpm
RPM Paket downloaden und gleich installieren, Beispiel:
rpm -vU http://download.insecure.org/nmap/dist/nmap-4.20-1.i386.rpm # -v (verbose) # -U (Update)
Infos über Pakete abrufen: -qa = Abfrage, query über alle Pakete.
# Anzahl der Pakete rpm -qa | wc -l # Info über bestimmtes Paket, in diesem Fall quenview rpm -qa | grep quenview
Info über rpm: http://www.tu-chemnitz.de/docs/lindocs/RPM/node4.html
screen
Mit screen kann man innerhalb einer Konsole mehrere Konsolensitzungen erzeugen.
Info: Artikel aus LinuxUser
- Screen Session starten
screen
- Screen Session abtrennen
screen -d [-S Name]
Die Sitzung läuft dann im Hintergrund eigenständig weiter.
- Screen Sitzung wiederaufnehmen
screen -R [-S Name]
- Tastenbefehle für den interaktiven Modus:
Die Tastenbefehle werden eingeleitet mit Strg a. Eine Liste der Tastenkombinationen erhält man mit der Tastenkombination Strg a ?. Einige Beispiele:
- Neues Fenster: Strg a c
- Nächstes Fenster: Strg a Leertaste
- Sitzung abtrennen: Strg a d
- Screen Befehle
Diese Befehle ersetzen die im interaktiven Modus verwendbaren Tastenkombinationen und können somit in Scripten verwendet werden. Die Befehle werden mit der Option -X eingeleitet.
- Nächstes Fenster
screen -X next
- Neues Fenster
screen -X screen
- Befehl in neuem Fenster
screen -X screen yast
seq
seq -w 10
Gibt die Zahlen von 1 bis 10 mit führenden Nullen aus.
su
Dauerhafter Wechsel der Identität
# Login als Root mit entsprechenden Umgebungseinstellungen su - # Wechsel zu Root ohne Umgebungseinstellungen, man bleibt im selben Verzeichnis su
Damit man von der Textkonsole aus auch grafische Programme verwenden kann, gibt es den Befehl kdesu.
Beispiel: kdesu konqueror
sudo
- Mit sudo kann ein Befehl unter einem anderen Benutzer ausgeführt werden, typischerweise als root.
sudo befehl # oder sudo -u username befehl
- Mit dem Kommando
visudo
kann man die Datei /etc/sudoers
bearbeiten
- Beispiel:
# Shutdown für die Gruppe users erlauben: %users localhost=/sbin/shutdown -h now
# ... für alle: ALL localhost=/sbin/shutdown -h now
- Hier findet man eine gute Anleitung: http://www.gentoo.org/doc/de/sudo-guide.xml#doc_chap3
uname
Systeminformationen ausgeben
uname -a
liefert alle Infos
xdg-open
Öffnet eine Datei oder URL mit dem dafür vorgesehenen Standardprogramm.
xdg-open PIC12345.jpg
Zeichenketten bearbeiten
Stringverarbeitung mit der Bash
- Zeichen am Anfang abschneiden
file="DateiName.txt" echo ${file:5}
Ausgabe
Name.txt
- 4 Zeichen ab Position 5 herausschneiden
file="DateiName.txt" echo ${file:5:4}
Ausgabe
Name
cut
Aus einer Zeichenkette Zeichen herausschneiden
Beispiele:
# GID aus /etc/passwd anzeigen zeile=`grep username /etc/passwd` gid=`echo $zeile | cut -d ":" -f "4"`
# Benutzerliste aus LDAP extrahieren: ldapsearch -x -b "ou=users,dc=network" uid -LLL | grep uid: | cut -d " " -f "2" # Homedirectories anzeigen: ldapsearch -x -b "ou=users,dc=network" homeDirectory -LLL | grep homeDirectory: | cut -d " " -f "2"
-d gibt das Trennzeichen an
- Das Standardtrennzeichen ist das Tabulatorzeichen
-f gibt an, das wievielte Feld herauszuschneiden ist
here-document
Zur Ausgabe eines mehrzeiligen Textes in einem Skript
if [ $# -eq 0 ]; then cat << 'delimiter' ----------------------------------------------------- Usage: adduser.sh User Gruppe Zuname Vorname Passwort oder adduser.sh Dateiname ----------------------------------------------------- delimiter exit fi
sed
Suchen und Ersetzen von Text
# Jedes Vorkommen des Suchtextes ersetzen cat datei.txt | sed -e s/'suchtext'/'ersatztext'/g > neue_datei.txt # Nur das erste Vorkommen des Suchbegriffs pro Zeile ersetzen cat datei.txt | sed -e s/'suchtext'/'ersatztext'/ > neue_datei.txt
# Nur das 3. Vorkommen des Suchbegriffs pro Zeile ersetzen und das Ergebnis ausgeben cat datei.txt | sed -e s/'suchtext'/'ersatztext'/3p > neue_datei.txt
- Kommentare und Leerzeilen entfernen
sed -e '/^\#/d' datei > datei.tmp sed -e '/^$/d' datei.tmp > datei
- Anführungszeichen löschen
echo "text" | sed 's/"//g'
- Rekursiv suchen und ersetzen von Text
if [ $# -gt 2 ] ; then suchtext=$1 ersatztext=$2 else read -e -p "Suchtext: " suchtext read -e -p "ersetzen durch: " ersatztext fi grep -rl "$suchtext" | \ while read file; do cp "$file" datei.tmp sed -e s/"$suchtext"/"$ersatztext"/g datei.tmp > "$file" done rm datei.tmp
- Ersetzen von Variablen etc. in PHP Dateien
suchtext=\$this-\>someThing ersatztext=\$this-\>someNewThing grep -rl --include "*.php" "$suchtext" | \ while read file; do cp "$file" datei.tmp sed -e s/"$suchtext"/"$ersatztext"/g datei.tmp > "$file" done rm datei.tmp
Man beachte das Quoten der Zeichen $ und >
Dateinamen ändern
suchtext="IMG_ " ersatztext="Bild_" for file in * ; do neu=`echo $file | sed s/"$suchtext"/"$ersatztext"/`;mv "$file" "$neu"; done
- Verzeichnisnamen rekursiv ändern
read -e -p "Suchtext: " suchText read -e -p "ersetzen durch: " ersatzText find . -type d | \ while read dir; do newDir=`echo "$dir" | sed -e s/"$suchText"/"$ersatzText"/`; if [ $dir != $newDir ] ; then mv "$dir" "$newDir" ; fi done
sort
- Passwortdatei sortieren nach UID
sort -t: -k 3n /etc/passwd
- Doppelpunkt als Trennzeichen für Spalten: Option -t
- Sortieren numerisch nach der 3. Spalte
Verbrauchten Festplattenplatz ausgeben und Liste sortieren:
# Es wird numerisch nach der 3. Spalte sortiert (0, 1, 2) repquota -a | sort -n +2
ergibt:
hs -- 654052 0 0 8068 0 0 eifr -- 710531 0 0 4710 0 0 vs -- 1721870 0 0 5303 0 0 vsdir -- 2077308 0 0 5795 0 0 root -- 10953439 0 0 3767 0 0
tr
- Dateinamen ändern mit
tr
Zum Beispiel Großbuchstaben in Kleinbuchstaben
for file in * do new=`echo $file | tr '[:upper:]' '[:lower:]'` # new=`echo $file | tr '11.3' '11.4'` echo mv $file $new done
Mit find auch rekursiv
find . -type f | while read i; do file="${i##*/}"; directory="${i%/*}"; mv "$i" "$directory"/"`echo "$file" | tr "A-Z" "a-z"`" ; done
Rechnen
- Syntax
Rechenaufgabe sind für die bash mit dem richtigen Syntax kein Problem:
echo $(( 2 * 2 )) 4
Auch mit kleineren Formeln kommt sie klar:
echo $((a=1,b=2,n=2,c=a+b,c**n)) 9
- expr
expr 13 + 37 ergebnis=`expr 13 + 37` echo $ergebnis 50