Kategori bash

TLSA record generrieren

Samstag, Dezember 6th, 2014

Zum einfach erstellen von DANE DNS Einträge habe ich mir ein Script geschrieben das, dass Zertifikat vom Server (z.b Webserver) abruft und den dazu passenden TLSA record erstellt.

#!/bin/bash
#(c) 2014  Christoph Hueffelmann (blog.chr.istoph.de)
domain=$1 
port=$2
crt=$3

if [ "$port" = "" ]; then
	echo "$0 domain.tld port [path/domain.tld.crt]"
	exit 1
fi
if [ ! -x "/usr/bin/openssl" ]; then
	echo "apt-get install openssl"
	exit 1
fi

if [ "$crt" = "" ]; then
	crt=$(mktemp)
	trap "rm -f $crt" 0 1 2 5 15
	echo QUIT | openssl s_client -servername $domain -connect $domain:$port 2>/dev/null | 
                    sed -ne '/BEGIN CERT/,/END CERT/p' > $crt
fi

#cat $crt
if [ -s $crt ]; then
	echo "_$port._tcp.$domain. IN TLSA 3 0 1 $(cat $crt | openssl x509 -outform DER | 
                                                   openssl sha256 | awk '{print $2}')"
else
	exit 1
fi

exit 0

Alles was man angeben muss ist die Domain und der Port oder optional auch den Pfad zur .crt Datei:
# ./tlsa.sh blog.chr.istoph.de 443
_443._tcp.blog.chr.istoph.de. IN TLSA 3 0 1 253ac080ec87c1a049cc5992e311d3afe39e7554b45ad754438dd7fcaeb22727

Fals man nur den SHA braucht kann man auf folgneden einzeiler verwenden:

echo QUIT | openssl s_client -connect blog.chr.istoph.de:443 | 
sed -ne '/BEGIN CERT/,/END CERT/p' | openssl x509 -outform DER | 
openssl sha256

Anmerken möchte ich natürlich das dies natürlich nicht der weg sein sollte TLSA records für Produktivbetrieb zu erstellen.

[UPDATE 28.01.15]
Das openSSL Kommando ist nun auch mittels der Option -servername SNI fähig.

mtu ermittlung

Dienstag, November 19th, 2013

Hier habe ich mir mal ein Script geschrieben das die MTU ermittelt anhand der große von ICMP Typ 8 Nachrichten.

#!/bin/bash

mtu=0
for i in {8..15}; do
	t=$(($i*100))
	ping -M do -c 1 -s $t blog.chr.istoph.de >/dev/null || continue
	mtu=$t
	echo $mtu 
done

mt=$mtu
for i in {1..10}; do
	t=$(($i*10))	
	ping -M do -c 1 -s $(($t+$mt)) blog.chr.istoph.de >/dev/null || continue
	mtu=$(($t+$mt))
	echo $mtu
done

mt=$mtu
for t in {1..10}; do
	ping -M do -c 1 -s $(($t+$mt)) blog.chr.istoph.de >/dev/null || continue
	mtu=$(($t+$mt))
	echo $mtu
done

echo "MTU: $mtu"

Server Passwort ändern und keepassx.xml erstellen

Mittwoch, Dezember 19th, 2012

Hier habe ich eine Script geschrieben um auf allen meinen Servern ein Passwort zu ändern und anschließend in einer keepassx XML Datei zu Dokumentieren. Voraussetzung hierfür ist, das neben dem Tool pwgen eine Publikkey auf den Servern ist.

Zunächst muss die Liste der Server in einer Datei angelegt werden.

#!/bin/bash
# Christoph Hueffelmann 
# v0.1 2012-12-12

export path=keepassx.xml

function sshpw () {
	server=$1
	echo $server

	#Hier wird ein Zufallspasswort erzeugt.
	PW=$(pwgen -1 12)

	#Hier wird eine SSH Verbindung auf den Server erstellt und das Passwort geändert
	#sollte dieser Vorgang schief gegen wird das PW nicht in die XML Datei geschrieben. 
	ssh $server "passwd  </dev/null > $path 
}

function dbcreate() {
	echo '

 
  Server
  30'
}

function dbentry() {
	server=$1
	PW=$2
	d=$(date "+%Y-%m-%dT%H:%M:%S")

	echo "   
   $server
   root
   $PW
   
   
   30
   $d
   $d
   $d
   Nie
  ";
}

function dbclose() {
	echo ' 
'
}

#Hier wird überprüft ob eine Liste angegeben wurde.
if [ "$1" == "" ]; then
        echo "ssh-chpw.sh server.liste"
	exit 1
else
        list=$1
fi

if [ -s "$path" ]; then
        echo "Die $path Datei Existiert bereits und sollte nicht überschreiben werden."
        exit 1
fi

if [ -x "/usr/bin/pwgen" ]; then
        echo "Das Programm pwgen ist nicht verfügbar"
        echo "  sudo apt-get install pwgen"
        exit 1
fi

#Hier werden auskommentierte Zeilen wie # entfernt
tmp=$(mktemp)
sort --random-sort $list.txt | grep -v -e "^#" -e ";" -e "^$" > $tmp

dbcreate > $path
while read server; do 
	sshpw "${server}"
done > $path

rm $tmp
exit 0

Die Liste der Server wird dann wie folgt übergeben.
# ssh-chpw.sh liste
Die durch das Script erstelle keepassx.xml kann dann in keepass importiert werden und sollte dann umgehend gelöscht werden, da die Passwörter in der XML Datei im Klartext stehen.

Mehr Infos über: KeePassX

yesterday on bash

Montag, September 3rd, 2012
date -d "-1 day"

CD tower auto copy

Sonntag, September 2nd, 2012

Heute habe ich mal meinen alten SCSI CD Tower aus der Ecke gekramt, um mein CD Sammlung auf Platte zu ziehen. Nach einer reihe Kernel Module bauen wurden mir die Laufwerke /dev/sr0 - 6 zu Verfügung gestellt. Dafür habe dann ein Bash Script geschrieben womit ich die Daten von den CDs kopieren kann und nach dem kopieren die CDs ausgeworfen werden damit weitere eingelegt werden können.

#/bin/bash 
space=/root/video

function copy () {
  m=$1
  save="$space/`ls -al $space | wc -l`"
  mkdir $save
  
  touch $m
  mount /dev/$m /mnt/$m || echo "mount error $m"
  rsync -avP /mnt/$m/ $save/ > $m
  umount /mnt/$m
  eject /dev/$m
  
  rm $m
}

while true; do
  for i in {0..6}; do
    if [ ! -f "sr$i" ]; then
      if dd if=/dev/sr$i bs=1 skip=32808 count=12 2>/dev/null ; then
        echo "sr$i"
        copy "sr$i" &
      else
        echo "no cd in sr$i"
      fi
      sleep 2
    else 
      echo -n "."
    fi
  done
  sleep 15
done

exit 0

Mit der etwas unüblichen abfrage dd if=/dev/sr$i bs=1 skip=32808 count=12 2>/dev/null ermittle ich ob eine CD eingelegt ist und bekomme in einem den CD Titel angezeigt. In der Funktion copy erstelle ich zuerst den Verzeichnis wohin die Dateien kopiert werden sollen. Mounte das CD Laufwerk und kopiere die Dateien dann mittels rsync. Zumschluss werden die CDs durch den Befehl eject /dev/srX wieder ausgeworfen.