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
Allgemein

SMTP via Telnet

Ein Beispiel für die manuelle EMail-Zustellung via Telnet:

~$ telnet mx.example.com 25
Trying 198.51.100.215…
Connected to mx.example.com.
Escape character is ‚^]‘.
220 mx.angststalt.de ESMTP Postfix (Debian/GNU)

Die Verbindung zum Server mx.example.com wird über port 25 Hergestellt

EHLO domain.tld
250-mx.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

„Helo“ mit dem Eigenen Hostnamen um die Verbindung aufzunehmen

MAIL FROM: <test@domain.tld>
250 2.1.0 Ok

Absenderangabe der EMail.

RCPT TO: <zieladresse@dieseserver.tld>
250 2.1.5 Ok

 

Empfänger der EMail angeben.

DATA
354 End data with <CR><LF>.<CR><LF>

Hier beginnt die EMail…

Subject:Hey, hier eine EMail für dich

Angabe des Betreffs der EMail

Ich habe hier eine EMail für dich,
in dieser EMail steht eine ganze Menge Text…

An dieser Stelle folgt der Inhalt der EMail…

.
250 2.0.0 Ok: queued as 112AE1B1

Mit einem Punkt wird die EMail beendet.

QUIT
221 2.0.0 Bye
Connection closed by foreign host.

und mit dem Befehl „Quit“ wird die Verbindung beendet.

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
Allgemein

shellshock II (RPM-Paket erstellen)

In der chroot-Umgebung aus der ersten Anleitung kann auch direkt ein rpm Paket erstellen, welches eine saubere Installation der aktualisierten Bash ermöglicht.

Die Anleitung beginnt an Punkt 2 (2. Bash Quellen bereitstellen) der ersten Anleitung!

In der chroot-Umgebung des Build Systems einen Benutzer für den Paketbau anlegen:

chroot /mnt/chroot
adduser builder  && su builder && cd ~

Im Anschluß werden die für rpmbuild notwendigen Verzeichnisse, die drei Bash Konfigurations-Dateien .bashrc, .bash_profile, .bash_logout und die Specs-Datei für den rpm-Paketbau angelegt und die Bash Quellcodes sowie Patches heruntergeaden.:

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
cd ~/rpmbuild/SOURCES/
wget ftp://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
wget ftp://ftp.gnu.org/gnu/bash/bash-4.3-patches/ -m -nd
cat <<'EOF' > dot-bash_logout
# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi
EOF
cat <<'EOF' > dot-bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
EOF
cat <<'EOF' > dot-bashrc
# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=10000
HISTFILESIZE=20000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi

if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'

alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands. Use like so:
# sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi

export LANG=de_DE.utf8
export LC_CTYPE=de_DE.UTF-8

test "$SSH_AUTH_SOCK" || exec ssh-agent $SHELL -c "ssh-add; exec $SHELL -login"
EOF
cd ~/rpmbuild/SPECS
cat < <'EOF' > bash.spec
# BASH spec File TEST
#%define beta_tag rc1
%define patchlevel .30
%define baseversion 4.3

# Build auch mit unpackaged files abschliessen
%define _unpackaged_files_terminate_build 0
%define _missing_doc_files_terminate_build 0

Version: %{baseversion}%{patchlevel}
Name: bash
Summary: The GNU Bourne Again shell
Release: 1%{?dist}
Group: System Environment/Shells
License: GPLv3+
Url: http://www.gnu.org/software/bash
Source0: ftp://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz

Source1: dot-bashrc
Source2: dot-bash_profile
Source3: dot-bash_logout

# Official upstream patches
Patch001: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-001
Patch002: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-002
Patch003: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-003
Patch004: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-004
Patch005: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-005
Patch006: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-006
Patch007: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-007
Patch008: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-008
Patch009: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-009
Patch010: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-010
Patch011: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-011
Patch012: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-012
Patch013: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-013
Patch014: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-014
Patch015: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-015
Patch016: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-016
Patch017: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-017
Patch018: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-018
Patch019: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-019
Patch020: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-020
Patch021: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-021
Patch022: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-022
Patch023: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-023
Patch024: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-024
Patch025: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-025
Patch026: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-026
Patch027: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-027
Patch028: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-028
Patch029: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-029
Patch030: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-030

Requires(post): ncurses-libs
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires: ncurses-devel
BuildRequires: autoconf, gettext

%description
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.

%define pkgdocdir %{_datadir}/doc/%{name}-%{version}

%prep
#%setup -q -a 2
%setup -q -n %{name}-%{baseversion}

# Official upstream patches
%patch001 -p0 -b .001
%patch002 -p0 -b .002
%patch003 -p0 -b .003
%patch004 -p0 -b .004
%patch005 -p0 -b .005
%patch006 -p0 -b .006
%patch007 -p0 -b .007
%patch008 -p0 -b .008
%patch009 -p0 -b .009
%patch010 -p0 -b .010
%patch011 -p0 -b .011
%patch012 -p0 -b .012
%patch013 -p0 -b .013
%patch014 -p0 -b .014
%patch015 -p0 -b .015
%patch016 -p0 -b .016
%patch017 -p0 -b .017
%patch018 -p0 -b .018
%patch019 -p0 -b .019
%patch020 -p0 -b .020
%patch021 -p0 -b .021
%patch022 -p0 -b .022
%patch023 -p0 -b .023
%patch024 -p0 -b .024
%patch025 -p0 -b .025
%patch026 -p0 -b .026
%patch027 -p0 -b .027
%patch028 -p0 -b .028
%patch029 -p0 -b .029
%patch030 -p0 -b .030

echo %{version} > _distribution
echo %{release} > _patchlevel

%build
autoconf
%configure --with-bash-malloc=no --with-afs --with-installed-readline
make "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS `getconf LFS_CFLAGS`"
%check
make check
strip bash
strip bashversion

%install
rm -rf $RPM_BUILD_ROOT

if [ -e autoconf ]; then
  export PATH=.:$PATH
fi

# Fix bug #83776
perl -pi -e 's,bashref\.info,bash.info,' doc/bashref.info

make DESTDIR=$RPM_BUILD_ROOT install

mkdir -p $RPM_BUILD_ROOT/etc

# Not for printf, true and false (conflict with coreutils)
rm -f $RPM_BUILD_ROOT/%{_mandir}/man1/printf.1
rm -f $RPM_BUILD_ROOT/%{_mandir}/man1/true.1
rm -f $RPM_BUILD_ROOT/%{_mandir}/man1/false.1

pushd $RPM_BUILD_ROOT
mkdir ./bin
mv ./usr/bin/bash ./bin
ln -sf bash ./bin/sh
rm -f .%{_infodir}/dir
popd
mkdir -p $RPM_BUILD_ROOT/etc/skel
install -c -m644 %SOURCE1 $RPM_BUILD_ROOT/etc/skel/.bashrc
install -c -m644 %SOURCE2 $RPM_BUILD_ROOT/etc/skel/.bash_profile
install -c -m644 %SOURCE3 $RPM_BUILD_ROOT/etc/skel/.bash_logout
LONG_BIT=$(getconf LONG_BIT)
mv $RPM_BUILD_ROOT%{_bindir}/bashbug \
   $RPM_BUILD_ROOT%{_bindir}/bashbug-"${LONG_BIT}"

%find_lang %{name}

# lua-code von Jesse Keating  so das keine Externen Abhängigkeiten benötigt werden.
# lua-Code von Ignacio Vazquez-Abrams
%post -p 
bashfound = false;
shfound = false;

f = io.open("/etc/shells", "r");
if f == nil
then
  f = io.open("/etc/shells", "w");
else
  repeat
    t = f:read();
    if t == "/bin/bash"
    then
      bashfound = true;
    end
    if t == "/bin/sh"
    then
      shfound = true;
    end
  until t == nil;
end
f:close()

f = io.open("/etc/shells", "a");
if not bashfound
then
  f:write("/bin/bash\n")
end
if not shfound
then
  f:write("/bin/sh\n")
end
f:close()

%postun
if [ "$1" = 0 ]; then
    /bin/grep -v '^/bin/bash$' < /etc/shells | \       /bin/grep -v '^/bin/sh$' > /etc/shells.new
    /bin/mv /etc/shells.new /etc/shells
fi

%files -f %{name}.lang
%defattr(-,root,root)
%config(noreplace) /etc/skel/.b*
/bin/sh
/bin/bash
%attr(0755,root,root) %{_bindir}/bashbug-*
EOF

Die bash.spec-Datei enthält die Konfigutarion des Paketes sowie die bei der Installation und deinstallation notwendigen Scripte. Die Vorliegende SPECS Datei ist eine bearbeitung der Original Quelle von Fedora Core 12, welche ich für die aktuelle BASH angepasst habe.

Jetzt kann mit rpmbuild das Paket erstellt werden, welches direkt im Anschluss mit rpm Installiert werden kann. Das alte Bash Paket wird hierbei durch das neue Paket ersetzt.

rpmbuild -ba  bash.spec
rpm -U --force --replacefiles /mnt/chroot/home/builder/rpmbuild/RPMS/armv6l/bash-4.3.30-1.fc12.armv6l.rpm

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