Linux Befehle: Unterschied zwischen den Versionen

Aus Mediawiki Ferdinand Gruber
Zur Navigation springen Zur Suche springen
Zeile 4: Zeile 4:
 
[[Datenträger und Dateisystem]]
 
[[Datenträger und Dateisystem]]
  
= Dateiverwaltung =
+
[[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
 
[http://pmhahn.de/linux/permission/index.html Hervorragende Einführung]
 
Hier werden auch die Sonderrechte SUID, SGID erklärt.
 
 
 
[http://www.linux-user.de/ausgabe/2003/12/066-acl/index.html 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 <code>/etc/init.d/boot.local</code> eintragen, dann werden die Grundeinstellungen beim Systemstart gesetzt.
 
 
 
Anscheinend muss diese Einstellung für jeden Benutzer extra gesetzt werden. Also eintragen in <code>~/.bashrc</code> und <code>~/.profile</code>
 
  
 
= ImageMagick =
 
= ImageMagick =

Version vom 19. November 2021, 19:10 Uhr

Kontrollstrukturen

Datenträger und Dateisystem

Dateiverwaltung

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