Kategorien
Linux

paste – merge lines of files

paste – merge lines of files

paste <(seq 1 5) <(seq 11 15) <(seq 21 25)

Ausgabe:

1       11      21
2       12      22
3       13      23
4       14      24
5       15      25

Paste fügt die 3 Angegebenen Daten Zeilenweise zusammen. In der Ersten Datei stehen 1, 2, 3, 4 und 5 untereinander, in der Zweiten Date 11, 12, 13, 14 und 15 sowie in der dritten Datei 21, 22, 23, 24 und 25.

Paste fügt diese Zeilen mit leerzeichen getrennt in je Eine Zeile. Die ersten werte der 3 Dateien, 1 aus der ersten Datei, 11 aus der zweiten Datei und 21 aus der dritten Datei werden in die erste zeile der Ausgabe geschrieben.

Optionen

Mit der Option -s lassen sich die Ausgaben von paste Serialisieren:

paste -s <(seq 1 5) <(seq 11 15) <(seq 21 25)

Ausgabe:

1       2       3       4       5
11      12      13      14      15
21      22      23      24      25

Mit der Option -d können abweichende Trennzeichen festgelegt werden:

paste -d '-' <(seq 1 5) <(seq 11 15) <(seq 21 25)

Ausgabe:

1-11-21
2-12-22
3-13-23
4-14-24
5-15-25

zurück zum Hauptartikel

Kategorien
Linux

Shell tools zur Textbearbeitung…

Auf der Unix Shell kann man wundervolle dinge mit Texten anstellen, nur wie lauten die Wichtigsten Befehle?

Wenn man nicht tagtäglich mit dieses Befehlen umgeht ist das suchen mühsam. Aus desem Grund, an dieser Stelle eine Aufzählung der Wichtigsten Linux Text Tools.
Ich werden nach und nach für einige dieser Werkzeuge, wenn ich sie grade benötige oder mir wichtige Anwendungsfälle begegnen je einen Artikel zu den Befehlen Schreiben.

Wenn es noch keine Anleitung gibt hilft der Shell Befehl man und wenn dies nicht reicht eine Suche auf Google 😉

Meine Unix / Linux Befehl-Gedankenstütze:

  • cat
    • erstelt, fügt zusammen, gibt aus
  • tac
    • gibt in umgekehrter reihenfolge aus (cat rückwerts)
  • head
    • gibt die ersten Zeilen aus
  • tail
    • gibt die letzten Zeilen aus
  • cut
    • schneidet Spalten aus (Datenfelder, Bytes…)
  • awk
    • gibt teile von Zeilen in einer Festgelegten reihenfolge aus, und vieles mehr…
  • grep
    • durchsucht Pipes und Dateien
  • less
    • zeigt an
  • wc
    • zählt Buchstaben, Wörter, Zeilen…
  • nl
    • Zeilennummerierung
  • sort
    • sortiert die Zeilen einer Datei
  • uniq
    • entfernt doppelte Einträge
  • tr
    • suchen und ersetzen
  • od
    • Text nach Octal converter
  • recode
    • Zeichensatz-Konverter
  • expand
    • wandelt Leerzeichen in Tabulatoren
  • unexpand
    • wandelt Tabulatoren in Leerzeichen
  • paste
    • kombiniert Texte Zeilenweise
  • join
    • fügt Datei zusammen
  • split
    • teilt Dateien auf
  • csplit
    • teilt Text Dateien an vorgegebenen Stellen in neue Dateien auf
  • fold
    • fügt Zeilenumbrüche ein
  • diff
    • vergleicht Dateien zeilenweise
Kategorien
Forensik Linux

Wo finde ich die Dateien der MySQL Datenbank?

Um das Datenverzeichnis einer MySQL Datenbank zu finden kann in der my.cnf Daten nachgesehen werden.

Die Datei my.cnf ist häufig im Verzeichnis /etc oder /etc/mysql zu finden. In der Datei befindet sich eine Zeile „datadir = [Verzeichnis]“, dieses [Verzeichnis] ist der Ort an dem Auf der Festplatte des Servers die Daten der MySQL Datenbank liegen.

Die folgende Zeile gibt das Verzeichnis direkt aus.:

find /etc -name my.cnf 2>/dev/null -exec cat {} \;|\
grep datadir|cut -d= -f2-

Erklärung der Zeile:

  •  find
    • sucht nach Dateien im Verzeichnis /etc mit dem Namen my.cnf
  • cat
    • gibt den Inhalt der gefundenen Datei aus
  • grep
    • gibt nur die Zeile die datadir enthält aus
  • cut
    • gibt alles nach dem Gleichheitszeichen aus
Kategorien
Linux

Karte aus Google Maps Tiles erstellen…

Um für mich darzustellen wo ich schon überall war wollte ich mir schon immer eine riesige Landkarte drucken lassen. Da ich nicht herausfinden konnte wo ich eine entsprechende Druckvorlage herbekommen kann und die Google Maps Karte sehr schön gestalltet ist suchte ich einen Weg die Karte herunterzuladen.

Die Karte selbst besteht aus  16384 Kacheln die je 512 * 512 Pixel groß sind.
(8388608 Pixel breit und genauso hoch, das sind 70 Terapixel)

1.) Verzeichnisse Anlegen

tiles=$(mktemp -d)
mkdir -p $tiles/0x0
mkdir $tiles/1x0
mkdir $tiles/1x1
mkdir $tiles/0x1

2.) Kacheln herunterladen

cd $tiles/0x0
curl -O -k "https://mt0.google.com/vt?lyrs=p&scale=2&z=7&hl=loc&y=[0000-0063]&x=[0000-0063]"

Die Variable lyrs gibt die Art der Kacheln an,  „s“ für Satellitenbild, „y“ für Satellit mit Städtenamen, „p“ ist die alte Standardansicht von Google Maps. (Weiterhin gibt es noch r, t, h)
Bei der gewählten URL, ist die Reihenfolge der x und y Variable wichtig, zuerst das y, damit montage von Imagemagic die Kacheln richtig anordnet.
Nachdem download via curl müssen in jedem Verzeichnis genau 4096 Kacheln liegen.

cd $tiles/0x1
curl -O -k "https://mt0.google.com/vt?lyrs=p&scale=2&z=7&hl=loc&y=[0000-0063]&x=[0064-0127]"
cd $tiles/1x0
curl -O -k "https://mt0.google.com/vt?lyrs=p&scale=2&z=7&hl=loc&y=[0064-0127]&x=[0000-0063]"
cd $tiles/1x1
curl -O -k "https://mt0.google.com/vt?lyrs=p&scale=2&z=7&hl=loc&y=[0064-0127]&x=[0064-0127]"

3.) Kacheln mit ImageMagick zusammenfügen

montage $tiles/0x0/* -tile 64x64 -geometry +0+0 $tiles/0x0.png
montage $tiles/0x1/* -tile 64x64 -geometry +0+0 $tiles/0x1.png
montage $tiles/1x0/* -tile 64x64 -geometry +0+0 $tiles/1x0.png
montage $tiles/1x1/* -tile 64x64 -geometry +0+0 $tiles/1x1.png

montage $tiles/*.png -tile 2x2 -geometry +0+0 ~/weltkarte.png
cd ~
rm -r $tiles

Mit der Option tile werden bei montage die Kachelanordnungen, 64 Zeilen und 64 Reihen, übergeben. Die Option -geometry +0+0 gibt an, das keine Abstände zwichen den Kacheln eingefügt werden sollen.

Die entstehende weltkarte.png ist ca. 1,1GB groß.

Update:
Dank Don (Siehe Kommentare) am 2017-01-21 korrigiert
Die Option -k erlaubt unsichere SSL-Verbindungen… was eigentlich keine Einschränkung sein darf, aber offensichtlich zum Ziel, einer ganzen Weltkarte, führt…

Kategorien
Linux Windows

Für jede Datei Namens…

Um wiederholt gleiche Befehle für mehrere Dateien auszuführen kann das folgende Snippet verwendet werden.

Unter Windows

FOR %A IN ("D*.avi") DO mkvmerge.exe -o "%~nA.mkv" "%A"
  • %A ist die verwendete Variable, sie nimmt Nacheinander den Dateinamen der gefundenen Dateien an.
  • „D*.avi“ ist der Suchausdruck, welcher auf alle zu verwendenden Dateien, und nur auf diese, zutreffen muss (Fängt mit einem Großen „D“ an, dann kommen beliebig viele beliebige Zeichen, Der Dateiname endet mit der Zeichenfolge „.avi“)
  • nach dem „DO“ folgt der wiederholt auszuführende Befehl, hier mkvmerge
  • der Ausgabename der Datei (-o) ist gleich dem der Eingabedatei (%A), die Dateiendung wird weggelassen und „.mkv“ wird dem Dateinamen angehängt
  • Die Anführungsstriche ermöglichen Leerzeichen in den Dateinamen, ohne würden die Leerzeichen als nächster Befehl gedeutet.

Linux

find . -iname "D*.avi" | while read A; do
 B=$(/usr/bin/basename "$A" .avi);
 mkvmerge -o "$B".mkv "$A";
done
  • Zeile1
    • Schleifenanfang mit „find“ zur Aufzählung aller Dateinamen die mit einem „D“ beginnen dem beliebig viele beliebige Zeichen folgen und mit „.avi“ enden.
    • „-iname“ Groß/Kleinschreibung wird beim Vergleich berücksichtigt, alternativ „-name“ wenn dies nicht gewünscht ist
  • Zeile2
    • Der Dateiname sind um die Dateierweiterung „.avi“ gekürzt
  • Zeile3
    • mkvmerge ausführen, Ausgabe-Dateiname ist der Name der Eingabedatei mit der Dateierweiterung „.mkv“
  • Zeile4
    • Ende der Schleife
Kategorien
Grafik Video

x264 encode

1.) mit dem Videolan Client (VLC) die Ränder suchen.

Im Video Lan Client kann mit Hilfe des Videoeffekts Beschneiden die genaue Pixelzahl der Ränder festgestellt werden.
Werkzeuge => Effekte und Filter => Videoeffekte => Beschneiden

Video Beschnelden im VLC Videolan Client

Um die Schwarzen Bildränder zu schneiden lautet die Crop Angabe:
–video-filter crop:[links],[oben],[rechts],[unten]

2.) Binary von x264 herunterladen:
http://download.videolan.org/pub/videolan/x264/binaries/

3.) Video umwandeln:
a) ohne beschnitt:
[x264] --level 4.1 --crf 21 --profile high --preset slower --tune film --no-interlaced -o [Ausgabe].mkv [Eingabe]

b) mit Beschnitt:
[x264] --level 4.1 --crf 21 --profile high --preset slower --tune film --no-interlaced --video-filter crop:[links],[oben],[rechts],[unten] -o [Ausgabe].mkv [Eingabe]

Parameter
[x264] – Pfad und Dateiname des x264 encoders
[links] – Abzuschneidender Bildbereich auf der linken Seite in Pixeln
[oben] – Abzuschneidender Bildbereich auf der oberen Seite in Pixeln
[rechts] – Abzuschneidender Bildbereich auf der rechten Seite in Pixeln
[unten] – Abzuschneidender Bildbereich auf der unteren Seite in Pixeln
[Ausgabe] – Name (und Pfad) der zu schreibenden Datei
[Eingabe] – Name (und Pfad) der neu zu kodierenden Datei

Kategorien
Linux Raspberry Pi Spiele

Raspberry Pi verstummen lassen

Beim Bootvorgang gibt Raspian für den Raspberry Pi, Linuxtypisch, die Bootmeldungen auf dem Bildschirm aus. Dieses Verhalten ist für mit dem Pi umgesetzte „Spielkonsolen“ oder „Automaten“, Videoplayer und ähnliches nicht unbedingt wünschenswert.

Dies kann jedoch mit hilfe der folgenden drei Ergänzungen der /boot/cmdline.txt Datei angepasst werden.

  • Die Bootmeldungen auf der dritte Konsole ausgeben, ersetze „console=tty1“ durch „console=tty3
  • Alle nicht Kritischen „kernel log messages“ verbergen in dem „loglevel=3“ in cmdline.txt
  • Um den Cursor während des Bootvorgangs zu verbergen kann noch „vt.global_cursor_default=0“ der cmdline.txt angefügt werden.

meine /boot/cmdline.txt sieht mit diesen Ergänzungen so aus.:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty3 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait vt.global_cursor_default=0 logo.nologo loglevel=3 quite

Zusätzlich kann auch der „rainbow splash“ am anfang des Boot-Prozesses ausgeblendet werden. Zu diesem Zweck muss in der Datei /boot/confi.txt der Wert „disable_splash=1“ angefügt werden.

Kategorien
CL-35B2 Forensik Linux security Workstation

Linux: eine einfache und „schöne“ Festplattenfüllanzeige

Ich stelle euch hier mein Script zur Festplattenfüllanzeige meiner Server zur verfügung, da viele meiner Freunde das Script von mir wünschten.

Ich habe das script auf meinen Server in der .bashrc Datei hinterlegt und es zeigt nach dem Login auf den Server, auch via SSH, werden die Fülldaten aller eingebundenen Datenträger angezeigt.

Die Ausgabe des Scriptes enspricht diesem Bild

Die Farben der Rahmen wird bei einer Belegung von 80% nicht mehr grün sondern gelb und ab sowie ab 90% Festplattenfülle in Rot dargestellt.

Die Breite der Darstellung passt sich beim Aufruf automatisch der im Terminalfenster verfügbaren Breite des Fensters an.

Auf meinem CL-25B2 NAS habe dieses Script, anstelle der .bashrc Datei in der Datei /etc/profile.local hinterlegt, so das die Festplattenfüllanzeige bei jedem Login angezeigt wird, nicht nur bei einem bestimmten Benutzer.

Für Verbesserungsvorschläge bin ich immer Dankbar, diese bitte in die Kommentare 😉

#!/bin/bash

# Ausgabe eines Statusbalkens
statusbalken() {
 if [ $# != 1 ]
  then
   exit;
 fi

 used=$(df "$1"|tail -n 1|awk '{print $3}')
 total=$(df "$1"|tail -n 1|awk '{print $2}')

 e=$(printf "\033")
 end="$e[0m"
 COLUMNS=$(tput cols)
 COLUMNS=$((COLUMNS-9))

 PERCENT=$(echo "$used $total 100"|awk '{printf ("%i", $1/$2*$3 )}')
 percent=$(echo "$used $total $COLUMNS"|awk '{printf ("%i", $1/$2*$3 )}')

 COLOR="$e[1;31m"
 if [[ $PERCENT -lt 90 ]] ;then
  COLOR="$e[1;33m"
 fi
 if [[ $PERCENT -lt 80 ]] ;then
  COLOR="$e[1;32m"
 fi

 printf " Disk usage: %s\n ${COLOR}[${end}" "$1"
 for (( i=0; i< percent; i++ ))
 do
  printf "%b" "#"
 done

 for (( i=percent; i<COLUMNS; i++ ))
 do
  printf "%b" "-"
 done
 printf "${COLOR}]${end}%3d%%\n" "$PERCENT"
}

# Laufwerke ermitteln
drives=$(mount|grep -E '^\/'|awk '{print $3}')

for var in $drives
do
 statusbalken "$var"
done

Da im WordPress die Formatierung von Shellscripten immer ungewünscht „angepasst“ wird, zusätzlich hier noch ein Download-Link für das Script.: http://dl.loteks.de/drives.sh

Kategorien
CL-35B2 Linux

howto – Shellshock auf der NAS

Leider ist auch die Bash-Shell der NAS CL-35B2 vom shellshock betroffen.

Hier meine Anleitung, wie die Bash auf der NAS durch eine neue, selbst compilierte ersetzt werden kann

1.) Bash auf Shelshock Verwundbarkeit testen

curl -k https://shellshocker.net/shellshock_test.sh 2> /dev/null| bash 2> /dev/null

Sollte bei einem der Tests die Meldung „VULNERABLE“ erscheinen, sollte die „Bash“ mit dieser Anleitung aktualisiert werden.
Sollten alle Tests „not vulnerable“ ausgeben ist diese Anleitung nicht interessant für Sie.
Ein Mirror des Scriptes ist unter der URL http://dl.loteks.de/shellshock_test.sh zu finden.

1.) Build Umgebung erstellen

Leider enthält die NAS CL-35B2 keine installierte Build-Umgebung. Von den 195MB Speicherplatz sind nur noch ca 40 frei, der Speicherplatz auf der NAS ist einfach zu klein um GCC und make zu installieren.

Ich habe einen USB stick angeschlossen, der sich als /dev/sdc meldet. (herauszufinden via dmesg)
via cfdisk habe ich auf diesem USB Stick zwei Partitionen angelegt, zuerst eine ein Gigabyte Swap Partition und im Anschluss den Rest als Linux Partition.

Im Anschluss den swap Speicher Partitionieren und aktivieren:

mkswap /dev/sdc1
swapon /dev/sdc1

Das Dateisystem auf /dev/sdc2 erstellen und Das Laufwerk Mounten:

mkfs.ext2 /dev/sdc2
mount /dev/sdc2 /mnt

Anschließend die RPM Pakete der Verwendeten Linux Distribution herunterladen. Bei der Fantec CL-35B2 ist es leider noch Fedora ARM 12, welches ein wenig betagt ist. Ich habe unter http://dl.loteks.de/fedora12arm_rpms.tar.gz (größe 119 MB) ein Paket mit den, für das Compilieren der Bash notwendigen rpm-Paketen abgelegt.

mkdir -pv /mnt/{chroot,rpm}
cd /mnt/
wget http://dl.loteks.de/fedora12arm_rpms.tar.gz
tar xzf fedora12arm_rpms.tar.gz
rpm --install --nodeps --root=/mnt/chroot/ rpm/*.rpm

Nach dieser, sehr sehr lange dauernden Installation (dies dauert auf der NAS mehrere Stunden!) befindet sich die chroot umgebung im Order /mnt/chroot

2.) Bash Quellen bereitstellen

Jetzt brauchen wir die Bash Quellen und Patches in der chroot-Ubgebung:

mkdir -pv /mnt/chroot/usr/src/bash
cd /mnt/chroot/usr/src/bash
wget ftp://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
tar xzf bash-4.3.tar.gz
wget ftp://ftp.gnu.org/gnu/bash/bash-4.3-patches/ -m -nd
chroot /mnt/chroot/
cd /usr/src/bash/bash-4.3 
for file in ../bash43-0[0-9][0-9] ; do patch -p0 < $file; done

Ab diesem Punkt liegen die Quellen der Bash gepatched im Verzeichnis /mnt/chroot/usr/src/bash-4.3. Das herunter geladene sstrip.c brauchen wir am ende um die Datei „bash“ auf ein der NAS angepasste Größe zu kürzen.
Jetzt können je nach Wunsch beliebige Compiler Flags gesetzt werden und die Configurationsoptionen gesetzt werden.

CHOST="armv6j-hardfloat-linux-gnueabi"
CFLAGS="-Os -march=armv6j -mcpu=arm1136jf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
./configure --with-installed-readline
make
strip bash
exit

mit dem „strip bash“ werden alle, für die Ausführung der bash, nicht benötigten teile der elf-Datei entfernt. Die Datei wird von fast 1,5 MB auf unter 840KB reduziert.

3. bash Installieren

cp /mnt/chroot/usr/src/bash/bash-4.3/bash /bin/bash1
/bin/bash1
cp /bin/bash /bin/bash_
cp /bin/bash1 /bin/bash
exit
rm /bin/bash1 /bin/bash_
curl -k https://shellshocker.net/shellshock_test.sh 2> /dev/null| bash 2> /dev/null

CVE-2014-6271 (original shellshock): not vulnerable
CVE-2014-6278 (Florian’s patch): not vulnerable
CVE-2014-7169 (taviso bug): not vulnerable
CVE-2014-//// (exploit 3 on https://shellshocker.net/ ): not vulnerable
CVE-2014-7186 (redir_stack bug): not vulnerable
CVE-2014-7187 (nested loops off by one): not vulnerable

Die Anleitung wurde vom mir zuletzt am 05.10.2014 getestet.
Sollten Irrtümer, Fehler oder Verbesserungen zum Artikel auffallen bitte ich dies mir mit einem Kommentar zu melden.

Besser wäre ein rpm-Paket, ich hoffe die Anleitung demnächst bezüglich rpm-Paket bau erweitern zu können.


Das aus diesem Tutorial entstehende Bash-Binary und RPM-Datei aus dem RPM-Tutorial zur Installation

Kategorien
Forensik Linux security

Festplatten Seriennummern unter Linux herausfinden

Um im PC-oder NAS Gehäuse immer gleich die richtige Festplatte zum Tauschen zu finden, muss im ID bzw. die Seriennummer der Festplatte herausgefunden werden.

Da leider nicht jedes NAS auf der Shell auch alle Befehle erlaubt Beziehungsweise alle Befehle anbietet, hier eine Liste mit 4 Methoden die Seriennummer von Festplatten unter Linux auszulesen.:

udebadm

udevadm info --query=property --name=/dev/sda | grep "^ID_SERIAL_SHORT=" | sed "s/ID_SERIAL_SHORT=//g"

Unter „–name=/dev/“ wird das Laufwerk angegeben, die Ausgabe ist nur die Seriennummer.

hdparm

hdparm -i /dev/sda | sed -ne '/SerialNo/{s/.*SerialNo=\s*\(.*\)/\1/ ; p}'

Die Festplatte wurd als „-i /dev/sda“ angegeben, alternativ können hier mehrere Festplatten mit „-i /dev/sd[ab]“ angegeben werde. Die Ausgabe ist ausschließlich die Seriennummer.

smartctl

smartctl -i /dev/sda|sed -ne '/Serial\ Number\:/{s/.*Serial\ Number\:\s*\(.*\)/\1/ ; p}'

Auch bei smartctl wird mit „-i /dev/sda“ die fragliche Festplatte angegeben. Die Ausgabe ist ausschließlich die Seriennummer.

 grep, awk, sed

ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print $NF " " $(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'

gibt alle Festplatten mit den zugehörigen Seriennummern und Bezeichnung aus.