Jul 24

Mit dem Programm telnet kann die Kommunikation mit einem Server exakt nachvollzogen werden, da damit auch empfangene Header-Informationen eingesehen werden können, die von den meisten verwendeten Programmen (z.B. Browser) nicht angezeigt werden.

In der Konsole tippt man hierfür den Befehl “telnet” gefolgt vom Host und dem zu verwendenten Port ein:

telnet www.google.at 80

Anschließend werden in etwa folgende Meldungen ausgegeben, die eine erfolgreiche Verbindung bestätigen:

Trying 209.85.129.99...
Connected to www.l.google.com.
Escape character is '^]'.

Nun müssen wir die Kommunikation fortsetzen indem wir Header-Informationen an den Server übertragen, in diesem Fall fordern wir die Startseite an und fordern den Host auf die Verbindung anschließend zu trennen:

GET / HTTP/1.1
Host: www.google.com
Connection: close 

Die angeforderte Seite wird nach einem erneuten drücken der Eingabetaste (Enter) und somit der Bestätigung, dass keine weiteren Header-Informationen vom Client folgen, vom Server samt Header-Informationen ausgeliefert:

HTTP/1.1 302 Found
Location: http://www.google.at/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=6c5f19954e78a01a:TM=1216889950:LM=1216889950:S=MT7PZE6CJjjEzxu9; expires=Sat, 24-Jul-2010 08:59:10 GMT; path=/; domain=.google.com
Date: Thu, 24 Jul 2008 08:59:10 GMT
Server: gws
Content-Length: 218
 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.at/">here</A>.
</BODY></HTML>
Connection closed by foreign host. 

Dieses Ergebnis können wir nun interpretieren: Die angeforderte Seite wurde zwar gefunden, allerdings werden wir mit dem Fehlercode “302″ (Seite befindet sich vorübergehend an einer anderen Stelle) zur angegebenen “Location:” weitergeleitet. Die Seite wurde vom Server “gws” am/um “Thu, 24 Jul 2008 08:59:10 GMT” ausgeliefert, insgesamt werden 218 Bytes übertragen. Weiters sind auch Cache-, Cookie und Content-Type-Informationen gesetzt. Anschließend folgt der Body, der im Browser angezeigt werden würde, wenn eine automatische Weiterleitung, wie im Header angegeben nicht möglich wäre.

Jul 23

Die grundsätzliche Funktionalität von sudo habe ich im Artikel “sudo vs. su” bereits erklärt. In diesem Artikel möchte ich darauf eingehen, wie man einem Benutzer die Verwendung von sudo erlauben kann. Unter Linux gibt es hierfür die Datei “/etc/sudoers”. Diese sollte allerdings nicht mit einem beliebigen Editor bearbeitet werden, sondern ausschließlich mit “visudo”, da hiermit vor dem Speichern eine Syntax-Überprüfung erfolgt. Darauf weist auch der Kommentar “This file MUST be edited with the ‘visudo’ command as root.” am Dateianfang hin. Außerdem weiß visudo wo die sudoers-Datei auf dem System gespeichert ist, da der Pfad auf anderen Betriebssystemen (z.B. bei Mac OS X unter “/private/etc/sudoers”) auch abweichen kann. Wie visudo zu bedienen ist, kann im Artikel “Standard-Editor vi” nachgelesen werden, außerdem werden die verfügbaren Befehle in der Statusleiste angezeigt.

Mit dem folgenden Befehl öffnet man also die sudoers-Datei als Superuser:

visudo

Unter Debian sieht die Datei standardmäßig wie folgt aus:

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
 
Defaults        env_reset
 
# Host alias specification
 
# User alias specification
 
# Cmnd alias specification
 
# User privilege specification
root    ALL=(ALL) ALL

Damit wird dem Benutzer “root” auf allen Computern die Ausführung aller Befehle mit/unter jedem Benutzer erlaubt. Im Allgemeinen können fünf Einstellungen pro Zeile festgelegt werden:

  1. Benutzer: Ein Benutzer oder Alias (Standard: muss festgelegt werden).
  2. Host: Ein Host oder Alias (Standard: muss festgelegt werden).
  3. =
  4. (Runas): Mit/Unter welchem Benutzer der Befehl ausgeführt wird (in runden Klammern geschrieben) (Standard: root).
  5. Authentifizierung: Ob nach dem Benutzer-Passwort gefragt werden soll (PASSWD) oder nicht (NOPASSWD) gefolgt von “:” und anschließend Befehl (Standard: nach Passwort fragen).
  6. Befehl: Ein oder mehrere Befehle oder Alias (Standard: muss festgelegt werden).
# User privilege specification
root    ALL=(ALL) ALL

könnte mit der selben Wirkung vereinfacht

# User privilege specification
root    ALL=ALL

oder erweitert wie folgt geschrieben werden:

# User privilege specification
root    ALL=(ALL) PASSWD:ALL

Auch mehrere Befehle können angegeben werden, z.B. dass immer nach dem Benutzer-Passwort gefragt wird, außer für /sbin/reboot:

username ALL=NOPASSWD:/sbin/reboot,PASSWD:ALL

Wie bereits erwähnt können für Benutzer, Host und Befehl auch ein Alias angegeben werden. Diese können wie folgt festgelegt und aktiviert werden:

# Host alias specification
Host_Alias SERVER=host1,host2
 
# User alias specification
User_Alias MAINTAINER=username1,username2
 
# Cmnd alias specification
Cmnd_Alias DEB=/sbin/reboot,/usr/bin/aptitude
  
# User privilege specification
root    ALL=(ALL) ALL
MAINTAINER    SERVER=(root) PASSWD:DEB

Die oben erwähnten Konfigurationen nochmals übersichtlich zusammengefasst:

# User privilege specification
# USER     HOST  =(RUNAS) PASSWD/NOPASSWD COMMAND
root       ALL   =(ALL)                   ALL
root       ALL   =                        ALL # same as above
root       ALL   =(ALL)   PASSWD:         ALL # same as above
MAINTAINER SERVER=(root)  PASSWD:         DEB
Jul 12

vi ist aufgrund seiner geringen Größe und weiten Verbreitung auf vielen *NIX-Betriebssystemen standardmäßig installiert. Aus diesem Grund ist es ein großer Vorteil, wenn man zumindest die Grundfunktionalität des Editors kennt und damit Dateien (z.B. Konfigurationsdateien) bearbeiten kann.

Mit dem Befehl “vimtutor” kann man in der Konsole ein vi-Tutorial starten, das sehr zu empfehlen ist und einem den Editor näher bringt.

Hier möchte ich dennoch die Funktionalität für Eilige kurz zusammenfassen:

Zum Starten von vi tippt man den Befehle “vi [-Optionen] Dateiname” in die Konsole.

Folgende wichtige Optionen stehen zur Verfügung:
-i: vi wird im Eingabemodus anstelle standardmäßig im Befehlsmodus gestartet.
-R: Die angegebene Datei wird Read-Only geöffnet.
+[n]: Sprint zu Zeile n, wobei [n] durch eine Ganzzahl zu ersetzen ist.

Selbstverständlich können Optionen auch miteinander kombiniert werden:
vi -R +50 .bash_history

Der Editor selbst kennt drei unterschiedliche Modi: Befehlsmodus, Eingabemodus und Kommandozeile. Standardmäßig wird vi im Befehlsmodus gestartet, mit der oben genannten Option -i kann allerdings der Eingabemodus erzwungen werden.

Im Eingabemodus kann man wie von einem Editor zu erwarten Text bearbeiten. Dabei werden die gedrückten Tasten an der aktuellen Cursor-Position eingefügt/gelöscht/… . Um den Eingabemodus oder die Kommandozeile (wieder) zu verlassen und in den Befehlsmodus (zurück) zu gelangen, muss man nur die Taste “Esc” drücken. In frühen Versionen von vi konnte man nicht erkennen, welcher Modus aktiv war, deshalb drücken vi-Benutzer vorsichtshalber gerne die Taste “Esc”, um sicher im Befehlsmodus zu sein, bevor sie fortfahren.

Zur Kommandozeile gelangt man, indem man im Befehlsmodus “:” eintippt. Wichtige Kommandos sind:
e!: Alle Änderungen seit dem letzten Speichern verwerfen.
w: Speichern.
wq: Speichern und beenden.
q: Beenden (nur wenn keine Änderungen vorgenommen wurden).
q!: Beenden ohne zu speichern.

Zum Speichern einer Datei und anschließendem beenden von vi tippt man im Befehlsmodus folgendes ein:
:wq

Im Befehlsmodus stehen unter anderem folgende wichtige Befehle zur Verfügung:

Bearbeiten:
i: Eingabe vor dem aktuellen Zeichen (wechselt in den Eingabemodus).
a: Eingabe nach dem aktuellen Zeichen (wechselt in den Eingabemodus).
I: Eingabe am Beginn der aktuellen Zeile (wechselt in den Eingabemodus).
A: Eingabe am Ende der aktuellen Zeile (wechselt in den Eingabemodus).
R: Überschreiben einschalten.

Bewegen:
w: Ein Wort vorwärts bewegen.
[n]w: [n] Wörter vorwärts bewegen, wobei [n] durch eine Ganzzahl zu ersetzen ist.
b: Ein Wort zurück bewegen.
[n]b: [n] Wörter zurück bewegen, wobei [n] durch eine Ganzzahl zu ersetzen ist.
0: Zum Zeilenanfang spingen.
$: Zum Zeilenende springen.
G: Zum Ende des Dokuments springen.
[n]G: Zur Zeile [n] des Dokuments springen, wobei [n] durch eine Ganzzahl zu ersetzen ist.

Löschen:
dd: Aktuelle Zeile löschen.
[n]dd: [n] Zeilen löschen, wobei [n] durch eine Ganzzahl zu ersetzen ist.
x: Nächstes Zeichen löschen.
[n]x: Nächste [n] Zeichen löschen, wobei [n] durch eine Ganzzahl zu ersetzen ist.
X: Vorheriges Zeichen löschen.
[n]X: Vorherige [n] Zeichen löschen, wobei [n] durch eine Ganzzahl zu ersetzen ist.
D: Löschen des Textes beginnend von Cursor-Position bis zum Zeilenende.

Rückgängig:
u: Letzten Befehl rückgängig machen.
U: Letzten Befehl in aktueller Zeile rückgängig machen.

Suchen:
/[pattern]: Vorwärtssuche nach [pattern], wobei [pattern] durch den Suchbegriff zu ersetzen ist.
?[pattern]: Rückwärtssuche nach [pattern], wobei [pattern] durch den Suchbegriff zu ersetzen ist.
n: Suche erneut durchführen.
N: Suche in umgekehrte Richtung erneut durchführen.

Speichern und beenden:
ZZ: Speichern und beenden (entspricht “wq” in der Kommandozeile).

Jul 10

Wenn man sich zu vielen Servern via SSH verbinden muss, obendrein unterschiedliche Benutzernamen verwenden muss und auch noch die Ports auf denen die SSH-Server lauschen verschieden sind, bekommt man sehr schnell Probleme sich die unterschiedlichen Konfigurationen zu merken bzw. ist es lästig stets den FQDN (Fully Qualified Domain Name, z.B. ssh.demo.blogix.net) eintippen zu müssen. Abhilfe schafft die Konfigurationsdatei des SSH-Client. Ein Beispieleintrag in der Konfigurationdatei ~/.ssh/config könnte wie folgt aussehen:

Host	blogix
	HostName	ssh.demo.blogix.net
	Port		1234
	User		blogix

Eine Verbindung kann nun mit “ssh blogix” aufgebaut werden, anstelle des zuvor aufwendigen Befehls “ssh blogix@ssh.demo.blogix.net -p 1234″. Selbstverständlich lassen sich noch sehr viele weitere Einstellungen in der SSH-Client Konfigurationsdatei festlegen.

Jul 06

Wenn man ein Projekt in einem SVN-Repository abgelegt hat, werden lokal in jedem Ordner des Projekts .svn-Ordner angelegt, die Informationen für die SVN-Synchronisation beinhalten. Im Datei-Browser werden mit einem Punkt beginnende Dateien/Ordner (z.B. auch .bash_history,…), überlicherweise nicht angezeigt. In der Konsole bzw. im Terminal kann man diese Dateien/Ordner allerdings schnell löschen, wenn man dies möchte. Ist beispielsweise eine SVN-Synchronisation nicht mehr erforderlich und möchte man die .svn-Ordner rekursiv löschen, genügt folgender Befehl:

find . -type d -name .svn -exec rm -Rf {} \;

find . sucht nach allen Dateien/Ordnern rekursiv in dem Verzeichnis, in dem es aufgerufen wurde. Der Parameter -type d sorgt dafür, dass das Suchergebnis nur Ordner zurückliefert, mit -name wird der Ordnername auf .svn beschränkt. Anschließend wird noch die auszuführende Funktion mit -exec rm -Rf {} übergeben, nämlich rekursives löschen der gefundenen Ordner ohne weitere Benutzereingabe.