18
Jan 13

Linux Terminal History

History ausgeben lassen

Die History lässt sich komplett mit dem Befehl

# history

ausgeben. Dabei die Zeilen sind durchnummeriert. Möchte man mehr, als lediglich einen Blick in die History werfen — beispielsweise sie verändern und wieder importieren, könnten die Zeilennummern stören. Kein Problem — mit sed und einem simplen regulären Ausdruck lässt sich eine saubere Liste von Befehlen erzeugen:

# history | sed 's/^[ ]*[0-9]*[ ]*//'

Vorsicht: Das Tool sed implementiert reguläre Ausdrücke nicht komplett. Ich habe mich nämlich erst gewundert, warum mein Ausdruck /^[\s]{2,4}[0-9]{1,3}[\s]{2}/ nicht funktioniert hat — schließlich hat konnte ich damit in einem Editor prima finden, was ich gesucht habe. Doch dann las ich im sed-Manual: “POSIX.2 BREs should be supported, but they aren’t completely because of performance problems.“.

Alternativ geht das mit cut:

# history | history | cut -c 8-

Der cut-Befehl schneidet hier einfach die ersten acht Zeichen der Zeile ab. Ob es mehr werden können, habe ich nicht weiter untersucht. Vermutlich aber theoretisch schon. Die Methode nit sed ist flexibler.

# history > /path/to/my/history.txt

History editieren/importieren

Die History wird in einer Text-Datei gespeichert. Deren Speicherort wird in der Umgebungsvariablen $HISTFILE gehalten. Üblicherweise is es ~/.bash_history.

# echo $HISTFILE
/root/.bash_history

Die History-Datei kann angepasst oder durch eine andere Datei ganz ersetzt werden. Dabei sollte man beachten, dass die Änderungen in der laufenden Terminal-Seeeion nicht sichtbar sind (offenbar greifen einzelne Terminal-Fesnter nicht direkt auf die ~/.bash_history zu, ondern auf eine Zwischengespeicherte Kopie, die beim Anlegen er Terminal-Session erzeugt wird).

History-Länge

Es gibt zwei Typen von History: die “allgemeine” History, die in der ~/.bash_history gespeichert wird, und die Session-History, die der History-Datei hinzugefügt wird, sobald das Terminal-Fenster geschlossen wird. Die maximale Länge der History-Datei ist in der Umgebungsvariablen HISTFILESIZE gehalten, die der Session-History — in der HISTSIZE.

# echo $HISTFILESIZE
500
# echo $HISTSIZE
500

Die Länge der gespeicherten Liste der verwendeten Befehle ist zwar begrenzt, kann aber geändert werden. Um sie dauerhaft zu setzen, kann man das export-Befehl, mit dem der Wert einer Umgebungsvariablen definiert wird, in die ~/.profile eingetragen werden, z.B::

export HISTSIZE=1000
export HISTFILESIZE=100000

Alles hier Beschriebene bezieht sich auf ein Debian 6.0.6 System.


15
Jan 13

Feste IP für eine Virtualbox-VM

In diesem Tutorial ist wunderbar beschrieben, wie man einer VirtualBox-VM eine statische IP zuweist. Auf meinem Guest-System Debian 6 (Squeeze) mit Gnome 2.30.2 sahen die Schritte jedoch teilweise anders aus.

Zunächst alles, wie im bereits erwähnten Tutorial beschrieben:

1. Unter VM-Settings → Network aktivieren wir zwei Netzwerkadapter und konfigurieren einen davon für NAT und den anderen für die Kommunikation mit dem Host ein.

VM-Settings-Network-Adapter-NAT

VM-Settings-Network-Adapter-HostOnly

2. Unter File → Preferences… → Network das Host-only Netzwerk einstellen. Die DHCP-Einstelleungen müssen leer gelassen werden.

VirtualBox-Settings-Network

VirtualBox-Settings-Network-HostOnlyNetwork-Adapter

VirtualBox-Settings-Network-HostOnlyNetwork-DHCPServer

3. Der Guest-Part lässt sich über das GUI hier konfigurieren:  Applications → System Tools → Network Tools → [Network device] Ethernet Interface (eth1) → [Button] Configure .

Debian-Settings-NetworkTools

Im Dialog “Network Connections” wählen wir den Eintrag “Auto eth1″ und klicken auf “Edit…”

Debian-Settings-NetworkTools-NetworkConnections

Weiterhin definieren wir eine Adresse und tragen die Konfigurationen für die Netzmaske und das Gateway ein.

Debian-Settings-NetworkTools-NetworkConnections-AuthoEth1

4. Die /etc/udev/rules.d/70-persistent-net.rules wird entfernt.

5. Als Letztes starten wir den Netzwerk-Service neu:

# /etc/init.d/networking restart

Alles hier Beschriebene bezieht sich auf die VirtualBox 4.2.6, ein Windows-7 Host-System und ein Guest-System mit folgenden Parametern:

# lsb_release -a
No LSB modules are available.
Distributor ID:    Debian
Description:    Debian GNU/Linux 6.0.6 (squeeze)
Release:    6.0.6
Codename:    squeeze
# gnome-about --gnome-version
Version: 2.30.2
Distributor: Debian
Build Date: 11/12/2010

14
Jan 13

Shared Folders für die VirtualBox-VM

Shared Folders ermöglichen es, auf einem einfachen Wege, einen Bereich zu definieren, auf den sowohl das Host- und das Guest-System gleichermaßen zugreifen können. Bei mir ist das v.a. mein Workspace-Verzeichnis auf dem Host, das für das Guest-System als Web-Root-Verzeichnis dient.

Hier ist eine Kurzanleitung:

1. In den Einstellungen einen gemeinsamen Ordner festlegen:

Shared-Folders-Defining-1

Shared-Folders-Defining-2

2. Guest Additions für die VM installieren.

Die Guest Additions sind VM-Zusatz-Features, die nach dem Aufsetzen des Guest-Systems installiert werden können. Zwar sind es “nur” Extras, aber, wie im VirtualBox-Manual steht, “for any serious and interactive use, the VirtualBox Guest Additions will make your life much easier by providing closer integration between host and guest and improving the interactive performance of guest systems.” Shared Folders sind eines dieser Zusatz-Funktionen.

Die Guest Additions lassen sich installieren, indem man im VM-Menü auf Devices → Install Guest Additions… geht und die wenigen Installationsschritte durchführt.

Guest-Additionals-Installation-1

Guest-Additionals-Installation-2

Laut der Guest Additions Installation HowTo, auf die ich unten verweise, braucht man noch einige Vorbereitungen zu treffen, ehe die Additions installiert werden können. Bei mir war dies nicht nötig.

Heute bin ich zufällig auf die einfachste Möglichkeit der Installation der GAs gestoßen. Beim Installationsprozess von Debian können Software-Pakete ausgewählt werden, die gleich mitinstalliert werden (SSH-Server, Web-Server, Datenbank etc.). Ich habe ausgewählt, was ich brauchte und auf “next” geklickt, musst dann aber wieder paar Schritte zurück gehen. Als ich aber wieder an dieser Stelle war, wurde mir anstatt der zu diesem Zeitpunkt bereits installierten SSH-, Web-Server etc. die GAs vorgeschlagen. Nach der Installation brauchte mich nicht mehr um diesen Part zu kümmern — alles hat auf Anhieb funktioniert.

3. Gemeinsamen Ordner einbinden.

Jetzt muss das gemeinsame Verzeichnis nur gemountet werden:

mount -t vboxsf -o uid=1000,gid=1000 workspace /var/www

Möchte man seinen ~/.ssh Ordner als SF haben, muss genau auf die Parameter uid (user ID) und gid (group ID) geachtet werden. Sonst ist es, wenn man auf der VM als root:root arbeitet, nicht rforderlich, aber in dem Fall schon. Außerdem muss dem mount-Befehl ein weiteres Argument (umask) mitgegeben werden, um die Zugriffsrechte auf ~/.ssh einzuschränken:

mount -t vboxsf -o uid=0,gid=0,umask=077 sshkeys /root/.ssh

Sonst können die SSH-Keys nicht verwendet werden:

# git clone git@github.com-user:user/project.git
Cloning into project...
Bad owner or permissions on /root/.ssh/config
fatal: The remote end hung up unexpectedly

Damit man das nicht jedes Mal von Hand machen muss, wird der mount-Befehl in die /etc/rc.local (vor dem exit 0) eingefügt. Alternativ geht das über die /etc/fstab.

Alles hier Beschriebene bezieht sich auf die VirtualBox 4.2.6, ein Windows-7 Host-System und ein Guest-System mit folgenden Parametern:

# lsb_release -a
No LSB modules are available.
Distributor ID:    Debian
Description:    Debian GNU/Linux 6.0.6 (squeeze)
Release:    6.0.6
Codename:    squeeze
# gnome-about --gnome-version
Version: 2.30.2
Distributor: Debian
Build Date: 11/12/2010

14
Jan 13

Gnome-Login als root auf Debian

Auf einer realen Maschine sollte man sich nicht als Superuser anmelden. Doch bei einer VM ist es keine Sünde, mit root zu arbeiten. Dabei erleichtert das einem die Arbeit (man braucht kein “sudo”; Systemdateien lassen sich mit einem GUI-Editor berarbeiten, ohne dass dieser erst über die Konsole gestartet werden muss, etc.).

Meldet man sich übers GUI an, kann man — anders als bei der Konsolen-Anmeldung — nicht ohne Weiteres “root” als Login-Namen angeben. Diese Option ist per Default ausgeschaltet und muss aktiviert werden, indem in der /etc/pam.d/gdm3 die Zeile

auth   required        pam_succeed_if.so user != root quiet_success

auskommentiert wird.

Alles hier Beschriebene bezieht sich auf ein System mit folgenden Parametern:

$ lsb_release -a
No LSB modules are available.
Distributor ID:    Debian
Description:    Debian GNU/Linux 6.0.6 (squeeze)
Release:    6.0.6
Codename:    squeeze
$ gnome-about --gnome-version
Version: 2.30.2
Distributor: Debian
Build Date: 11/12/2010

14
Jan 13

Eigene CSS-Klassen im TinyMCE von WordPress

Es gibt mehrere Möglichkeiten, eigene CSS-Klassen in den WordPress-Editor einzubinden. Die einfachste, wie ich finde, bietet das Plugin Custom Editor Styles. Es muss wohl mehrere Plugins mit diesem Namen geben. Denn das Custom Editor Styles Plugin, von dem hier die Rede ist, ist nicht auf der offiziellen WP-Plugn-Seite zu finden und hat mit dem Custom Editor Styles offenbar nichts zu tun.

Vorgehen:

1. Klassen-DropDown im TinyMCE anzeigen lassen (z.B. mit TinyMCE Advanced).

2. Das Plugin Custom Editor Styles von Aliso the Geek‘s Seite herunterladen (Link zum Artikel; Download-Link).

3. Das ZIP-Archiv unter /wp-content/plugins/ entpacken.

4. Das Plugin im WP-Backend aktivieren.

5. Elemente im Array der in der /wp-content/plugins/custom-editor-styles/custom-editor-styles.php befindlichen tiny_mce_before_init(…) definieren (s.u.).

public function tiny_mce_before_init( $settings ) {
	$style_formats = array(
		array(
			'title'		=> 'My Block',
			'block'		=> 'div',
			'classes'	=> 'myClass',
			'wrapper'	=> true
		),
		...
	);
	...
}

Klassen in der /wp-content/plugins/custom-editor-styles/custom-styles.css definieren (s.u.).

div.myClass {
	background: #cc0000;
}

12
Jan 13

Mit grep Dateien durchsuchen

Das einfachste Beispiel:

# grep 'string' *

Rekursive (-r oder –recursive), Case-insensitive (-i oder –ignore-case) Suche mit Dateiliste (-l oder –files-with-matches) als Output:

# grep -lir 'string' *

Textsuche in Dateien nach Dateitypen/-Namen einschränken (mit include oder exclude):

# find ./ -type f -name '*.php' -exec grep -li 'string' {} \;
# grep -lir --include='*.php' --include='*.js' 'string' .
# grep -lir --exclude=*.css --exclude=*.html 'string' .

10
Jan 13

Hello world!

Welcome to my blog! :)