Linux Befehle: Unterschied zwischen den Versionen

Aus Mediawiki Ferdinand Gruber
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
= Kontrollstrukturen =
+
 
== Datei zeilenweise einlesen und verarbeiten ==
+
[[Kontrollstrukturen]]
Die Datei html.txt wird zeilenweise eingelesen. Die Zeilenumbrüche werden entfernt wegen '''wget.'''
 
while read line ; do line=$(echo $line | tr -d '\r'); wget $line ; done < html.txt
 
 
[[Datenträger und Dateisystem]]
 
[[Datenträger und Dateisystem]]
  

Version vom 19. November 2021, 19:06 Uhr

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

  • 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 

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