My Universe Logo

My Universe Blog » Entries Tagged as shell

Oneliner für Bogus-IPs

Posted by Jesco Freund at April 30, 2011 11:34 a.m.

Aus der Kategorie „nützliche Oneliner“:

awk '/receive|Invalid/ {print $NF}; /reverse/ {print substr($12,2,length($12)-2)}; /not allowed/ {print $9}' /var/log/auth.log | sort -nu

Damit erzeugt man eine Liste von IP-Adressen, die in letzter Zeit (soweit das Logfile eben reicht) ungebetenerweise Zugriff auf SSH haben wollten. Zugegeben: Der Nutzen einer solchen Liste ist eher begrenzt; man könnte damit (und z. B. in Verbindung mit GeoIP) eine Statistik füttern, automatisierte Abuse-Meldungen verschicken, etc.

alert Auf keinen Fall, unter gar keinen Umständen sollte man auf die blöde Idee kommen, damit automatisch den Zugriff auf SSH zu blockieren – sei es nun per Paketfilter, oder per TCP Wrapper.

No comments | Defined tags for this entry: awk, security, shell

ZSH für Faulpelze

Posted by Jesco Freund at March 6, 2010 9:27 a.m.

ZSH ist die beste Shell (neben bpython ;-)), aber um von der Überlegenheit der ZSH überhaupt zu profitieren, muss man eine Menge anstrengender Konfigurationsarbeit leisten. Das geht (zumindest unter Arch Linux) auch einfacher:

sudo pacman -Sy zsh grml-zsh-config most vim

cat > ~/.zshrc << EOF
# nix drin
EOF

cat > ~/.zshrc.local << EOF
PAGER=most
EDITOR=vim
# und hier noch ein bisschen persönlicher Alias-Stuff
EOF

Das war's auch schon. Das Paket grml-zsh-config enthält eine 140kB große zshrc, die (fast) alle Anwendungsfälle abdeckt; sogar angepasste Prompts für mit Git oder Mercurial verwaltete Verzeichnisse sind integriert.

No comments | Defined tags for this entry: BOfH, shell, zsh

New Release Candidate for jail-update 0.2

Posted by Jesco Freund at Jan. 31, 2010 12:45 p.m.

Today, after a long period of… doing nothing concerning the root-tools project, I uploaded a new release candidate for jail-update 0.2 (download). The current release candidate (rc5) now works fine with portmaster >=2.17 and got some bug fixes. For update checks, I also switched back to the more compact output format of the 0.1 releases – much more legible as for my taste…

I recommend updating to this release candidate even though it's not a release yet (but likely to become one) since portmaster's command line syntax has changed with version 2.17. This prevents older versions of jail-update from working properly (you have to confirm each single port upgrade, so you might be even quicker jumping into each jail and starting the upgrade manually :-().

No comments | Defined tags for this entry: FreeBSD, root-tools, scripting, shell

Portable Shell-Skripte mit absoluten Pfaden

Posted by Jesco Freund at Oct. 3, 2009 2:23 p.m.

Gute Shell-Skripte sprechen Binaries mit dem absoluten Pfad an. Dadurch wird das Skript unabhängig von der Umgebungsvariablen $PATH und funktioniert auch manierlich, wenn es beispielsweise üder die Crontab oder unter einem andere User aufgerufen wird. Soweit die Theorie, doch in der Praxis gibt es einen gemeinen Fallstrick, der den Wanderer zwischen den Unix-Welten das Leben bzw. Skripten schwer macht. Betrachten wir einmal das folgende Beispiel:

#!/bin/sh

b_uname="/bin/uname"
b_awk="/bin/awk"

name=`$b_uname -n | $b_awk -F. '{print $1}'`

echo "Das System heisst ${name}."
exit 0

Dieses kleine Skript ist ein (zugegebenermaßen etwas umständlicher) Ersatz für den Befehl hostname -s – das tut aber eigentlich nichts zur Sache. Viel spannender ist die Frage, wie portabel dieses Skript arbeitet. Unter CentOS 5.3 kann ich es fehlerfrei ausführen. Anders sieht es aus, wenn dieses Skript auf einer Maschine mit FreeBSD oder Solaris aufgerufen wird: Unter FreeBSD erhält man Fehlermeldungen („Command not found“), da uname und awk nicht wie bei CentOS und Solaris in /bin liegen, sondern in /usr/bin (bei Solaris kommt es ebenfalls zu Problemen, die aber darin begründet sind, dass die Solaris-Implementierungen von uname und awk von den GNU-Implementierungen abweichen – doch dazu später).

Unter den verschiedenen Unix-Derivaten und sogar Linux-Distributionen liegen Binaries also nicht immer am selben Ort. Müssen portable Skripte also darauf verzichten, absolute Pfade zu verwenden und sich auf $PATH verlassen? Natürlich nicht. Allerdings funktioniert der Schnellschuss „dann definiere ich Binaries eben systemabhängig“ auch nicht so ohne weiteres – man sieht ja, dass das häufig dazu herangezogene uname schon nicht sehr portabel gelagert ist. Es gibt jedoch einen eleganteren Weg, der sich nur auf Shell-interne Funktionen stützt und daher tatsächlich komplett portabel ist:

#!/bin/sh

detect_binary() {
    local BINDIRS="/bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin /opt/csw/bin /opt/sfw/bin /usr/openwin/bin"

    for i in $BINDIRS; do
        if [ -x "${i}/${1}" ]; then
            echo "${i}/${1}"
            break
        fi
    done
}

b_uname=$(detect_binary "uname")
b_awk=$(detect_binary "awk")

Die Funktion detect_binary probiert alle angegebenen Pfade durch, bis sie in einem auf eine ausführbare Datei mit dem gesuchten Namen stößt. Anschließend gibt sie den absoluten Pfad des gefundenen Binaries zurück. Auf diese Weise wird zum einen sichergestellt, dass nur Binaries aus den vorgegebenen Pfaden verwendet werden, und zum anderen, dass die Binaries weiterhin unabhängig von der Umgebungsvariable $PATH gefunden werden können.

Eines löst dieser Code-Schnipsel jedoch nicht: Das unterschiedliche Verhalten von gleichnamigen Binaries unter verschiedenen Unix-Derivaten. Auf vielen Nicht-Linux Systemen stehen Binaries der GNU-Implementierung zur Verfügung, oder zumindest Binaries, die das Verhalten der GNU-Implementierungen nachahmen. Unter FreeBSD beispielsweise findet man in gsed und gawk die GNU-Implementierungen, während sich hinter sed und awk die traditionellen BSD-Implementierungen verbergen. Die <programm>-Binaries findet man im übrigen auch unter Linux. Benötig man also in einem Skript explizit das GNU-Verhalten (beispielsweise beim Einsatz von sed -i, so sollte man auch die GNU-Binary-Namen verwenden.

Happy Scripting!

4 comments | Defined tags for this entry: code, FreeBSD, Linux, programming, scripting, shell, Solaris

Gnome Terminal in Bunt

Posted by Jesco Freund at April 8, 2009 11:36 p.m.

Es gibt Programme (wie z. B. vim), die prüfen, ob die Variable TERM auf den Wert xterm-color gesetzt ist, bevor sie irgendeinen Output farbig darstellen. Unangenehmerweise setzt Gnome Terminal TERM per Default auf den Wert xterm, was sich leider nirgendwo in der Konfiguration anpassen lässt (zumindest habe ich keine Möglichkeit gefunden). Natürlich gäbe es die Möglichkeit, diesen Wert in .bashrc, .zshrc, .profile & Co. zu überschreiben – grundsätzlich sollte das aber nur passieren, wenn tatsächlich ein farbfähiger Terminal-Emulator verwendet wird.

Dreckiger Workaround: vorher prüfen, ob wirklich Gnome Terminal verwendet wird. Also packe man sich folgendes in seine Shell-Konfigurationsdatei und genieße buntes Syntax-Highlighting mit vim:

if [ "$COLORTERM" = "gnome-terminal" ]; then
    export TERM="xterm-color"
fi

Etwas übersichtlicher geht es für (T)CSH-Nutzer zu:

if ($COLORTERM == "gome-terminal") setenv XTERM xterm-color

No comments | Defined tags for this entry: Gnome, shell

Hacking Gentoo – Spaß mit glibc-Harakiri

Posted by Jesco Freund at Feb. 28, 2009 11:25 p.m.

Vor kurzem hat (versehentlich?) glibc-2.9 die harte Maskierung verloren und landete somit in Testing. Die Entwickler haben nun diese Version zumindest im Hardened Profil wieder maskiert. Ärgerlich (aber hinlänglich bekannt): ein Downgrade der glibc ist gar keine gute Idee und wird auch von den portage-Werkzeugen nicht unterstützt. Dennoch blockiert die (bei mir problemlos arbeitende) zu neue Version ein Upgrade von world. Da emerge eine entsprechende exclude-Option fehlt und das löschen des glibc-Eintrags aus dem World-File leider auch keine Besserung brachte, bleibt nur ein dreckiger Shell-Hack:

emerge $(emerge -pDNu --columns world | grep '^\[' | grep -v 'glibc' | awk '{print $4}')

Kleiner Hinweis am Rande: die Option --columns ist zwar recht nett, aber inkonsequent implementiert. Je nach Upgrade-, Downgrade- oder Rebuild-Flag variiert die Anzahl der Spalten. Ein anderes sinnvolles Trennzeichen ist leider auch nicht vorhanden, so dass man vor jedem Lauf die Ausgabe der Pipe kontrollieren sollte, bevor man sie emerge zum Fraß vorwirft (wer zu viel Zeit hat, kann sich ja noch einen sed-Hack ausdenken, um die erste logische Spalte zu eliminieren).

1 comment | Defined tags for this entry: Gentoo, packet management, shell

MSYS – eine schlanke Alternative zu Cygwin

Posted by Jesco Freund at Feb. 24, 2009 10:11 a.m.

/assets/user/jfreund/img/png/thumb/128x128/msys.png

Unter Windows zu arbeiten kann manchmal recht nervig sein – insbesondere dann, wenn man Aufgaben zu erledigen hat, die sich in gewohnter Umgebung sehr fix erledigen lassen. Egal ob es „nur“ um Aufrufe von CLI-Programmen (gcc & Co) oder um die Bearbeitung umfangreicher Daten-Dumps geht: cmd.exe saugt. Die maximal darstellbare Anzahl Zeichen pro Zeile ist fest verdrahtet, Tab Completion gibt es erst ab Windows XP (ich habe hier noch W2K im Einsatz), Pipes sind ein Wunsch-, Schleifen ein Albtraum, und Werkzeuge vergleichbar grep oder awk sucht man vergeblich.

Mit Cygwin ließe sich dem recht einfach abhelfen, aber es gibt eine kompaktere Alternative: MSYS. MSYS ist Bestandteil des MinGW-Projekts. Anders als Cygwin bietet es nur einen auf Windows portierten Terminal-Emulator (rxvt) und keinen kompletten X-Server. Als einzige Shell steht die GNU Bash zur Verfügung, ergänzt um die üblichen Verdächtigen (Coreutils, awk, grep, sed). Als Goodies finden sich allerdings auch Perl, der OpenSSH Client nebst Agent und Key Generator, Vim und die GNU Autotools im Paket. Die Versionen sind allerdings recht steinzeitlich – Perl ist mit Version 5.6 noch am aktuellsten, während OpenSSH mit Version 2.9 schon sehr dick verstaubt ist (immerhin beherrscht diese Version schon SSHv2, sonst wäre der Client wohl vollends unbrauchbar). Andere Werkzeuge wie GNU make oder die Bash selbst sind hingegen erstaunlich aktuell. Aktualisierte Pakete und weitere Werkzeuge findet man im SourceForge-Repository des MinGW-Projekts.

Fazit: Wer nur eine Shell zum arbeiten benötigt und auf einen auf Windows portierten X-Server verzichten kann, sollte durchaus mal einen Blick auf MSYS werfen. Insbesondere mit den Supplementary Tools lässt sich MSYS zu einer vollwertigen Shell-Arbeitsumgebung aufrüsten. Die Werkzeug-Zusammenstellung zielt zwar stark in Richtung Entwicklung mit MinGW (dafür wurde die Umgebung eben gebaut…), lässt sich aber auch hervorragend für generische Aufgaben einsetzen. Dank Perl und den Klassikern sed, awk und grep werde ich in naher Zukunft jedenfalls keine VBA-Makros mehr benötigen, um Datendumps umzumodeln…

No comments | Defined tags for this entry: open source, shell, software, unix

Page 1 of 1