Mit vi ganze Textblöcke bearbeiten

Immer wieder steht man vor dem Problem mit dem VI schnell mal einen ganzen Codeblock auskommentieren zu müssen. Mit dem Blockmodus von VI geht das auch ganz einfach:

In die Anfangszeile wechseln und CTRL+V drücken, dies aktiviert den Blockmodus (im Status erscheint: – VISUAL BLOCK –)

Jetzt den Cursor bis zur gewünschten Zeile nach unten (Cursortaste oder j) verschieben, der Block dazwischen wird dadurch ausgewählt

Mit shift+i (großes I) in den Eingabemodus wechseln und das gewünschte Kommentarzeichen (#, // ) eingeben.

Mit ESC zurück in den Befehlsmodus, VI hat jetzt an den Anfang jeder Zeile das gewünschte Zeichen eingefügt.

Sollen die Zeilen wieder einkommentiert werden muss der Block zuerst wie vorher wieder markiert werden. Bei mehr als einem Zeichen werden die weiteren mit der Cursortaste oder l markiert. Zum löschen x drücken.

Dies funktioniert übrigens auch mit Einrückungen.

Suchen und Ersetzen in Variablen

In einem anderen KB-Eintrag ging es um das suchen & ersetzen von strings in Dateien. Dies geht jedoch auch in Variablen:

Will man Beispielsweise in der folgenden variable:

VAR1=“Ich fahre Velo“

Den Text „Velo“ mit „Auto“ ersetzen geht dies wie folgt:

VAR2=${VAR1//Velo/Auto}

Quellen

unix.com: search & replace in variable

Suchen und Ersetzen in mehreren Dateien

Manchmal will man in mehreren Datei ein „Suchen & Ersetzten machen.
Dies geht mit folgendem sed Konstrukt ganz einfach:

sed -e 's/search/replace/g' -i *.txt

Die Option bedeuten:
-e Führe den folgenden code (expression) aus
-i editiere das file

[stextbox id=“tip“ caption=“Tip: Ersetzten von Strings mit slash (/)“]Falls man einen String mit slash (z.B. einen Pfad) ersetzten will, kann man % als alternatives Trennungszeichen verwenden. Z.B.

sed -e 's%/alter/pfad%/neuer/pfad%g' -i *.txt

[/stextbox]

Will man in einem Verzeichnis und allen Unterverzeichnissen in allen Dateien einen String ersetzen, so kann man noch find miteinbeziehen:

find ./ -type f -exec sed -i 's/search/replace/g' {} \;

Quelle: http://www.liamdelahunty.com/tips/linux_search_and_replace_multiple_files.php

DSH auf CentOS installieren

[http://www.netfort.gr.jp/~dancer/software/dsh.html.en|DSH] (Dancer’s shell) ist ein exzellenter weg um Shell Kommandos auf verschiedenen Linux-Systemen gleichzeitig abzusetzen.
Bevor es jedoch los geht braucht es unter CentOS ein wenig "Handarbeit".

Zuerst muss man compiler, make, usw. installieren, dann erst [http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.9.tar.gz|libdshconfig] kompilieren und dann [http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.25.9.tar.gz|dsh] selbst.

Zum Schluss muss man noch einen neuen library pfad hinzufügen:

yum install gcc make cpp gcc-c++ wget
 
wget <a href="http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.9.tar.gz" target="blank">http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.9.tar.gz</a>
wget <a href="http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.25.9.tar.gz" target="blank">http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.25.9.tar.gz</a>
 
tar -xvzf libdshconfig-0.20.9.tar.gz
cd libdshconfig-0.20.9
./configure
make install
 
tar -xvzf dsh-0.25.9.tar.gz
cd ../dsh-0.25.9/
./configure
make install
 
echo "/usr/local/lib/" >> /etc/ld.so.conf.d/dsh.conf
ldconfig -v |grep dsh

stdout und stderr gleichzeitig umleiten

Häufig möchte man bei Script- oder Programm Ausgaben, diese komplett, also stdout und stder in ein file oder /dev/null Umleiten.

Dazu existieren häufig falsche annahmen, wie z.B. script.sh 2>&1 /dev/null, was falsch ist.

Richtigerweise muss man zuerst die Ausgabe Umleiten und dann stderr auf stdout schreiben lassen, was mit dem & in der Form: 2>&1 geht.

Praktisch sieht das dann so aus:

script.sh > /dev/null 2>&1

Es gibt aber sogar noch einen eleganteren Weg mit &> um stdout und stderr gleichzeitig umzuleiten:

script.sh &> combined.log

Linux Distribution herausfinden

Oftmals möchte man rausfinden was für eine Linux Distribution (Debian sarge/etch, RedHat 3/4, SuSE, usw.) man am laufen hat.

ede Linux Distribution hat andere release Dateien unter /etc/ gespeichert. Diese Dateien sind oft wie folgt benannt "DISTRIBUTION-release".

Diese Dateien beinhalten Informationen über die Distribution und die Version. Bei manchen Distributionen auch Infos über "Codenames".

Da jede Linux Distribution anders ist, gibt es keinen sicheren Weg diese Distributions Informationen auszulesen. Wer also ein Programm schreibt, egal ob Batch-Skript oder PHP-Skript, kann Informationen wie die Linux-Distribution oft gut gebrauchen (Spezielle Pfade, Konfigurationswerkzeuge wie z.B. Yast [SuSE], Update Check, etc).

Um diese Informationen zuverlässig auszulesen gibt es leider nur einen manuellen Weg. Man muss jede mögliche release-Datei anfragen und wenn eine Datei einen Inhalt hat, diese auslesen.

Liste der Distributionen:

Annvix: /etc/annvix-release
Arch Linux: /etc/arch-release
Arklinux: /etc/arklinux-release
Aurox Linux: /etc/aurox-release
BlackCat: /etc/blackcat-release
Cobalt: /etc/cobalt-release
Conectiva: /etc/conectiva-release
Debian: /etc/debian_version, /etc/debian_release (rare)
Fedora Core: /etc/fedora-release
Gentoo Linux: /etc/gentoo-release
Immunix: /etc/immunix-release
Knoppix: knoppix_version
Linux-From-Scratch: /etc/lfs-release
Linux-PPC: /etc/linuxppc-release
Mandrake: /etc/mandrake-release
Mandriva/Mandrake Linux: /etc/mandriva-release, /etc/mandrake-release, /etc/mandakelinux-release
MkLinux: /etc/mklinux-release
Novell Linux Desktop: /etc/nld-release
PLD Linux: /etc/pld-release
Red Hat: /etc/redhat-release, /etc/redhat_version (rare)
Slackware: /etc/slackware-version, /etc/slackware-release (rare)
SME Server (Formerly E-Smith): /etc/e-smith-release
Solaris SPARC: /etc/release
Sun JDS: /etc/sun-release
SUSE Linux: /etc/SuSE-release, /etc/novell-release
SUSE Linux ES9: /etc/sles-release
Tiny Sofa: /etc/tinysofa-release
TurboLinux: /etc/turbolinux-release
Ubuntu Linux: /etc/lsb-release
UltraPenguin: /etc/ultrapenguin-release
UnitedLinux: /etc/UnitedLinux-release (covers SUSE SLES8)
VA-Linux/RH-VALE: /etc/va-release
Yellow Dog: /etc/yellowdog-release

LVM: Vergrössern / Verkleinern von volumes

Vergrössern

Das Vergrössern eines Volumes geht relativ einfach mit:

lvextend -L+1G /dev/volumegroup/logicalvolume
resize2fs /dev/volumegroup/logicalvolume

[stextbox id=“tip“ caption=“Tipp: lvextend Parameter -r“]
Mittels dem Paramater -r wird das filesystem nach dem vergrössern des Volumes automatisch angepasst!
So kann man anstelle der zwei obigen Zeilen auch einfach:

lvextend -r -L+1G /dev/volumegroup/logicalvolume

eingeben.
[/stextbox]

Verkleinern

Das Verkleinern ist etwas komplizierter und ein Fehler könnte das ganze LV korrupt (unbrauchbar) machen.

Hier eine Beschreibung wies trotzdem glatt läuft:
Folgendes muss hierbei beachtet werden:

  • Partition muss unmounted sein
  • Das filesystem darf AUF KEINEN FALL grösser sein, als das logical volume nach der Verkleinerung (Tipp: Das FS etwas kleiner machen als das LV nachher wird)

Abfolge:

#Prüfen wie viel Platz das Filesystem braucht:
df -h /home
#Filesystem            Size  Used Avail Use% Mounted on
#/dev/mapper/rootvg-home_lv
#                       25G   18G  5.9G  75% /home
 
 
#Partition unmounten:
umount -f /home/
 
#Filesystem check machen (zwingend)
e2fsck -f /dev/rootvg/home_lv
 
#Filesystem verkleinern; wir wollen das LV auf 20GB verkleinern, deshalb machen wir das filesystem nur 19GB gross:
resize2fs /dev/rootvg/home_lv 19G
 
#Das LV wird dann auf 20GB resized (etwas grösser als filesystem)
lvresize -L 20G  /dev/rootvg/home_lv
 
#Mit "resize2fs" kann man dann das filesystem wieder auf die Grösse des LVs erweitern
resize2fs /dev/rootvg/home_lv
 
#Und wieder mounten:
mount /home

Wenn es sich bei der Partition zufällig um eine system Partition wie z.B.: /, /usr/, /var handelt, die sich nicht im laufenden Betrieb mounten lässt, so muss das System mit einer Linux Boot-CD gestartet werden.

Wichtige Unix Befehle

[[Befehl] &
Man kann die Konsole weiter benutzen z.B.
firefox &

[[Befehl] && [[Befehl]
Befehle werden nacheinander ausgefürt z.B.
firefox && shutdown -h now

man [[Programm]
Zeigt die Hilfe zu einem Programm an man iptables

CTRL + C
Bricht aktuellen Vorgang in der Shell ab strg + C

VERZEICHNISSE UND DATEIEN

cd [[Verzeichnis]
Wechselt in ein Verzeichnis z.B.
cd /tmp
cd .. (Wechselt ein Verzeichnis höher)/td>
cd / (Wechselt ins Wurzelverzeichnis)
cd – (Wechselt in das vorherige Verzeichnis)

cp [[Datei][[Verz]
Kopiert Datei in Verzeichnis z.B.
cp 123.txt /tmp

mv
Verschiebt eine Datei z.B.
mv 123.txt /tmp

mv [[Datei1][[Datei2] benennt Datei [[DATEI1] in [[DATEI2] um z.B.
mv 123.txt 456.txt

rm [[-r|f]
Löscht eine Datei (-r =rekursiv; -f =unterdrückt warnmeldungen -ACHTUNG: löscht alles im Verzeichnis ohne Nachfrage!) z.B.
rm /tmp/123.txt
rm /tmp/*
rm -rf /tmp/

mkdir [[Verzeichnis]
Erzeugt ein Verzeichnis z.B.
mkdir /home/test

rmdir [[Verzeichnis]
Löscht ein Verzeichnis z.B.
rmdir /home/test

ln [[-s] /pfad/datei /phadLink/dateiLink
Erzeugt einen Link zu Pfad/Datei (-s =symbolischer link ’symlink‘)

ls [[-l|a|h]
Zeigt Ordner-Inhalt an (-l =ausführich; -a =alle Dateien, auch versteckte anzeigen; -la =alle Dateien in der ausführlichen Listenansicht anzeigen; -h =Dateigrössen in KB/MB/GB/… anzeigen z.B.
ls /home/test
ls -l /home/test
ls -la /home/test

alias ls=’ls –color‘
Stellt farbige Ansicht ein z.B.
alias ls=’ls –color‘

pwd
Zeigt das aktuelle arbeitsVerzeichnis an

cat [[Datei]
Zeigt Inhalt einer Datei

more [[Datei]
Zeigt Inhalt einer Datei seitenweise an

touch [[Datei]
Erzeugt leere Datei z.B.
touch 123.txt

whereis [[Prog]
Sucht nach einem Programm z.B.
whereis samba

find . | grep [[DATEI]
sucht eine Datei im Verzeichnis z.B.
find . | grep 123.txt

grep [[KEY] [[DATEI]
Sucht nach Begriff in einer Datei z.B.
grep Haus 123.txt

locate [[DATEI]
Sucht nach Datei in der Datenbank z.B.
locate 123.txt

updatedb
Aktualisiert den Such Datenbank Index (sollte man immer vor dem befehl "locate" ausführen)

which
Zeigt an, wo sich ein Programm befindet z.B.
which apache

SYSTEM

arch Prozessorfamilie arch

cat /proc/filesystems
Unterstützte Dateisysteme cat /proc/filesystems

cat /proc/cpuinfo
Infos zur CPU cat /proc/cpuinfo

cat /proc/filesystems
Alle unterstützten Dateisysteme cat /proc/filesystems

cat /proc/pci
Infos zu den PCI-Karten cat /proc/pci

dmesg | grep hd
Infos über alle Laufwerke dmesg | grep hd

date
Datum und Zeit

dmesg
Kernellogger: Zeigt Kernelaktivtäten

free
Zeigt Ausnutzung des Arbeitsspeichers

glxgears Kleiner Grafiktest zur Performance der VGA

glxinfo
Angaben über OpenGL und Grafikkarte glxinfo

kill [[PID] Schiesst Prozess mit bestimmter ID ab z.B.
kill 1067

killall [[Prog]
Schiesst alle Prozesse mit Prozessname "Prog" ab z.B.
killall inetd

lspci
Infos über PCI-Komponenten

shutdown [[-h|-r] [[now]
Fährt den Rechner herunter (-h) , oder startet ihn neu (-r) (now=sofort; alternativ kann hier auch eine zeit angegeben werden) z.B.
shutdown -r now

top
Zeigt Programme und CPU-Auslastung an

uptime
Wie lange ist der PC im Betrieb?

X -version
Zeigt Version von Xfree an

FESTPLATTE

df [[-h]
Speicherplatz anzeigen (-h = Anagaben in KB/MB/GB/…)

fdisk Festplatte partitionieren fdisk /dev/hda

mkfs.ext[[2|3]
HDD mit ext2|3 formatieren z.B.
mkfs.ext3 /dev/hda1

mkreiserfs
HDD mit reiserfs formatieren z.B.
mkreiserfs /dev/hda1

sync
gepufferte Daten auf HDD speichern

MOUNTEN

mount
Hängt Datenträger in das System ein z.B.
mount /dev/hda1 /mnt/win
mount -t [[Filesystem] Mountet mit vorgegebenen Dateisystem mount -t ntfs /mnt/win_xp
mount -a Mountet alle Datenträger aus der /etc/fstab mount -a
mount -r Von Datenträger kann nur gelesen werden mount -r /mnt/win
mount -w Datenträger kann gelesen und beschrieben werden mount -w /mnt/win
mount -m Mountet ohne Eintrag in /etc/mtab mount -n /mnt/win

BENUTZER

id
Zeigt Benutzername und Gruppe an

whoami
Zeigt aktuell angemeldeten Benutzer an

who
Wer ist alles eingeloggt?

groupadd [[Gruppe]
Erzeugt eine neue Gruppe

groupdel [[Gruppe]
Löscht eine neue Gruppe groupdel

useradd -m [[USER]
Erzeugt Benutzers und Homeverz.

userdel -r [[USER]
Löscht Benutzers (und Homeverz; -r)

passwd [[USER]
Ändert Passwort des Benutzers

su [[user]
Wechselt den aktuellen Benutzer z.B.
su (Man arbeitet nun als Root an der Konsole)
su [[USER] Man arbeitet nun als [[USER] an der Konsole

NETZWERK

ifconfig Zeigt Netzwerk-Infos an z.B.
ifconfig (zeigt alle Netzwerkverbindungen an)
ifconfig eth0 (zeigt Infos zur Netzwerkkarte ‚eth0‘ an)

iwconfig Zeigt Infos zum WLAN an

ping [[Rechner]
Testet Verbindung zu einem Rechner z.B.
ping 192.168.0.1

KERNEL UND MODULE

lsmod Zeigt geladene Module an

make menuconfig
Einrichten des Kernels z.B.
cd /usr/src/linux;
make menuconfig

modprobe [[Modul]
Lädt ein Modul z.B.
modprobe printer

uname -a
Zeigt Kernel-Version an

SONSTIGES

ps aux
Zeigt alle laufenden Prozesse und Dienste an

rc-update show
Zeigt die Dienste an, die beim Start geladen werden

ls -s /pfad/zur/echten/datei /gelinkter/symbolischer/pfad
Erzeugt einen Symbolischen Link

(E)SMTP-Dialog (Mail schreiben über SMTP)

Diese Referenz soll dazu dienen, um sich mit einem SMTP-Server zu verständigen, etwa wenn man mal ein mail über telnet schicken will… 😉

Nach dem verbinden mit telnet mail.example.org 25, meldet sich der SMTP-Dämon mit einer Statuszeile:

220 Welcome blabla...

Alle Meldungen beginnen mit einer dreistelligen Zahl, deren erste Ziffer angibt, ob die Aktion erfolgreich war oder nicht. 2 steht für Erfolg.
Jetzt identifiziert sich der Sender mit HELO (SMTP) oder EHLO (ESMTP):

EHLO <hostname>

Nun antwortet der Server:

2xx OK

xx steht dabei für zwei Ziffern.

Ab hier muss man sich mittlerweile bei den meisten Mailservern Authentifizieren, dass die Mail angenommen wird:

AUTH LOGIN

Der Server erwartet nun Benutzername und Passwort, jeweils BASE64 Codiert (base64 Encoder)

334 USER <Base64_codierter_Benutzername>
334 PASS <Base64_codiertes_Passwort>

Nach erfolgreichem authentifizieren bestätigt der Server dies:

235 OK

Der Sender übergibt die Envelope-Adresse des Absenders:

MAIL FROM: <user@example.org>

Der Server bestätigt dies mit:

2xx OK

Jetzt werden die Envelope-Adressen der Adressaten übergeben:

RCPT TO: <user@example.net>

Der Server bestätigt dies wieder mit:

2xx OK

Dies wiederholt sich für alle Adressaten. Nun kann die Mail selber verschickt werden:

DATA
From: user@example.org
To: user@example.net
hallo
.

Eine Zeile mit einem einzelnen Punkt beendet die Mail (ist aber selbst nicht Teil der Nachricht). Der Server antwortet:

2xx Message accepted for delivery.

Nun kann eine weitere Mail durch Angabe der Envelope-Adressen verschikt werden, oder aber die Verbindung wird beendet durch:

QUIT

und der Server antwortet etwa:

221 blabla closing connection.

Bei diesem einfachen SMTP-Dialog ist insbesondere zu beachten, daß ausschließlich druckbare ASCII-Zeichen (also auch keine Umlaute) übertragen werden können. Dies ist erst möglich im erweiterten ESMTP; dort muß zwar der ESMTP-Dialog selbst ebenso wie die Header der Mail aus druckbaren ASCII-Zeichen bestehen, allerdings darf der Text der Mail beliebige Zeichen enthalten.
ESMTP wird statt mit HELO mit EHLO eingeleitet, darauf antwortet der Dämon mit einer Liste der zusätzlich verstandenen Kommandos/Features:

220 mail.Uni-Mainz.DE ESMTP Sendmail 8.8.4/8.8.4; Mon, 13 Jan 1997 15:03:46 +0100 (MET)
ehlo roquefort.zdv.uni-mainz.de
250-mail.Uni-Mainz.DE Hello roquefort.zdv.Uni-Mainz.DE [134.93.8.119], pleased to meet you
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-ETRN
250-XUSR
250 HELP

Versteht der Server nur SMTP, so antwortet er einer Fehlermeldung, worauf der Sender nun doch ein HELO schickt:

220 vm.gmd.de running IBM VM SMTP V2R2 on Mon, 13 Jan 97 15:04:47 +0100
ehlo roquefort.zdv.uni-mainz.de
500 Unknown command, 'ehlo'
helo roquefort.zdv.uni-mainz.de
250 vm.gmd.de is my domain name.

Sieve

Mit dem addon sieve können Serverseitige Mail filter erstellt werden.
Muss man mal den sieve Server testen, so geht dies natürlich auch via telnet:

AUTHENTICATE "PLAIN" "<base64-encoded credentials>"
OK "Logged in."
LISTSCRIPTS
"managesieve" ACTIVE
OK "Listscripts completed."
GETSCRIPT "managesieve"
{6}
keep;
OK "Getscript completed."

Verbinden mit SSL/STARTTLS

Wenn SSL ins Spiel kommt (was heutzutage eigentlich immer der Fall ist 😉 ), wird es schwieriger, da sich die clients in diesem Falle ja verschlüsselt unterhalten und kaum jemand diese „Sprache“ beherrschen wird. 😀

Glücklicherweise gibt es dafür im openssl Programm eine Option, welche die Verschlüsselung transparent macht:

openssl s_client -starttls smtp -connect mail.example.org:587 -crlf -ign_eof

Zwischen -starttls und -connect wird das Protokoll angegeben.
openssl unterstützt derzeit die Protokolle „smtp“, „pop3“, „imap“, „ftp“, „xmpp“, „xmpp-server“, „irc“, „postgres“, „lmtp“, „nntp“, „sieve“ und „ldap“

Weitere Informationen