Yum Version Lock
Manchmal kommt es vor dass man verhindern will das automatisch Pakete upgedatet werden.
zB macht es manchmal Sinn das automatische Update des check-mk-agent auf Centos 7 zu verhindern wenn man das epel Repository eingebunden hat.
Dies erreicht man einfach mit dem YUM Plugin versionlock
yum install yum-plugin-versionlock
yum versionlock check-mk-agent
Das kann man dann noch relativ einfach nachprüfen indem man in das lockfile schaut.
cat /etc/yum/pluginconf.d/versionlock.list
# Added locks on Fri Feb 10 13:50:57 2017
0:check-mk-agent-1.2.6p12-1.*
Danach macht ein yum update kein automatisches Update des check-mk-agent mehr.
Verzeichnisdatum korrigieren
Oft ist es sinnvoll, wenn in Linux Datum/Uhrzeit eines Verzeichnisses mit dem des neuesten Files in diesem Verzeichnis übereinstimmt.
Lösen kann man dies am elegantesten mit der zsh (Z-Shell). Man geht in das Verzeichnis, das aktualisiert werden soll und tippt (in der zsh) folgendes ein:
touch -r *(Dom[1]) .
Wenn alle Unterverzeichnisse rekursiv ebenfalls angepasst werden sollen:
for d (**/*(D/)) touch -r $d/*(D.om[1]) -- $d
Dies muss händisch durchgeführt werden. Soll das immer automatisch gehen, könnte man eine Lösung mit incron basteln. Dies sei dem geneigten Leser als Übung überlassen...
Routing mit openconnect-VPN
Unter Linux gibt es openconnect, mit dem z. B. zu einem Cisco AnyConnect-VPN verbunden werden kann. Das Problem ist, dass die gesamte Routingtable verändert wird, und man nur mehr in das VPN kommt. Ein Zugriff auf das "normale" Internet ist nicht mehr möglich.
Abhilfe schafft ein kleines Script, das für die VPN-Verbindung einen eigenen Networknamespace generiert:
#!/bin/bash
IP=`hostname -I | cut -d' ' -f1`
ip netns add myvpn
ip link add veth0 type veth peer name veth1
ip link set veth1 netns myvpn
ip netns exec myvpn ifconfig veth1 192.168.99.1/24 up
ifconfig veth0 192.168.99.2/24 up
ip netns exec myvpn route add default gw 192.168.99.2
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.99.0/24 -j SNAT --to-source $IP
ip netns exec myvpn openconnect -b --no-cert-check -u myvpnuser --passwd-on-stdin https://123.123.123.123 < pw.txt
ip netns exec myvpn sudo -u myunixuser /bin/bash
killall openconnect
iptables -t nat -D POSTROUTING -o eth0 -s 192.168.99.0/24 -j SNAT --to-source $IP
ifconfig veth0 down
ip netns exec myvpn ifconfig veth1 down
ip link delete veth0
ip netns delete myvpn
123.123.123.123 ist dabei die Adresse des VPN-Servers
myvpnuser der Username für das VPN
myunixuser der Username im lokalen Linux-System, mit dem gearbeitet werden soll
Das Skript muss als root aufgerufen werden.
In der Datei pw.txt muss das VPN-Passwort stehen. Alternativ kann man es jedesmal eingeben, wenn man --passwd-on-stdin weglässt.
Nach Aufruf des Skriptes startet eine bash-Shell, in der das VPN aktiv ist. Außerhalb dieser Shell ist das VPN nicht erreichbar, dafür ist das Routing dort unverändert. Es kann also ganz normal auf das Internet zugegriffen werden. Braucht man eine zweite VPN-Shell, ruft man diese Zeile einfach in einer weiteren Shell auf:
ip netns exec myvpn /bin/bash
Jede dieser VPN-Shells kann mit exit beendet werden. Die erste Shell (die vom Skript geöffnet wurde) sollte als letztes beendet werden.
Openstack: Resize und Migration
Soll eine Instanz auf einen anderen Host wandern, müssen die beiden Hosts aufeinander per SSH zugreifen können. Beim Resize wird die VM in geänderte Größe auf einen anderen Host migriert. Um diesen SSH-Zugriff zu ermöglichen, müssen die public keys der anderen Hosts in der authorized_keys eines jeden Hosts sein.
Um das bei einer größeren Zahl von Hosts nicht unüberschaubar werden zu lassen, empfiehlt es sich, für alle Compute-Hosts den selben Schlüssel zu verwenden. Jeder hat also den selben public und private key und ersteren auch in der authorized_hosts.
# usermod -s /bin/bash nova
# su - nova
# mkdir -p -m 700 .ssh
# cat > config <<EOF
Host *
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
EOF
# ssh-keygen -f id_rsa -b 1024 -P ""
# cp /var/lib/nova/.ssh/id_rsa.pub /var/lib/nova/.ssh/authorized_keys
Die Dateien config,id_rsa, id_rsa.pub und authorized_keys dann auf alle compute hosts verteilen!
Netzwerk trace nach prozess id
wenn man zB ein bestimmtes Email netzwerkseitig debuggen möchte, ist es auf einem Mailserver mit sehr viel Traffic oft sehr schwierig da das abhören des Port 25 sehr viel anderen Traffic der nicht relevant ist ebenfalls aufzeichnet.
Besser ist es da, den Netzwerktraffic des expliziten Prozesses mitzuschneiden. Der Output ist leider kein pcap kompatibles Format, aber für den kurzen Check reicht es allemal.
Hier wurde zB.: nachgesehen welche Spamlists der sendmail verwendet und ob diese auch schnell antworten. Hinter dass -p gehört dann natürlich die entsprechende Prozess-ID
strace -p 3636 -f -e trace=network -s 10000
send(8, "\331\314\1\0\0\1\0\0\0\0\0\0\3icb\2at\0\0\1\0\1"..., 24, MSG_NOSIGNAL) = 24
recvfrom(8, "\331\314\205\200\0\1\0\1\0\2\0\2\3icb\2at\0\0\1\0\1\300\f\0\1\0\1\0\1Q\200\0\4\303\346\250X\300\ f\0\2\0\1\0\1Q\200\0\21\7goliath\3icb\2co\300\20\300\f\0\2\0\1\0\1Q\200\0\7\4puck\300socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 8
connect(8, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("195.230.xx.xx")}, 28) = 0
send(8, "jB\1\0\0\1\0\0\0\0\0\0\00231\003160\003230\003195\2ix\5dnsbl\6manitu\3net\0\0\1\0\1"..., 52, MSG_NOS IGNAL) = 52
recvfrom(8, "jB\201\203\0\1\0\0\0\1\0\0\00231\003160\003230\003195\2ix\5dnsbl\6manitu\3net\0\0\1\0\1\300\33\0 \6\0\1\0\0\0connect(8, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("195.230.xx.xx")}, 28) = 0
send(8, "\377\375\1\0\0\1\0\0\0\0\0\0\00231\003160\003230\003195\3zen\10spamhaus\3org\0\0\1\0\1"..., 49, MSG_ NOSIGNAL) = 49
recvfrom(8, "\377\375\201\203\0\1\0\0\0\1\0\0\00231\003160\003230\003195\3zen\10spamhaus\3org\0\0\1\0\1\300\3 3\0\6\0\1\0\0\0\226\0004\4need\2to\4know\4only\0\nhostmaster\300\37S\243M\204\0\0\16\20\0\0\2X\0\6\227\200\0\ 0\0\226"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("195.230.xx.xx")}, [16]) = 113
Textdatei ohne Kommentare ausgeben
Manchmal ist es sinnvoll zB eine Konfigurationsdatei ohne Kommentare und Leerzeilen anzusehen. Bei den sehr großen Konfiguration von zB der apache httpd.conf oder der freeradius radiusd.conf fällt es im Normalzustand oft schwer Konfigurationen von zwei Servern zu vergleichen oder sogar automatisch mit diff zu vergleichen.
Ein bisschen egrep und grep helfen uns dabei wirklich nur die Zeilen auszugeben die wirkliche Konfiguration beinhalten.
Ausganskonfiguration:
# Multi-language error messages
#Include /etc/httpd/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
#Include /etc/httpd/extra/httpd-autoindex.conf
# Language settings
#Include /etc/httpd/extra/httpd-languages.conf
# User home directories
#Include /etc/httpd/extra/httpd-userdir.conf
# Real-time info on requests and configuration
Include /etc/httpd/extra/httpd-info.conf
# Virtual hosts
#Include /etc/httpd/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include /etc/httpd/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include /etc/httpd/extra/httpd-dav.conf
# Various default settings
#Include /etc/httpd/extra/httpd-default.conf
# Configure mod_proxy_html to understand HTML4/XHTML1
# Secure (SSL/TLS) connections
#Include /etc/httpd/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
SSLRandomSeed connect builtin
# Deal with user agents that deliberately violate open standards
Suexec On
Include /etc/httpd/extra/httpd-fcgid.conf
Include /etc/httpd/extra/httpd-mod_security.conf
Nun können mit einem einfach cat und grep die unnötigen Kommentare und Leerzeilen eliminiert werden.
cat /etc/httpd/httpd.conf | egrep -v "^[^a-z0-9]*#" | grep -v "^$"
Include /etc/httpd/extra/proxy-html.conf
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
BrowserMatch "MSIE 10.0;" bad_DNT
RequestHeader unset DNT env=bad_DNT
Suexec On
Include /etc/httpd/extra/httpd-fcgid.conf
Include /etc/httpd/extra/httpd-mod_security.conf
Diese "stilisierte Config" kann zB mittels diff von 2 Servern analysiert werden um Unterschiede schnell aufzuzeigen.
Virtueller Linux Maschine eine Festplatte hinzufügen
Hier kurz ein paar Tips wie man einer virtuellen Linux Maschine eine neue Festplatte hinzufügt.
- fügt ihr die Festplatte in eurer Virtualisierungsplattform euer Wahl der virtuellen Maschine hinzu
- muss man nun einen rescan des scsi Bus initaliesieren damit die neue Platte erkannt wird. Ansonsten müsste man die Maschine neu starten, was man natürlich gerne vermeiden will
echo "- - -" > /sys/class/scsi_host/host#/scan
danach kann man mittels
fdisk -l
nachsehen ob die neue Festplatte erkannt wurde. Nachdem die Festplatte nun vom System erkannt wird, kann Sie ganz normal mittels fdisk, cfdisk, etc. partitioniert werden. Zb eine große Partition vom Typ Linux.
fdisk /dev/sdb
Nach dem partitionieren muss man die neue Partition nur noch formatieren und mounten.
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /mnt
Und schon können wir auf die neue Disk zugreifen. Virtuelle Disken eignen sich übrigens auch hervorragend als "USB-Stick Ersatz" beim kopieren von Daten zwischen virtuellen Maschinen ohne Netzwerkverbindung!
UTF8-Probleme in mysql-Datenbanken
Beim Import einer Datenbank, die auf einem anderen Server exportiert wurde kann es zu Problemen mit den UTF8-Zeichen kommen.
Besonders ärgerlich ist, wenn die einzelnen Bytes eines UTF8-Zeichens fälschlicherweise beim Export selbst in UTF8 konvertiert wurden. Dann hat man Quargel wie ü statt den Umlauten dort stehen. Da nutzen auch keine Tools wie iconv mehr etwas, weil der Text eigentlich schon in perfektem UTF8 vorliegt. Nur halt mit kryptischen Zeichen statt Umlauten.
Da hilft ein kleines Skript, das das Tool "sed", das auf jedem Linuxsystem vorinstalliert sein sollte, verwendet:
#!/bin/bash
sed -i 's/Ä/Ä/g' $1
sed -i 's/ä/ä/g' $1
sed -i 's/Ö/Ö/g' $1
sed -i 's/ö/ö/g' $1
sed -i 's/Ãœ/Ü/g' $1
sed -i 's/ü/ü/g' $1
sed -i 's/ß/ß/g' $1
Aufgerufen mit
./scriptname dateiname
kann das mit mysqldump exportierte File korrigiert und mit dem mysql-Befehl wieder importiert werden. Wahlweise können auch andere Sonderzeichen-Ersetzungen im Skript hinzugefügt werden.
Kommandozeilen-Tricks für JPG-Bilder
Es muss nicht immer ein Bildbearbeitungsprogramm wie Gimp oder Photoshop geladen werden, um kleine Änderungen an JPG-Bilder durchzuführen. Vor allem bei großen Bildbeständen ist die Kommandozeile viel schneller und effizienter.
Hier ein paar Kommandos unter Linux. Das Paket imagemagick muss installiert sein - es ist bei allen gängigen Distributionen über die Paketverwaltung installierbar.
JPG in PDF konvertieren:
convert -page a4 *.jpg ausgang.pdf
Dies erstellt ein PDF mit allen jpg-Bildern im aktuellen Verzeichnis und speichert es unter ausgang.jpg ab
JPG-Bilder automatisch rotieren:
jhead -autorot *.JPG
Wenn die Kamera die Richtungsinformationen abgespeichert hat, dreht dieses Kommando alle Bilder in die richtige Lage.
Zeit in JPG umstellen:
jhead -ta+1:00 *.JPG
Dieses Kommando fügt zur Uhrzeit, die in einem JPG gespeichert ist, eine Stunde hinzu. Sehr praktisch, wenn man auf der Kamera die Sommerzeitumstellung vergessen hat!
Postfix Mails aus der queue löschen
Wenn man beim postfix gezielt Mails aus der queue löschen möchte kann man das mit diesem Befehl tun, wobei searchstring durch den string ersetzt werden sollte nachdem man suchen möchte. zB yahoo.com, etc.
find /var/spool/postfix/deferred/ -type f -exec grep -l 'searchstring' '{}' \; | xargs -n1 basename | xargs -n1 postsuper -d