Home   Profil   Fun
#80 Linux  03.08.2009

Linux-Notizzettel


Hier kommen nach und nach alle Kurz-Tipps und Kommandos hin, die sonst untergehen würden. Also eine Ansammlung wahlloser Kommandos, Tricks und Anleitungen.
Und los gehts...

DVDs auf SuSE anschauen
Multipath-Topologie anzeigen
Dateisystemeigenschaften und Resizing
Alle Variablen der Systemumgebung ausgeben
Firewall für eine Ethernet-Bridge
Detaillierte Infos zu Netwerkinterfaces
Alle Emails in allen Postfix-Queues löschen
Verfügbare WLAN-Netze ermitteln
Disk-IO und andere Hardware-Parameter pro Prozess
Verschachteltes read
SSH-login mit hardcodierten Zugangdaten geht mit expect
Shell-Skript zum Versenden von Emails mit Anhang
Wenn es extrem lange dauert bis der SSH-Login-Prompt kommt
Dateiinhalt ohne Kommentarzeilen ausgeben
Versteckte Dateien rekursiv finden und in einen einzigen Ordner kopieren
RPM-Kommandos
Alle public und private Keys mit gpg löschen
Beispiel für rsync
Alle Apachemodule (auch die einkompilierten) auflisten
Gelöschte Dateien auf ext3 wiederherstellen
Epoche Time, Unix-Zeit
UDP-Port mit Bash-Skript prüfen
In der xorg.conf die Bildschirmauflösung ändern
Kopete-History in openSUSE
Mit dd am Cache vorbei direkt auf die Platte schreiben
Systemauslastung
Informationen zu eingeloggten Benutzern
Den Dateisystem-Puffer flushen
ext2/ext3-Dateisystemcheck mit Aussonderung defekter Blöcke
Memory Type Range Registers (MTRR) deaktivieren
Rückgabewert des letzten Shell-Kommandos
You have new mail in /var/mail/...
Puppet auf SLES 10 installieren
Löschen der Bash-History
Serverüberwachungstools
Syntaxtest smb.conf
Eine Textdatei mit einem bestimmten Encoding öffnen
MySQL Zeichensatz
MySQL-Replikation einrichten



DVDs auf SuSE anschauen
Um DVDs auf SuSE-Linux z.B. mit VLC anschauen zu können kann man die folgenden Schritte durchführen:
Zuerst mit Yast das Paket gcc-fortran installieren, falls es nocht nicht vorhanden ist.
Dann ein RPM-Paket für libdvdcss bauen und anschließend installieren:
cd /usr/src/packages/SOURCES
wget http://download.videolan.org/pub/libdvdcss/1.2.10/libdvdcss-1.2.10.tar.bz2
wget http://packman.links2linux.de/downloadsource/70129/libdvdcss2-1.2.10-0.pm.0.nosrc.rpm
rpmbuild --rebuild libdvdcss*.nosrc.rpm
rpm -ihv /usr/src/packages/RPMS/x86_64/libdvdcss2-1.2.10-0.pm.0.x86_64.rpm
VLC starten und genießen.


Multipath-Topology anzeigen
Durch Eingabe der folgenden Befehle lassen sich Informationen über die Multipath-Topologie und Pfade ausgeben:
multipath -ll
echo "show paths" | multipathd -k


Dateisystemeigenschaften und Resizing
Um ein ext2/3-Dateisystem zu vergrößern oder zu verkleinern muss es mit "resize_inode" gebaut worden sein. Ob das der Fall ist sieht man durch Eingabe des folgenden Kommandos:
tune2fs -l /dev/sdaX
In der Zeile "Filesystem features" muss resize_inode vorkommen.


Alle Variablen der Systemumgebung ausgeben
getconf -a


Firewall für eine Ethernet-Bridge
Mit ebtables lassen sich Filterregeln für Ethernet-Frames erstellen.


Detaillierte Informationen über Netzwerkinterfaces
Mit dem Programm ethtool lassen sich u.a. Low-level-Informationen abrufen, Statistiken ausgeben und auch Parameter setzen.


Alle Emails in allen Postfix-Queues löschen
postsuper -d ALL


Verfügbare WLAN-Netze ermitteln
iwlist scan


Disk-IO und andere Hardware-Parameter pro Prozess
Mit dem Kommando atop ist es möglich verschiedene Hardware-Parameter wie Disk-IO und Netzwerkverkehr pro Prozess und nicht nur für das gesamte System einzusehen. Dies ist eine sehr gute Möglichkeit den Ursachen für Performanceprobleme auf die Spur zu kommen. Allerdings sind dafür zwei Kernel-Patches notwendig.
atop


Verschachteltes read
Wenn in einem Bash-Skript mehrere read-Kommandos vorkommen und diese ineinander, durch Schleifen oder Unterfunktionen, verschachtelt sind, kann es passieren, dass auf die Eingabe nicht gewartet wird. Die Ursache dafür konnte ich noch nicht herausfinden, jedoch hat geholfen
read USERINPUT
mit
read USERINPUT < /dev/tty
zu ersetzen.


SSH-login mit hardcodierten Zugangdaten geht mit expect
Z.B. mit diesem Skript:
http://bash.cyberciti.biz/security/expect-ssh-login-script/
lässt es sich bewerkstelligen. Damit es funktioniert muss jedoch der Fingerprint des Servers auf dem man sich einloggen will schon abgelegt worden sein, sonst hängt es. Daher einfach einmal normal, interaktiv per ssh einloggen falls noch nicht geschehen, Fingerprint annehmen und dann geht es auch mit dem Skript.


Shell-Skript zum Versenden von Emails mit Anhang
#!/bin/bash

# zipped 2 Dateien mit Passwort und versendet die zip-Datei per Email
# braucht Perl, sendEmail (http://caspian.dotconf.net/menu/Software/SendEmail/)

SUBJECT="subject text"
BODY="body text"
SMTPSERVER=""
SMTPLOGIN=""
SMTPPASS=""
PASSWORD=""
SENDER="senderemail@domain.com"
RECIPIENT="recipient@domain.com"
TLS="yes"

FILEPATH="/opt/xyz"
ZIPPATH="/home/test"
ZIPFILE="myzipfile_`date +%d.%m.%Y_%k.%M`.zip"
FILE1="file1"
FILE2="file2"

cd $FILEPATH
zip -q -P $PASSWORD $ZIPPATH/$ZIPFILE ./$FILE1 ./$FILE2

sendEmail -f $SENDER -s ${SMTPSERVER}:25 -xu $SMTPLOGIN -xp $SMTPPASS -t $RECIPIENT \
-o tls=$TLS -u $SUBJECT -m $BODY -a $ZIPPATH/$ZIPFILE -q

#rm $ZIPPATH/$ZIPFILE


Wenn es extrem lange dauert bis der SSH-Login-Prompt kommt
Entweder in die sshd_config 'UseDNS no' eintragen oder sicherstellen, dass der Host auf den man sich einloggen möchte die IP des Hosts von wo man sich einloggt auflösen kann.


Dateiinhalt ohne Kommentarzeilen ausgeben
grep ^[^#] datei.txt


Versteckte Dateien rekursiv finden und in einen einzigen Ordner kopieren
find . -type f -name ".*" -exec cp '{}' /tmp/XYZ \;


RPM-Kommandos
Dateien eines RPM-Paketes auslesen.
mount /dev/hdc /media
rpm -qpl /media/suse/i586/pcre-devel-6.4-14.2.i586.rpm

Alle installierten Pakete auflisten.
rpm -qa

Ein Paket installieren.
rpm -ivh paket.rpm

Ein Paket deinstalieren.
rpm -e Paketname

Ein Paket updaten.
rpm -Uvh .rpm


Alle public und private Keys mit gpg löschen.
Das Skript löscht ALLE öffentlichen UND privaten Schlüssel automatisch, im Batch-Mode.
Es ist keine Benutzer-Interaktion notwendig. Danach ist alles weg!
#!/bin/bash

echo "I will erase ALL public AND secret keys! Do you really want this? (y/N)"
read confirm
if [ "$confirm" != 'y' ]
then
  exit
fi

for i in `gpg --list-public-keys | grep pub | sed 's/.*\///' | sed 's/ .*//' | sed '1d'`
do

  gpg --batch --yes --delete-secret-and-public-key $i

done

echo "These commands will be executed now."
echo "If the result is empty all secret and public keys have been deleted."
echo "gpg --list-public-keys"
echo "gpg --list-secret-keys"
gpg --list-public-keys
gpg --list-secret-keys


Ein Beispiel zum Holen von Daten von einem entfernten Server auf das lokale System. Dabei wird ein Public Key verwendet und die Verzeichnisse /home/user1 /home/user2 des Servers in das lokale Verzeichnis /home/backup/webusers gesynct. Dateien und Ordner, die auf dem Server gelöscht wurden, werden beim syncen lokal ebenfalls gelöscht. Temporäre Dateien auf dem Server (Name endet mit einer Tilde) werden nicht gesynct und bleiben unbeachtet.
rsync -agEv --delete-after -e "ssh -i /home/backup/.ssh/backup_rsa" --exclude="*~" \
root@myserver.com:'/home/user1 /home/user2'   /home/backup/webusers


Alle Apachemodule (auch die einkompilierten) auflisten.
apache2ctl -M


Gelöschte Dateien auf ext3 wiederherstellen.
ext3grep, debugfs
Wurden Dateien statt mit rm mit
shred -uz file.txt
gelöscht, kann man sie mit konventionellen Mitteln nicht mehr wiederherstellen.


Die aktuelle Zeit als UNIX-Timestamp ausgeben.
date +%s


UDP-Port mit Bash-Skript prüfen.
Erstmal direkt von der Shell:
nmap -sU -p 161 192.168.1.33

Jetzt im Bash-Skript. Zu beachten ist, dass nmap nur als root aufrufbar ist und dass unter Umständen die Firewall auf dem Zielsystem angepasst werden muss, damit nmap ein richtiges Ergebnis liefert.
#!/bin/bash
OUT=`nmap -sU -p $2 $1 | sed -n '5p' | awk '{print $2}'`

if [ "$OUT" = "open" ]
then
  echo "udpport:1"

elif [ "$OUT" = "open|filtered" ]
then
  echo "udpport:1"

else
  echo "udpport:0"
fi

Das ganze kann man dann wie folgt aufrufen:
chown root ./testport.sh
chmod u+x ./testport.sh
./testport.sh 192.168.1.33 161

Falls der Zielhost Pings blockt, mit -P0 die ping probes auslassen.
Möchte man einen TCP-Port abfragen einfach -sU weglassen:
nmap -p 80 192.168.1.33


In der xorg.conf die Bildschirmauflösung ändern.
vi /etc/X11/xorg.conf
Dort in der Screen-Section, die Sub-Section suchen, die der DefaultDepth entspricht
und dort die Auflösung ändern. Hier im Beispiel ist die DefaultDepth 24 und somit muss die letzte Subsection geändert werden.
Section "Screen"
        Identifier      "Default Screen"
        Device          "ATI Technologies Inc RV350 [Mobility Radeon 9600 M10]"
        Monitor         "Generic Monitor"
        DefaultDepth    24
        SubSection "Display"
                Depth           1
                Modes           "1400x1050"
        EndSubSection
        SubSection "Display"
                Depth           4
                Modes           "1400x1050"
        EndSubSection
        SubSection "Display"
                Depth           8
                Modes           "1400x1050"
        EndSubSection
        SubSection "Display"
                Depth           15
                Modes           "1400x1050"
        EndSubSection
        SubSection "Display"
                Depth           16
                Modes           "1400x1050"
        EndSubSection
        SubSection "Display"
                Depth           24
                Modes           "1024x768"
        EndSubSection
EndSection

Dann einfach mit Strg-Alt-Backspace den X-Server neustarten.


Bei Kopete in openSUSE die History aktivieren:
Kopete starten, dann im Hauptfenster in das Menü "Einstellungen" gehen, dann "Einrichten" auswählen, links auf "Module" klicken und das Modul "Verlauf" konfigurieren und aktivieren.
Die eigentlichen History-Dateien liegen in
~/.kde4/share/apps/kopete/logs/ICQProtocol/[MYICQNR]/*


Mit dd eine 100MB-Datei am Cache(RAM) vorbei direkt auf die Platte (bzw. den Platten-Cache) schreiben.
Dies kann man z.b. verwenden, um die IO-Performance einer Festplatte oder eines Plattensystems wie RAID zu messen.
dd if=/dev/zero of=/home/test/filexyz bs=10M count=10 oflag=direct


Die Systemauslastung anschauen, hinsichtlich CPU, Disk-IO und Speicher.
Die Disk-IO erscheint im Bereich -----io----, bi bedeutet Blocks gelesen, bo bedeutet Blocks geschrieben.
top
vmstat 1
watch 'free -m'


Detaillierte Informationen zu den letzten eingeloggten Benutzern.
last -aFx
grep "sshd" /var/log/messages


Den Dateisystem-Puffer flushen. Mit anderen Worten alles was noch auf die Platte geschrieben werden soll wirklich physikalisch schreiben.
sync


Einen ext2/ext3-Dateisystemcheck ausführen und zusätzlich mit Hilfe eines zerstörungsfreien Schreib/Lese-Tests defekte Blöcke aussondern, sodass sie nicht mehr verwendet werden. Das Kommando dauert leider sehr lange (Tage).
e2fsck -ccfv /dev/sdaX


Falls man in dmesg die unten aufgeführten Fehler findet, kann man die Benutzung der Memory Type Range Registers (MTRR) deaktivieren. Die MTRRs betreffen normalerweise nur grafische Umgebungen wo man hohe Performance benötigt, wie X und 3D zum Beispiel.
mtrr: type mismatch for c8000000,1000000 old: write-back new: write-combining
mtrr: no MTRR for c8000000,1000000 found
Es gibt mehrere Wege sie abzuschalten:
1. in grub "video=nomtrr" zur Kernel-Zeile hinzufügen
2. in /etc/X11/xorg.conf die Zeile "Option "NoMTRR" zur screen section hinzufügen.:
Section "Screen"
   ...
   Option "NoMTRR"
EndSection
3. oder einfach den default runlevel auf 3 setzen sofern man keine Desktopumgebung benötigt, dann init 3 ausführen.


Den Rückgabewert des letzten Shell-Kommandos/Programms abfragen. Ein Beispiel mit Hilfe eines Skriptes.
Das Skript erstellen:
vi test.sh
#!/bin/bash
exit 9
Ausführbar machen:
chmod +x ./test.sh
Ausführen:
./test.sh
Rückgabewert abfragen:
echo $?
9


Emails aus dem lokalen Postfach über die Shell lesen ("You have new mail in /var/mail/...").
mailx


Puppet auf SLES 10 installieren.
(Ruby ist im SLES-SDK-Paket enthalten)
wget http://demeter.uni-regensburg.de/SLES10-SDK-x86/suse/i586/ruby-1.8.4-17.2.i586.rpm
rpm -i ruby-1.8.4-17.2.i586.rpm

wget http://download.opensuse.org/repositories/system:/management/SLE_10/i586/facter-1.5.4-1.1.i586.rpm
rpm -i facter-1.5.4-1.1.i586.rpm

wget http://download.opensuse.org/repositories/system:/management/SLE_10/i586/puppet-0.24.8-1.1.i586.rpm
rpm -i puppet-0.24.8-1.1.i586.rpm

wget http://download.opensuse.org/repositories/system:/management/SLE_10/i586/puppet-server-0.24.8-1.1.i586.rpm
rpm -i puppet-server-0.24.8-1.1.i586.rpm

Ansonsten alles wie in der offiziellen
openSUSE-Anleitung.

Wenn die Verbindung zum Puppet-Master nicht hergestellt werden kann, als erstes nach den Firewalls schauen und sicherstellen, dass der Hostname "puppet" auf dem client in die IP des Puppet-Masters aufgelöst werden kann.


Löschen der Bash-History
history -c


Gute Serverüberwachungstools, die trotzdem nur einen geringen Administrationsaufwand haben, bzw. wozu relativ wenig Know-How erforderlich ist:
Mit Logwatch kann man sich z.B. täglich eine Statusemail senden lassen, die einen Überblick über viele Bereiche des Systems bietet: Welche URLs mit Fehler 404 aufgerufen wurden, wer zuletzt mit SSH eingeloggt war, verfügbarer Plattenplatz, Zustand der Netzwerkinterfaces, usw.
logwatch
Mit Rootkit Hunter wird nicht nur auf Rootkits geprüft, sondern viel mehr, wie z.B. verdächtige Dateien und Dateiattribute, Netzwerkinterfaces im Promiscuous-Mode, SSH-Konfiguration, usw.
Rootkit Hunter


Syntaxprüfung der Konfigurationsdatei von Samba.
testparm /etc/smb.conf


Eine Textdatei mit einem bestimmten Encoding öffnen.
kwrite --encoding iso-8859-1 testiso.txt &
kwrite --encoding utf-8 testutf8.txt &
kwrite bietet auch beim Speichern die Auswahl zwischen einer Vielzahl von Kodierungen an.


Um in der MySQL-Shell Daten anzusehen oder zu bearbeiten muss man mysql mit dem Zeichensatz aufrufen, mit dem die Tabelle(n), die man bearbeiten möchte angelegt wurden.
Welcher das ist erfährt man durch das Kommando "show create table Tabellenname".
# mysql -uroot -p --default-character-set=UTF8
# mysql -uroot -p --default-character-set=latin1


MySQL-Replikation einrichten

Einen Benutzer auf dem Replikationsmaster anlegen, der dann vom Replikationsslave benutzt wird.
master: mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'passwordxyz';

Die aktuelle Bin-Logdatei und die aktuelle Position des Masters anzeigen.
master: mysql> FLUSH TABLES WITH READ LOCK;
master: mysql> SHOW MASTER STATUS;
(Diese MySQL-Session offenlassen bis zum UNLOCK TABLES, siehe weiter unten, sonst verliert man das Lock!)

Ein aktuelles Dump der Datenbank(en) erstellen.
# mysqldump -uroot -p --lock-all-tables databasename > ./dump.db
oder
# mysqldump -uroot -p --lock-all-tables --all-databases > ./dump.db

master: mysql> UNLOCK TABLES;

Dem Slave die notwendigen Daten mitgeben, damit er sich mit dem Master zum Replizieren verbinden kann, genauen Dateinamen und die Position beachten (entsprechend show master status).
slave: mysql> CHANGE MASTER TO MASTER_HOST='hostnameofmaster', MASTER_USER='repl',
           -> MASTER_PASSWORD='passwordxyz', MASTER_LOG_FILE='mysql-bin.000074', MASTER_LOG_POS=14238;
slave: mysql> START SLAVE;
slave: mysql> SHOW SLAVE STATUS \G
Entscheidend ist dass folgende Parameter auf Yes stehen:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Die Datenbank(en) müssen auf dem Slave angelegt sein bevor man dort das Dump importiert:
slave: mysql> CREATE DATABASE databasename;
# mysql -uroot -p databasename < ./dbdump.db
oder
# mysql -uroot -p < ./dbdump.db