aptitude mit search pattern; Systeme ohne DNS; Apache Satisfy Direktive; bash Bedeutung der Klammern

  1. Loeschen von Paketen mittels aptitude und search pattern um mehrere Pakete gleichzeitig zu loeschen, aber nicht alle hintereinander einzugeben. Das kann man mit ~n. Hier ein klassisches Beispiel wo ich das anwende. Rausfinden welcher Kernel gerade laeuft, rausfinden was es alles an alten Kernel Images auf dem System gibt, loeschen aller linux-image-2.6.32-3*:
    $ uname -a
    $ sudo aptitude search linux-image | grep "^i"
    $ sudo aptitude purge ~nlinux-image-2.6.32-3
  2. Manchmal hat man Systeme, bei denen kein DNS verfuegbar ist. Das fuehrt dann dazu, dass einige Sachen extrem lange dauern, weil Sie versuchen irgendetwas ueber DNS aufzuloesen und dann erst weiter machen wenn es einen Timeout gibt. Als erstes sollte man dann pruefen, dass der eigene Hostname in der /etc/hosts korrekt auf localhost gemappt ist. Oft rgibt es dann auch noch Sinn in der /etc/ssh/sshd_config den folgenden Schalter zu aktivieren:
    UseDNS no
  3. Manchmal moechte man bei einem Apache Webserver etwas fuer einen bestimmten IP Bereich direkt freigeben, und ansonsten soll ein Passwort eingegeben werden. Jeweils das eine von beiden ist einfach realisiert. Wenn man beides moechte, braucht man die Satisfy Direktive. Klassisches Beispiel dafuer:
            <Location "/foo">
                    Order deny,allow
                    Deny from all
                    AuthName "Foo Login"
                    AuthUserFile /path/to/.htpasswd
                    AuthType Basic
                    Require valid-user
                    Allow from 192.168
                    Satisfy Any
                    ProxyPass http://localhost:8080/foo/ timeout=6000
                    ProxyPassReverse http://localhost:8080/foo/
            </Location>
  4. bash Klammern. Immer wieder spannend, deswegen hier mal eben aus meinem Kopf heraus festgehalten wie ich mit ihnen arbeite:
    • () = Subshell. Benutze ich zum Beispiel beim anlegen von Sicherheitskopien mit:

       $ mv foo.txt foo.txt-$(date -I)
    • [] in Schleifen = Ruft das Programm „[“ auf, oder auch „test“. In einer if [ ! -d „/tmp“ ]; echo „directory /tmp does not exist.“; fi Schleife wird bei dem [ das Programm mit dem Namen „[“ aufgerufen. Liegt zum Beispiel unter /usr/bin/[ und hat auch eine eigene manpage.
    • [[]] in Schleifen = Bash eigene Funktion. Darin kann man dann auch Regex verwenden. Beispiel

      $ FOO=1234
      $ if [[ $FOO =~ ^[0-9]*$ ]]; then echo "OK"; else echo "NO"; fi
      OK
      $ FOO=1234a
      $ if [[ $FOO =~ ^[0-9]*$ ]]; then echo "OK"; else echo "NO"; fi
      NO
      $
    • {} = Variablen und Listen. Ich nutze das um in Skripten Variablen besser ersichtlich zu machen, zum Beispiel

      /bin/bash
      FOO=foo.txt
      mv ${FOO} ${FOO}_$(date -I)

      Ausserdem fuer Listen, zum Beispiel wenn man mehrere Ordner mit Unterordnern anlegen moechte:

      mkdir -p /tmp/foo/bar/{one,two,three,four}/

      Nicht zu vergessen die ganzen build-in Shell Funktionen bei den Klammern, z.B. hier, da, dort, guckstu, minneminne

Hotels und (zu bezahlendes) WLAN

Inzwischen war ich in so einigen Hotels unterwegs und immer wieder trifft man auf WLANs, bei denen man fuer die Benutzung zahlen soll. Nach genauerem Blick haben sich die Hersteller oft mehr auf Corporate Design Fragen konzentriert als auf die Sicherheit. Deswegen hier einige Erfahrungen:

Grundsaetzlich ist es sinnvoll, wenn man einen Server hat auf dem man z.B. einen SSH-Server auf alternativen Ports laufen lassen kann. Ich empfehle explizit neben 22 auch 53, 80, 443, 3128 und 8080. Daneben gibt es einen sehr simplen und einfachen Perl-HTTP-Proxy, ich glaube ich hatte den mal aus irgendeinem Linux Magazin:

#!/usr/bin/perl
use HTTP::Proxy;
my $proxy = HTTP::Proxy->new( port => 3129);
$proxy->start;

der die folgende Abhaengigkeit benoetigt:

sudo aptitude install libhttp-proxy-perl

Zu guter letzt hilft natuerlich immer, wenn man weiss, wie man mit SSH externe Ports lokal bindet. Damit kann man z.B. auf dem externen Server den HTTP-Proxy starten, den Port lokal hertunneln, und dann diesen Proxy z.B. in seinem Firefox eintragen… Ein Eintrag in einer ~/.ssh/config koennte wie folgt aussehen:

Host			hotelhelper
HostName		1.2.3.4
User			user
Port			443
LocalForward		3129 localhost:3129

Dann kanns losgehen:

  • Testen welche Ports nach aussen offen sind. Oft wird nur Port 80 und 443 beschraenkt, der Rest ist offen. Man kann sich dann ohne Probleme ueber andere Ports verbinden.
  •  Gucken ob im Netz nicht irgendwo ein Proxy laeuft ueber den man raustunneln kann. Hier kann einem
     sudo aptitude install nmap corkskrew

    helfen

  • Gucken ob DNS-Anfragen richtig aufgeloest werden. Evtl. werden _nur_ http Pakete gefiltert werden auf den offenen Ports, evtl. geht ja SSH auf Port 53 oder 443 raus…
  • Gucken ob klicks auf Portalseiten nicht weitere Dinge oeffnen. In einem Beispiel konnte ich mit einem Klick auf „Hier klicken um mit VISA zu Zahlen“ und der Weiterleitung auf die Seite eines externen Zahlungsanbieters den Proxy dazu bewegen fuer ein Zeitfenster von 30min SSH auf den bekannten Ports zu oeffnen.

Command Line, SSH and webproxy

Ich hatte ja gerade erst darueber geschrieben wie man apt hinter einem proxy benutzen kann, hier noch 2-3 Kleinigkeiten hinzugefuegt.

Als erstes ist es gut, auch die env variable http_proxy=““ zu setzen, damit Programme wie w3m funktionieren:

export http_proxy="http://1.2.3.4:8080"

als zweites ist es natuerlich interessant auch per SSH rauszukommen. Zum Glueck gibt es dafuer in den Ubuntu repositories

aptitude install corkscrew

einem „tunnel TCP connections through HTTP proxies“ Programm. Dafuer die folgenden beiden Zeilen in die ~/.ssh/config hinzufuegen

Host *
ProxyCommand /usr/bin/corkscrew 1.2.3.4 8080 %h %p

wenn es eine Fehlermeldung geben sollte wie:

Proxy could not open connnection to example.net: Proxy Error ( The
  specified Secure Sockets Layer (SSL) port is not allowed. ISA Server
  is not configured to allow SSL requests from this port. Most Web
  browsers use port 443 for SSL requests.  )

einfach mal den SSH-Server auch auf Port 443 lauschen lassen (echo „Port 443 >> /etc/ssh/sshd_config; /etc/init.d/sshd restart) und dann auf dem Port verbinden.

SSH ProxyCommand

Mal wieder SSH … Wie nervig ist es immer wegen Firewalls und Serverhopping erst auf den einen Server gehen zu muessen, bevor man sich auf dem gewuenschten einloggen kann. Die Loesung lautet ProxyCommand. Ein Beispiel fuer eine .ssh/config:

Host *
Compression		yes
CompressionLevel	9
 
Host			bar
User			username
Port			22
ProxyCommand 		ssh foo nc %h %p
Ciphers 		arcfour
ClearAllForwardings	yes
 
Host			foo
HostName		192.168.1.1
User			username
Port			22

Wenn man nun noch eine Key-Authentifizierung hat, (und auf foo in der .ssh/config auch bar definiert ist) kann man sich Schwupps mit

ssh bar

auf dem gewuenschten Rechner einloggen ohne laestiges zwischendrin :-) Ciphers und ClearAllForwardings sind Performancesachen, denn die eine Verbindung muss nicht soo stark verschluesselt sein, wenn es der Tunnel bereits ist.