Archiv der Kategorie: Debian

Grep grundlagen

“Global search for a regular expression and print out matched lines” – kurz ‘g/re/p’ ist das gebräuchlichste Kommando, um in Dateien nach bestimmten Mustern zu suchen. Die Grep-Familie umfasst die drei Kommandos egrep, grep und fgrep. Das erste “Extended Grep” (erweitertes grep) versteht “ein paar mehr” der Regulären Ausdrücke als “grep”. “fgrep” (Fixed Grep) hingegen unterstützt nur eine eingeschränkte Teilmenge, womit sich die Suche vor allem in größen Dateien erheblich beschleunigen lässt.

Grep arbeitet bei der Suche wesentlich effizienter als das in einem Editor geschehen würde. Per Voreinstellung schreibt das Kommando alle Zeilen der Eingabe, die das gesuchte Muster enthalten, auf die Standardausgabe. Dabei kann die Eingabe beliebig viele Dateien, als auch die Standardeingabe betreffen. Zudem liefern die Kommandos der Grep-Familie einen Rückgabewert an das Betriebssystem, was sie für die Verwendung in Shellprogrammen bevorzugt.

Der Rückgabewert von Grep

Häufig interessiert man sich nicht für den exakten Inhalt der Zeile, die das Muster enthält, sondern einzig ob das Muster überhaupt existiert. Vor allem in Shellskripten wird man die Ausgaben der Kommandos unterdrücken und anschließend anhand des Rückgabewertes den weiteren Programmablauf steuern.

Rückgabewert 0

Muster wurde gefunden:

# "root" sollte es eigentlich in jeder "passwd" geben
user@machine> grep root /etc/passwd >& /dev/null
user@machine> echo $?
0

Rückgabewert 1

Muster wurde nicht gefunden:

# "ROOT" gibt es hoffentlich nicht
user@machine> grep ROOT /etc/passwd >& /dev/null
user@machine> echo $?
1

Rückgabewert 2

Datei nicht gefunden:

# die Datei "/bla" gibt es hoffentlich nicht
user@machine> grep text /bla >& /dev/null
user@machine> echo $?
2

Wichtige Optionen von Grep

Optionen beeinflussen die Arbeitsweise aller Kommandos der Grep-Familie. Welche Optionen es gibt, beschreibt die folgende Tabelle:

-c

Anzeige der Anzahl Zeilen, in denen das Muster gefunden wurde:

user@machine> grep -c bash /etc/passwd
38

-i

Groß- und Kleinschreibung werden nicht unterschieden:

user@machine> grep -i ROot /etc/passwd
root:x:0:0:root:/root:/bin/bash

-l

Nur Anzeige der Namen der Dateien, in denen das Muster gefunden wurde:

user@machine> grep -l tcp /etc/host*
/etc/hosts.allow
/etc/hosts.deny

-n

Zeigt die Zeilennummer an, in der das Muster gefunden wurde:

user@machine> grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash

-s

Unterdrückt die Fehlerausgaben (Standardfehler); sinnvoll in Skripten.

-v

Zeigt alle Zeilen an, die das Muster nicht enthalten:

# ohne diese Option
user@machine> ps ax | grep inetd
 133 ?        S      0:00 /usr/sbin/inetd
 762 pts/2    S      0:00 grep inetd
# die Ausgabe "grep" herausfiltern
user@machine> ps ax | grep inetd | grep -v grep
 133 ?        S      0:00 /usr/sbin/inetd

-w

Das Suchmuster muss ein einzelnes Wort sein (also kein Bestandteil eines anderen Wortes).

user@machine> echo -e "Automaten\n essen\n keine Tomaten" | grep -i Tomaten
Automaten
keine Tomaten

 

user@sonne> echo -e "Automaten\n essen\n keine Tomaten" | grep -iw Tomaten
keine Tomaten

-A [Anzahl]

Zeigt “Anzahl” Zeilen an, die der Zeile mit dem Muster folgen.

user@machine> grep -A 2 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash

-B [Anzahl]

Zeigt “Anzahl” Zeilen an, die vor der Zeile mit dem Muster liegen.

 

Von Grep unterstützte Reguläre Ausdrücke

Nachfolgend sind alle Reguläre Ausdrücke aufgeführt, die die Kommandos der Grep-Familie unterstützen. Hinter jedem Muster ist angegeben, welches grep-Kommando diese Syntax beherrscht. Dabei wird nicht zwischen grep und fgrep unterschieden, da beide Kommandos dieselbe Sprache sprechen (also grep=fgrep).

   ^ (grep, egrep)

Beginn der Zeile

   $ (grep, egrep)

Ende der Zeile

   . (grep, egrep)

Genau ein beliebiges Zeichen

   * (grep, egrep)

Beliebig viele des vorangegangenen Zeichens

   [] (grep, egrep)

Ein Zeichen aus dem Bereich. Anstelle von Zeichen können vordefinierte Klassen von Zeichen verwendet werden: [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], und [:xdigit:].

   [^] (grep, egrep)

Kein Zeichen aus dem Bereich

   \< (grep)

Muster am Wortanfang suchen

   \> (grep)

Muster am Wortende suchen

   \(..\) (grep)

Eingeschlossenes Muster vormerken; auf dieses kann später über \1 zugegriffen werden. Bis zu neun Muster können auf diese Weise gespeichert werden ( ein Beispiel steht im Abschnitt Reguläre Ausdrücke).

   x\{m\} (grep)

m-faches Auftreten des Zeichens x

   x\{m,n\} (grep)

mindestens m-, maximal n-maliges Auftreten des Zeichens x

   + (egrep)

Mindestens ein Auftreten des vorangegangenen Zeichens

   ? (egrep)

Höchstens ein Auftreten des vorangegangenen Zeichens

   x|y (egrep)

Zeichen “x” oder Zeichen “y”

   (abc|xyz) (egrep)

Zeichenkette “abc” oder Zeichenkette “xyz”. Die runden Klammern können entfallen.

 

Grep – Beispiele

Einfache Beispiele zur Anwendung von grep begegneten uns schon an mehreren Stellen dieses Buches. Nun möchte ich versuchen, anhand typischer Anforderungen bei der alltäglichen Arbeit mit einem Unix-System, die Verwendung der komplexeren Mechanismen zu erläutern.

Beispiel 1

Bei der Systemadministration fragt man sich häufig, in welcher Datei eigentlich welche Shell-Variable gesetzt wird? Die globalen Vorgaben erfolgen zum Großteil in den Dateien des Verzeichnisses /etc. Also interessieren uns die Namen der Dateien, in denen z.B. die PATH-Variable modifiziert wird:

user@machine> grep -l PATH /etc/* 2>/dev/null
/etc/csh.cshrc
/etc/login.defs
/etc/manpath.config
/etc/profile
/etc/profile.rpmsave
/etc/rc.config
/etc/squid.conf

Die Umleitung der Fehlerausgabe nach /dev/null ist sinnvoll, da “grep” nicht auf Verzeichnisse anwendbar ist.

Beispiel 2

Wie viele Nutzer sind Mitglied in der default-Gruppe users (GID 100)?

user@machine> grep -c ':[0-9]\{1,\}:100:' /etc/passwd
9

Bei der Angabe des Suchmusters hilft uns die Kenntnis des Aufbaus der Datei “/etc/passwd”. Dabei steht die GruppenID immer zwischen zwei Doppelpunkten. Allerdings könnte es sein, dass auch die NutzerID (UID) 100 vergeben ist – der Ausdruck :[0-9]\{1,\}:100: garantiert, dass :100: das zweite rein numerische Feld betrifft. Das Muster \{1,\} entspricht genau dem Muster \+. Eine andere Schreibweise ist:

user@sonne> grep -c ':digit:\+:100:' /etc/passwd
9

Beispiel 3

Welche Netzwerkdienste über UDP sind auf unserem System verfügbar (Datei /etc/inetd.conf)?

 user@machine> grep '^[^#].*space:udp' /etc/inetd.conf
 time    dgram   udp     wait    root    internal
 talk    dgram   udp     wait    root    /usr/sbin/tcpd  in.talkd
 ntalk   dgram   udp     wait    root    /usr/sbin/tcpd  in.talkd
 netbios-ns      dgram   udp     wait    root    /usr/sbin/nmbd  nmbd

Jede Zeile, die mit einem # beginnt, ist ein Kommentar. Also filtern wir solche Zeilen aus (^[^#]). Das gesuchte Protokoll ist “udp”. Vor diesem Schlüsselwort können beliebig viele Zeichen (.*) gefolgt von einem Leerzeichen oder Tabulator (space:) stehen.

Beispiel 4

Je gezielter man nach Informationen fahndet, desto verwirrender wird die Angabe der Suchmusters. In zahlreichen Fällen wird die Verwendung von Pipes einleuchtender sein. Das Ergebnis aus obigen Beispiel erhält man auch mit folgender Befehlsfolge:

user@machine> grep -w udp /etc/inetd.conf | grep -v ^#
 time    dgram   udp     wait    root    internal
 talk    dgram   udp     wait    root    /usr/sbin/tcpd  in.talkd
 ntalk   dgram   udp     wait    root    /usr/sbin/tcpd  in.talkd
 netbios-ns     dgram   udp     wait    root    /usr/sbin/nmbd  nmbd

Egrep – Beispiele

Egrep ist hilfreich, wenn Sie nach Zeilen in der Eingabe suchen, die mindestens eine von mehreren Zeichenketten enthalten. So findet das folgende Beispiel alle Zeilen der Datei /etc/fstab, in denen “floppy” oder “cdrom” auftauchen:

user@machine> egrep 'floppy|cdrom' /etc/fstab
/dev/hdc    /cdrom         iso9660   ro,noauto,user,exec 0   0
/dev/fd0    /floppy        auto      noauto,user         0   0

Eine weitere interessante Anwendung ist die Suche nach “geteilten” Mustern, d.h. die bekannten Teile stehen auf einer Zeile, aber der Zwischenraum ist unbekannt. Zur Demonstration dient folgende Datei:

user@machine> cat beispiel.txt
1 ein  Zwischenraum
2 ein           Zwischenraum
3 ein    Zwischenraum
4 ein           Zwischenraum

Gesucht werden sollen alle Zeilen, die “einen Zwischenraum” enthalten; jedoch ist die Zusammensetzung des Zwischenraums nicht bekannt (und besteht teils aus Leerzeichen, teils aus Tabulatoren und teils aus beidem). Mit dem normalen grep könnte man sich mit folgendem Konstrukt behelfen:

user@machine> grep "einspace:space:*Zwischenraum" beispiel.txt
1 ein  Zwischenraum
2 ein           Zwischenraum
3 ein    Zwischenraum
4 ein           Zwischenraum

Die doppelte Anwendung des [:space:]-Musters ist für diesen Fall notwendiger Ballast, da wir ja mindestens einen Zwischenraum benötigen. Eleganter ist da die Möglichkeit von “+” in Verbindung mit egrep:

user@machine> egrep "einspace:+Zwischenraum" beispiel.txt
1 ein  Zwischenraum
2 ein           Zwischenraum
3 ein    Zwischenraum
4 ein           Zwischenraum

 

Fgrep – Beispiele

Fgrep kann immer anstelle von grep verwendet werden, falls das zu suchende Muster keine regulären Ausdrücke enthält. Alle Sonderzeichen in der Musterzeichenkette verlieren ihre Sonderbedeutung und werden als Bestandteil des Musters verstanden. Fgrep arbeitet dadurch etwas schneller als grep und ist vor allem beim Durchsuchen großer Datenmengen nützlich.

Logrotate einrichten

Die config Dateien von Logrotate finden sich unter folgenden Pfaden:

#/etc/logrotate.d/

Hier liegen die Config Dateien für die einzelnen Programme.

z.B.
httpd rpm dpkg rsyslog

”’Die Default Config”’
#/etc/logrotate.conf

# see “man logrotate” for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp — we’ll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}

”’Das Cron Script”’
#/etc/cron.daily/logrotate

<code>
#!/bin/sh

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
</code>

Der aktuelle Status der Log die mittels logrotate bearbeitet wurden
#/var/lib/logrotate/status

logrotate state — version 2
“/var/log/httpd/*log” 2010-3-1
“/var/log/ppp/connect-errors” 2010-3-1
“/var/account/pacct” 2010-3-1
“/var/log/rpmpkgs” 2010-9-12
“/var/log/samba/*.log” 2010-3-1
“/var/log/messages” 2010-9-12
“/var/log/secure” 2010-9-12
“/var/log/maillog” 2010-9-12
“/var/log/spooler” 2010-9-12
“/var/log/boot.log” 2010-9-12
“/var/log/cron” 2010-9-12
“/var/log/yum.log” 2010-3-1
“/var/log/wtmp” 2010-9-1

”’Eigenes Logrotate einrichten:”’

# vi  /etc/logrotate.d/mylogrotate

/etc/bind/bind.log {
daily
rotate 14
missingok
create 0644 named named
postrotate
/sbin/service named reload  2> /dev/null > /dev/null || true
endscript
}

”’Achtung!!!”’

Wenn ihr hier im logrotate script nicht angebt wie es rotiert werden soll werden die Default Werte aus ”’/etc/logrotate.conf”’ ausgeführt.

SMB Share mit credentials file mounten

Wenn du eine SMB Freigabe mounten willst müsstest du deine Benutzerdaten in /etc/fstab schreiben. Um die Sicherheit ein wenig zu errhöhen kann man den Benutzerteil in ein sogenanntes credentials file auslagern. Vorteil dabei ist das du das in dein Homelaufwerk legen kannst wo in der Regel nur du und root herankommen.

Unischer:

#vi /etc/fstab
#//share/dir /mnt/meinshare cifs username=username,password=passwort

Mehr Sicherheit:

#mkdir /path/sicheres_dir
#chmod 0700 /path/sicheres_dir
#vi /etc/fstab
#//share/dir /mt/meinshare cifs credentials=/path/sicheres_dir/fileshare
#vi /path/sicheres_dir/fileshare
#username=username
#password=passwort

Wie man sehen kann erhöht sich hierdurch zumindest ein wenig die Sicherheit.

Nano Editor in Zeile springen gotoline

Um mit dem nano Editor in eine bestimmte Zeile zu springen muss man folgendes tun:

STRG + Shift  +_

Es öffnet sich ein Dialog am unteren Bildschirmrand, hier gibst du die Zeilennummer ein.

Enter line number, column number:                                                                                                                                                                                                        
^G Get Help                                                                    ^Y First Line                                                                  ^T Go To Text
 ^C Cancel                                                                      ^V Last Line

Bandbreite unter Linux messen

Den Datendurchsatz auf einer Ethernet-Verbindung kann man z.B. mit iperf messen.
Für die Bandbreitenmessung mit beiden Tools muß auf dem ersten beteiligen Rechner jeweils eine Serverkomponente gestartet werden:

# iperf -s -i 1
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

Nun läuft der iperf Server auf dem Zielsystem und lauscht standardmäßig auf Port 5001.

 

Auf dem anderen Rechner wird dann ein Client gestartet, der die Messung durchführt:

# iperf -c 192.168.1.1
------------------------------------------------------------
Client connecting to 192.168.1.1, TCP port 5001
TCP window size: 49.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.1.2 port 52591 connected with 192.168.1.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  8.79 GBytes  7.55 Gbits/sec

In der Standardeinstellung überträgt iperf 10 Megabyte über TCP und misst dabei die Performance. Da wir wir dem Server die Option “-i 1″ verwendet haben, wurde dort im Interval von 1 Sekunde geloggt und wir sehen dort eine Ausgabe von:

# iperf -s -i 1
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 192.168.1.1 port 5001 connected with 192.168.1.2 port 52591
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0- 1.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  1.0- 2.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  2.0- 3.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  3.0- 4.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  4.0- 5.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  5.0- 6.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  6.0- 7.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  7.0- 8.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  8.0- 9.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  9.0-10.0 sec  0.00 Bytes  0.00 bits/sec
[  4]  0.0-10.0 sec  8.78 GBytes  7.53 Gbits/sec

Iperf bietet noch viele weitere Optionen an. So kann man das Format vom Datendurchsatz anpassen (Kbits, Mbits, KBytes, MBytes) oder den Intervall zwischen den Berichten ändern (Standard 10s). Ebenso ist eine Änderung des benutzten Ports möglich. Die Messung muss auch nicht über TCP erfolgen, sondern kann auch über UDP durchgeführt werden. Darüber hinaus gibt es noch einige weitere spezielle Optionen die man sich leicht über die manpage oder die –help Funktion betrachten kann.

Watchguard VPN mit Linux nutzen

Leider gibt es für Linux nicht wie für Windows den Watchguard SSL VPN Client. Hier muss man sich über Umwege helfen. Ein grosser Vorteil ist das auf der Watchguard Firewall ein OpenVPN Server läuft. Wer sich schon mal mit OpenVPN beschäftigt hat kennt die Logmeldungen die man auf Windows im VPN Client beim Einlogen sehen kann. Das ist im Folgenden sehr hilfreich.

WGsslclient

Watchguard

Client Paket von der Firewall herunterladen

Als erstes besorgen wir uns die Datei client.wgssl von unserer Watchguard Firebox. Diese Datei kann man einfach direkt von der Firewall herunterladen:

https://firebox:4100/?action=sslvpn_download&filename=client.wgssl&username=my_name&password=my_password

weiterlesen …

LC ALL: cannot change locale (de DE:de): Datei oder Verzeichnis nicht gefunden

Auf Debain bassierenden Systemen hilf nur der manuelle export in der jeweiligen ”’.bashrc”’ oder die nötigen Variablen in ”’/etc/default/locale”’ zu setzen.

z.B. in die bashrc von einen spezifischem User

$sudo vi ~/.bashrc

export LANG=”de_DE.UTF-8″
export LANGUAGE=’de_DE:de:en_US:en’
export LC_ALL=”

oder aber für das ganze System als root

#vi /etc/default/locale

LANG=”de_DE.UTF-8″
LANGUAGE=’de_DE:de:en_US:en’
LC_ALL=”

Die Variable LC_ALL sollte für die export Anweisung leer sein da sonst alle anderen Einstellungen von locale überschrieben werden.

Iscsi Initator

Auf dem Initiator muss das Paket open-iscsi installiert werden.

#apt-get install open-iscsi

oder

#yum install iscsi-initiator-utils.x86_64

Damit beim nächsten Startvorgang die iSCSI Geräte automatisch gestartet werden, bietet es sich an den Wert node.startup in der Datei /etc/iscsi/iscsid.conf auf automatic zusetzen. Dies sieht dann wie folgt aus.


node.startup = automatic

Anschließend kann der Dienst wie folgt neu gestartet werden:

#service open-iscsi restart

Jetzt kann mit dem Einbinden der eigentlichen iSCSI-Geräte begonnen werden. Dazu muss zunächst ein Discover durchgeführt werden. Hier für wird das Programm iscsiadm wie folgt aufgerufen und führt zu einer der hier dargestellten sehr ähnlichen Ausgabe

#iscsiadm -m discovery -t st -p 192.168.0.1

192.168.0.1:3260,1 iqn.2010-11.org.example.target:storage.example

Anschließend kann die Verbdinung mit dem Target aufgebaut werden. ”’Achtung:”’ Dies funktioniert nur, wenn vorher das Discover das  iSCSI-Gerät erkannt hat.

#iscsiadm -m node –targetname “iqn.2010-11.org.example.target:storage.example” –portal “192.168.0.1:3260″ –login

Logging in to [iface: default, target: iqn.2010-11.org.example.target:storage.example, portal: 10.0.0.1,3260]
Login to [iface: default, target: iqn.2010-11.org.example.target:storage.example, portal: 10.0.0.1,3260]: successful

Die Ausgabe kann mit ”’dmesg”’ überprüft werden.

[2939232.654767] scsi 4:0:0:0: Direct-Access     QNAP     iSCSI Storage    3.1  PQ: 0 ANSI: 5
[2939232.655415] sd 4:0:0:0: Attached scsi generic sg5 type 0
[2939232.658683] sd 6:0:0:0: [sdb] 52428800 512-byte logical blocks: (26.8 GB/25.0 GiB)
[2939232.659942] sd 6:0:0:0: [sdb] Write Protect is off
[2939232.659944] sd 6:0:0:0: [sdb] Mode Sense: 2f 00 00 00
[2939232.660309] sd 6:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn’t support DPO or FUA
[2939232.663311]  sdb: unknown partition table

Nun kann die Platte mittels der Standard Linux tools partitioniert und formatiert werden. Ein einziger Nachteil kann sein das man mittels df -h nicht sehen kann, dass das Device ein Remote device ist wie z.B ein NFS share.

You do not have permission to use at

Wenn man das ”’at”’ Kommando als nicht-root User ausführen möchte kann o.g. Fehler autreten.
Abhilfe schafft z.B. bei Debian basierenden Systemen, wenn man die Dateien ”’/etc/at.allow”’ bzw. ”’/etc/at.deny”’ händisch erzeugt.

#vi /etc/at.allow

username

Danach noch die Rechte wie folgt anpassen.

-rw-r–r– 1 root daemon   7 Apr 17 14:17 /etc/at.allow
-rw-r–r– 1 root daemon 144 Apr 17 14:17 /etc/at.deny