perror – Explain Error Codes für MySQL in der Shell

for i in `seq 1 180`; do perror ${i}; done | less

Info: http://dev.mysql.com/doc/refman/5.0/en/perror.html

 

Ausgabe:

OS error code   1:  Operation not permitted
OS error code   2:  No such file or directory
OS error code   3:  No such process
OS error code   4:  Interrupted system call
OS error code   5:  Input/output error
OS error code   6:  No such device or address
OS error code   7:  Argument list too long
OS error code   8:  Exec format error
OS error code   9:  Bad file descriptor
OS error code  10:  No child processes
OS error code  11:  Resource temporarily unavailable
OS error code  12:  Cannot allocate memory
OS error code  13:  Permission denied
OS error code  14:  Bad address
OS error code  15:  Block device required
OS error code  16:  Device or resource busy
OS error code  17:  File exists
OS error code  18:  Invalid cross-device link
OS error code  19:  No such device
OS error code  20:  Not a directory
OS error code  21:  Is a directory
OS error code  22:  Invalid argument
OS error code  23:  Too many open files in system
OS error code  24:  Too many open files
OS error code  25:  Inappropriate ioctl for device
OS error code  26:  Text file busy
OS error code  27:  File too large
OS error code  28:  No space left on device
OS error code  29:  Illegal seek
OS error code  30:  Read-only file system
OS error code  31:  Too many links
OS error code  32:  Broken pipe
OS error code  33:  Numerical argument out of domain
OS error code  34:  Numerical result out of range
OS error code  35:  Resource deadlock avoided
OS error code  36:  File name too long
OS error code  37:  No locks available
OS error code  38:  Function not implemented
OS error code  39:  Directory not empty
OS error code  40:  Too many levels of symbolic links
OS error code  42:  No message of desired type
OS error code  43:  Identifier removed
OS error code  44:  Channel number out of range
OS error code  45:  Level 2 not synchronized
OS error code  46:  Level 3 halted
OS error code  47:  Level 3 reset
OS error code  48:  Link number out of range
OS error code  49:  Protocol driver not attached
OS error code  50:  No CSI structure available
OS error code  51:  Level 2 halted
OS error code  52:  Invalid exchange
OS error code  53:  Invalid request descriptor
OS error code  54:  Exchange full
OS error code  55:  No anode
OS error code  56:  Invalid request code
OS error code  57:  Invalid slot
OS error code  59:  Bad font file format
OS error code  60:  Device not a stream
OS error code  61:  No data available
OS error code  62:  Timer expired
OS error code  63:  Out of streams resources
OS error code  64:  Machine is not on the network
OS error code  65:  Package not installed
OS error code  66:  Object is remote
OS error code  67:  Link has been severed
OS error code  68:  Advertise error
OS error code  69:  Srmount error
OS error code  70:  Communication error on send
OS error code  71:  Protocol error
OS error code  72:  Multihop attempted
OS error code  73:  RFS specific error
OS error code  74:  Bad message
OS error code  75:  Value too large for defined data type
OS error code  76:  Name not unique on network
OS error code  77:  File descriptor in bad state
OS error code  78:  Remote address changed
OS error code  79:  Can not access a needed shared library
OS error code  80:  Accessing a corrupted shared library
OS error code  81:  .lib section in a.out corrupted
OS error code  82:  Attempting to link in too many shared libraries
OS error code  83:  Cannot exec a shared library directly
OS error code  84:  Invalid or incomplete multibyte or wide character
OS error code  85:  Interrupted system call should be restarted
OS error code  86:  Streams pipe error
OS error code  87:  Too many users
OS error code  88:  Socket operation on non-socket
OS error code  89:  Destination address required
OS error code  90:  Message too long
OS error code  91:  Protocol wrong type for socket
OS error code  92:  Protocol not available
OS error code  93:  Protocol not supported
OS error code  94:  Socket type not supported
OS error code  95:  Operation not supported
OS error code  96:  Protocol family not supported
OS error code  97:  Address family not supported by protocol
OS error code  98:  Address already in use
OS error code  99:  Cannot assign requested address
OS error code 100:  Network is down
OS error code 101:  Network is unreachable
OS error code 102:  Network dropped connection on reset
OS error code 103:  Software caused connection abort
OS error code 104:  Connection reset by peer
OS error code 105:  No buffer space available
OS error code 106:  Transport endpoint is already connected
OS error code 107:  Transport endpoint is not connected
OS error code 108:  Cannot send after transport endpoint shutdown
OS error code 109:  Too many references: cannot splice
OS error code 110:  Connection timed out
OS error code 111:  Connection refused
OS error code 112:  Host is down
OS error code 113:  No route to host
OS error code 114:  Operation already in progress
OS error code 115:  Operation now in progress
OS error code 116:  Stale NFS file handle
OS error code 117:  Structure needs cleaning
OS error code 118:  Not a XENIX named type file
OS error code 119:  No XENIX semaphores available
OS error code 120:  Is a named type file
MySQL error code 120: Didn't find key on read or update
OS error code 121:  Remote I/O error
MySQL error code 121: Duplicate key on write or update
OS error code 122:  Disk quota exceeded
OS error code 123:  No medium found
MySQL error code 123: Someone has changed the row since it was read (while the table was locked to prevent it)
OS error code 124:  Wrong medium type
MySQL error code 124: Wrong index given to function
OS error code 125:  Operation canceled
MySQL error code 125: Undefined handler error 125
OS error code 126:  Required key not available
MySQL error code 126: Index file is crashed
OS error code 127:  Key has expired
MySQL error code 127: Record file is crashed
OS error code 128:  Key has been revoked
MySQL error code 128: Out of memory in engine
OS error code 129:  Key was rejected by service
MySQL error code 129: Undefined handler error 129
OS error code 130:  Owner died
MySQL error code 130: Incorrect file format
OS error code 131:  State not recoverable
MySQL error code 131: Command not supported by database
MySQL error code 132: Old database file
MySQL error code 133: No record read before update
MySQL error code 134: Record was already deleted (or record file crashed)
MySQL error code 135: No more room in record file
MySQL error code 136: No more room in index file
MySQL error code 137: No more records (read after end of file)
MySQL error code 138: Unsupported extension used for table
MySQL error code 139: Too big row
MySQL error code 140: Wrong create options
MySQL error code 141: Duplicate unique key or constraint on write or update
MySQL error code 142: Unknown character set used in table
MySQL error code 143: Conflicting table definitions in sub-tables of MERGE table
MySQL error code 144: Table is crashed and last repair failed
MySQL error code 145: Table was marked as crashed and should be repaired
MySQL error code 146: Lock timed out; Retry transaction
MySQL error code 147: Lock table is full;  Restart program with a larger locktable
MySQL error code 148: Updates are not allowed under a read only transactions
MySQL error code 149: Lock deadlock; Retry transaction
MySQL error code 150: Foreign key constraint is incorrectly formed
MySQL error code 151: Cannot add a child row
MySQL error code 152: Cannot delete a parent row
MySQL error code 153: No savepoint with that name
MySQL error code 154: Non unique key block size
MySQL error code 155: The table does not exist in engine
MySQL error code 156: The table already existed in storage engine
MySQL error code 157: Could not connect to storage engine
MySQL error code 158: Unexpected null pointer found when using spatial index
MySQL error code 159: The table changed in storage engine
MySQL error code 160: There's no partition in table for the given value
MySQL error code 161: Row-based binlogging of row failed
MySQL error code 162: Index needed in foreign key constraint
MySQL error code 163: Upholding foreign key constraints would lead to a duplicate key error in some other table
MySQL error code 164: Table needs to be upgraded before it can be used
MySQL error code 165: Table is read only
MySQL error code 166: Failed to get next auto increment value
MySQL error code 167: Failed to set row auto increment value
MySQL error code 168: Unknown (generic) error from engine
MySQL error code 169: Record is the same
MySQL error code 170: It is not possible to log this statement
MySQL error code 171: The event was corrupt, leading to illegal data being read
MySQL error code 172: The table is of a new format not supported by this version
MySQL error code 173: The event could not be processed no other hanlder error happened
MySQL error code 174: Got a fatal error during initialzaction of handler
MySQL error code 175: File to short; Expected more data in file
MySQL error code 176: Read page with wrong checksum
MySQL error code 177: Too many active concurrent transactions
MySQL error code 178: Index column length exceeds limit
MySQL error code 179: Index corrupted
MySQL error code 180: Undo record too big

Optimierungen von Android unter Linux nutzen

Vor einiger Zeit habe ich ein kleines Shell-Script (SSSwitch – auto-switch settings) geschrieben, welches mein Android Handy beim Start optimiert und die Kernel-Einstellungen anpasst, wenn der Bildschirm an bzw. aus ist. Einige der Einstellungen kann man auch unter Linux verwenden. Als Beispiel beschreibe ich hier kurz, wie man die I/O Leistung verbessern kann und wer allgemein etwas zum optimieren von Linux / Ubuntu lesen möchte, dem hilft ggf. folgender Blog-Post weiter -> SpeedUp-Ubuntu ;)

 

Ein Ausschnitt aus dem besagtem Skript …

# =========
# One-time tweaks to apply on every boot;
# =========
STL=`ls -d /sys/block/stl*`;
BML=`ls -d /sys/block/bml*`;
MMC=`ls -d /sys/block/mmc*`;

… hier wurde der externe / interne Speicher von Android angegeben unter meinem Linux-System würde ich hier also z.B. folgendes angeben.

SDA=`ls -d /sys/block/sda/*`;

# =========
# Remount all partitions
# =========
for k in $(busybox mount | cut -d " " -f3);
do
	sync;
	busybox mount -o remount,noatime,nodiratime $k;
done;

“atime – Update inode access time for each access. See also the strictatime mount option.” – man mount Hier schalten wir die Funktion aus, welche aufzeichnet wann ein Datei oder Verzeichnis zuletzt angesehen wurde, da wir diese Funktionalität unter Android selten benötigen werden. ;) Ggf. kann man diesen Abschnitt komplett so unter Linux / Ubuntu verwenden z.B.:

mount
/dev/sda5 on / type ext4 (rw,errors=remount-ro,commit=0)
[...]
/dev/sda3 on /boot type ext2 (rw)
/dev/sda6 on /home type ext4 (rw,commit=0)
[...]
for k in $(busybox mount | cut -d " " -f3); do sync; mount -o remount,noatime,nodiratime $k; done;
mount
/dev/sda5 on / type ext4 (rw,noatime,nodiratime,errors=remount-ro)
[...]
/dev/sda3 on /boot type ext2 (rw,noatime,nodiratime)
/dev/sda6 on /home type ext4 (rw,noatime,nodiratime)
[...]

… wie man sieht sind die neuen Mount-Optionen nun aktiv. Wer mehr dazu erfahren möchte findet in dem bereits erwähnten “SpeedUp Ubuntu“-Beitrag unter dem Punkt “3.1) Filesystem” mehr Infos.

# =========
# check enabled/disabled status for IO settings
# =========
if [ "$IO_SETTINGS_ENABLED" -eq "1" ];
then
	# =========
	# Optimize non-rotating storage
	# =========
	for i in $STL $BML $MMC;
	do
		/system/xbin/echo "1" > $i/queue/iosched/rq_affinity;
		/system/xbin/echo "1" > $i/queue/iosched/low_latency;
		/system/xbin/echo "64" > $i/queue/max_sectors_kb;
		/system/xbin/echo "$READ_AHEAD_ALL" > $i/queue/read_ahead_kb;
	done;

Hier legen wir unter anderem die Puffergröße von unseren Speichermedien ein. Als Beispiel zeige ich kurz wie sich der Buffer auf die Lesegeschwindigkeit auswirkt, wenn eine Datei z.B. erneut geöffnet wird. ;) Dazu benötigen wir zuerst einen Compiler (gcc)

sudo apt-get install gcc

Nun den folgenden Quelltext kopieren …

#include 
#include <stdio.h>
#include <unistd.h>
#include <sys/times.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define MAX_PUFFER_GROESSE 1<<14
// Ausgabe
static void zeit_ausgabe(long int puff_groesse, clock_t realzeit, struct tms *start_zeit, struct tms *ende_zeit, long int schleiflaeufe);

int main(void) {
    char puffer[MAX_PUFFER_GROESSE];
    ssize_t n;
    long int i, j=0, puffer_groesse, opt_puffer;
    struct tms start_zeit, ende_zeit;
    static long ticks=0;
    clock_t uhr_start, uhr_ende, system_cpu=0.0;

    // Ausgabe
    fprintf(stderr, "+--------------+-------------+--------------+--------------+--------------+\n");
    fprintf(stderr, "| %-10s | %-10s | %-10s | %-10s | %-10s |\n",
                    "Puffer-", "UserCPU", "SystemCPU", "Gebrauchte", "Schleifen-");
    fprintf(stderr, "| %10s | %10s | %10s | %10s | %10s |\n",
                    " groesse", " (Sek)", " (Sek)", " Uhrzeit", " laeufe");
    fprintf(stderr, "+--------------+-------------+--------------+--------------+--------------+\n");

    while (j <= 14) {
        i=0;
        puffer_groesse=1<<j;
        if (lseek(STDIN_FILENO, 0L, SEEK_SET) == -1) {
            fprintf(stderr, "Error: lseek");
            exit(1);
        }
        if (lseek(STDOUT_FILENO, 0L, SEEK_SET) == -1) {
            fprintf(stderr, "Errir: lseek");
            exit(1);
        }
        if ( (uhr_start = times(&start_zeit)) == -1) {
            fprintf(stderr, "Error: times");
            exit(2);
        }
        while ( (n=read(STDIN_FILENO, puffer, puffer_groesse)) > 0) {
            if (write(STDOUT_FILENO, puffer, n) != n) {
                fprintf(stderr, "Error: write");
                exit(3);
            }
            i++;
        }
        if (n < 0) {
            fprintf(stderr, "Error: read");
            exit(4);
        }
        if ( (uhr_ende = times(&ende_zeit)) == -1) {
            fprintf(stderr, "Error: times");
            exit(5);
        }

        if (ticks == 0) {
            if ( (ticks = sysconf(_SC_CLK_TCK)) < 0) {
                fprintf(stderr, "Error: sysconf");
                exit(6);
            }
        }
        // Ausgabe
        zeit_ausgabe(puffer_groesse, uhr_ende-uhr_start, &start_zeit, &ende_zeit, i);
        j++;
    }
    exit(0);
}

// Ausgabe
static void zeit_ausgabe(long int puff_groesse, clock_t realzeit, struct tms *start_zeit, struct tms *ende_zeit, long int schleiflaeufe) {
    static long ticks=0;
    if (ticks == 0) {
        if ( (ticks = sysconf(_SC_CLK_TCK)) < 0) {
            fprintf(stderr, "Error: sysconf");
            exit(6);
        }
    }
    fprintf(stderr, "| %10ld | %10.2f | %10.2f | %10.2f | %10ld |\n", puff_groesse, (ende_zeit->tms_utime - start_zeit->tms_utime) / (double)ticks, (ende_zeit->tms_stime - start_zeit->tms_stime) / (double)ticks, realzeit / (double)ticks, schleiflaeufe);
    return;
}

… und in eine leere Datei (io_speed_buffer.c) einfügen, nun compilieren wir noch schnell das Programm mit folgendem Befehl …

gcc io_speed_buffer.c -o io_speed_buffer

… als nächsten benötigen wir eine etwa 10 MB große Datei als Eingabe, diese erzeugen wir mittels “dd” im aktuellen Verzeichnis.

dd if=/dev/zero of=./test count=20000

Und schon können wir mittels folgenden Befehl die optimale Buffer-Größe herausfinden. Wobei man bei minimaler Verbesserung nicht den höheren Wert nutzen sollte.

z.B.:

./io_speed_buffer <test >test2
+--------------+-------------+--------------+--------------+--------------+
| Puffer-    | UserCPU    | SystemCPU  | Gebrauchte | Schleifen- |
|    groesse |      (Sek) |      (Sek) |    Uhrzeit |     laeufe |
+--------------+-------------+--------------+--------------+--------------+
|          1 |       0.48 |      10.41 |      10.90 |   10240000 |
|          2 |       0.26 |       3.40 |       3.66 |    5120000 |
|          4 |       0.19 |       1.64 |       1.83 |    2560000 |
|          8 |       0.12 |       0.80 |       0.92 |    1280000 |
|         16 |       0.01 |       0.46 |       0.47 |     640000 |
|         32 |       0.03 |       0.20 |       0.23 |     320000 |
|         64 |       0.00 |       0.12 |       0.12 |     160000 |
|        128 |       0.00 |       0.07 |       0.07 |      80000 |
|        256 |       0.00 |       0.04 |       0.04 |      40000 |
|        512 |       0.00 |       0.02 |       0.02 |      20000 |
|       1024 |       0.00 |       0.02 |       0.02 |      10000 |
|       2048 |       0.00 |       0.01 |       0.01 |       5000 |
|       4096 |       0.00 |       0.00 |       0.00 |       2500 |
|       8192 |       0.00 |       0.01 |       0.01 |       1250 |
|      16384 |       0.00 |       0.01 |       0.01 |        625 |

Standardmäßig ist der Wert “128″ gesetzt …

cat /sys/block/sda/queue/read_ahead_kb
128

… welchen wir jedoch leicht ändern können! ;)

sudo echo "256" > /sys/block/sda/queue/read_ahead_kb
cat /sys/block/sda/queue/read_ahead_kb
256

Ggf. kann man diese Einstellungen auch unter Linux direkt beim start ausführen lassen z.B. könnte man den zuvor gezeigten “echo”-Befehl in der “rc.local”-Datei einfügen. (/etc/rc.local)

	# =========
	# Optimize io scheduler
	# =========
	for i in $STL $BML $MMC;
	do
		/system/xbin/echo "$IO_SCHEDULER" > $i/queue/scheduler;

Welcher I/O Scheduler der beste für das Speichermedium ist kann man am betesten selber testen, indem man z.B. wieder den “dd”-Befehl verwendet. -> [Discussion] SSSwitch – auto-switch settings PS: Für mein Android-System nutze ich momentan “bfq” wobei “noop” gerade für SSD-Speichermedien schneller sein soll …

		case $IO_SCHEDULER in
		"cfq")
    		        /system/xbin/echo "0" > $i/queue/rotational;
      		        /system/xbin/echo "1" > $i/queue/iosched/back_seek_penalty;
      		        /system/xbin/echo "1" > $i/queue/iosched/low_latency;
     		        /system/xbin/echo "3" > $i/queue/iosched/slice_idle;
      		        /system/xbin/echo "16" > $i/queue/iosched/quantum;
      		        /system/xbin/echo "2048" > $i/queue/nr_requests;
			/system/xbin/echo "1000000000" > $i/queue/iosched/back_seek_max;;
		"bfq")
			/system/xbin/echo "0" > $i/queue/rotational;
			/system/xbin/echo "1" > $i/queue/iosched/back_seek_penalty;
			/system/xbin/echo "1" > $i/queue/iosched/low_latency;
			/system/xbin/echo "3" > $i/queue/iosched/slice_idle;
			/system/xbin/echo "16" > $i/queue/iosched/quantum;
			/system/xbin/echo "2048" > $i/queue/nr_requests;
			/system/xbin/echo "1000000000" > $i/queue/iosched/back_seek_max;;
		"noop")
			/system/xbin/echo "4" > $i/queue/iosched/quantum;
			/system/xbin/echo "16" > $i/queue/iosched/fifo_batch;
			/system/xbin/echo "248" > $i/queue/nr_requests;;
		"deadline")
			/system/xbin/echo "1" > $i/queue/iosched/front_merges;
      		        /system/xbin/echo "16" > $i/queue/iosched/fifo_batch;;
		"sio")
      		        /system/xbin/echo "1" > $i/queue/iosched/front_merges;
			/system/xbin/echo "4" > $i/queue/iosched/quantum;
			/system/xbin/echo "16" > $i/queue/iosched/fifo_batch;
			/system/xbin/echo "256" > $i/queue/nr_requests;;
		esac;
[...]
	done;
[...]
fi;

Hier noch ein-wenig Feintuning für die entsprechenden I/O Scheduler ;) ggf. müssen diese Werte auf anderen Systemen (Hardware) angepasst werden, dies habe ich bisher nur auf meinem Android System getestet. Falls euch / jemanden dieser Blog-Beitrag gefallen hat, werde ich weitere Einstellungen von dem Skript erklären … :)

Ubuntu 11.04 Tweak-Skript

In diesem Blog-Post stelle ich kurz mein kleines Shell-Skript vor, mit dem man sein Ubuntu 11.04 einrichten bzw. optimieren kann. Wenn jemandem noch ein Feature fehlt, kann dies angepasst werden. Zudem habe ich im Quelltext an den meisten Stellen Kommentare hinterlassen, sodass man gleich noch etwas über die shell lernen kann … :-)

Über konstruktive Kritik und / oder Verbesserungen würde ich mich freuen.

Download

 

wget http://suckup.de/ubuntu-11.04-tweak.txt
mv ubuntu-11.04-tweak.txt ubuntu-11.04-tweak
chmod +x ubuntu-11.04-tweak
sudo ./ubuntu-11.04-tweak

 

Funktionen:

- neue Repositories (Quellen) eintragen /  Programme installieren (Java, Flash, Chromium, …)

- Ubuntu / Gnome / Unity anpassen

Tweak-Skript für Android / Spica

Ich habe hier ein kleines HowTo zum beschleunigen von Android / Spica geschrieben und wollte euch das Tweak-Skript für “bfs-Kernel” / “cfs-Kernel” / “Dateisystem” (ext2) / “3G/Edge Speed” … zur Verfügung stellen. -> Forum-LinkDownload

Erste Schritte in der Shell

Ich habe schon einige kleine Blog-Beiträge zum Thema “Shell / Bash” geschrieben und werde versuchen diese Blog-Beiträge zu einer hoffentlich umfassenden Einführung in das Thema Shell zusammenfassen…  :-)

Was ist eine Shell?

Die Shell ist die Eingabe-Schnittstelle zwischen Computer und Benutzer, welche bei normaler Systemkonfiguration nach dem erfolgreichem Login eines Benutzers gestartet wird, so dass man auf dieser Kommandozeile die Möglichkeit hat weitere Programme zu starten. Die Shell könnte man somit aus Arbeitsumgebung bezeichnen, von wo aus der PC gesteuert werden kann bzw. Dateien bearbeitet werden können. Es gibt unterschiedliche Arten von Shell’s, wer ein modernes Linux-Betriebssystem (Debian, Ubuntu…) installiert, landet meistens in der sogenannten “bash“, darauf gehe ich jedoch gleich genauer ein. Die eingegebenen Texteingaben werden von der Shell interpretiert und ausgeführt, daher spricht man bei der Shell auch von einem Kommandozeileninterpreter (command-line interpreter, CLI).

 

Begrifflichkeiten!?

In Verbindung mit dem Begriff Shell hört man auch immer wieder folgendes …

 

  • Konsole: In ihrem ursprünglicher Definition war die Konsole ein Terminal, mit dem der Systemoperator die Systemfunktionen steuern konnte… heute wird der Begriff jedoch ebenfalls für “Terminalemulation” verwendet, zudem heißt die grafischen Terminalemulationen unter KDE “Konsole“.
  • Virtuelle Konsole: Die meisten Linux-Systeme kommen standardmäßig mit einigen virtuellen Konsolen daher, welche man über <Strg> + <Alt> + <F1> bis <F6> erreichen kann. Mittels <Strg> + <Alt> + <F7> wird der Desktop und somit die graphischen Oberfläche wieder angezeigt.
  • Terminal: Ein Terminal ist ein Computer, der den Zugriff auf einen entfernten Rechner erhält und die meisten Rechenoperationen somit nicht selber durchführt. (Terminal-PCs) Der Begriff “Terminal” wird heute jedoch auch als Abkürzung für “Terminalemulation” verwendet.
  • Terminalemulation: Mit einer Terminalemulation wird eine textorientierte Ein- und Ausgabeschnittstelle, ein Terminal emuliert, so dass man mehrer Instanzen eines Terminals auf dem Desktop zur Verfügung hat.
shell <---> Terminalemulation <---> grafische Oberfläche
bash  <--->       xterm       <--->         X11

 

Wie komme ich in die Shell?

Wie bereits erwähnt kann man zum einen die virtuelle Konsolen, die mit tty bezeichnet werden per Tastenkombination erreichen. Die Abkürzung tty stammt von dem englischen Wort Teletype und wurde historisch bedingt von Unix übernommen. Mittels …

<Strg> + <Alt> + <F1>

… gelangt man in die erste der tty-Konsolen, in diesem Fall tty1.

 

 

 

Hinweis: Hat man eine  grafische Oberfläche (Desktop) installiert, so befindet sich dieser standardmäßig auf tty7. Dieser Wert ist jedoch Variabel und kann umverlegt werden. Wer die Maus in einer solchen virtuellen Konsole verwenden will, sollte sich das Programm “gpm” anschauen / installieren.

 

Hat man sich einmal an die Desktop-Oberfläche gewöhnt, erscheinen einem diese virtuelle Konsolen meist wenig komfortabel, daher gibt es einige Programme (Terminalemulation) welche den Funktionsumfang erheblich erweitern.

 

KDE – Konsole

KDE-Nutzern steht das bereits erwähnte Programm “Konsole” zur Verfügung, wobei sich der Kreis der Begrifflichkeiten hier schließt und die Verwirrung bei so manchen gerade erst einsetzt. ;-) Lässt man dies außer Acht ist dieses Terminal(emulation) sehr gut. Das Programm unterstützt Tabs, Transparenz, verschiedenste Farbschema, unterschiedliche Schriften und man kann Profile anlegen.

 

konsole

konsole

 

Gnome – Terminal

Gnome-Nutzer verfügen von Haus aus über ein Programm mit dem Namen “Gnome-Terminal”. Ich persönlich bevorzuge dieses Programm, wobei dies wahrscheinlich eine Übungssache ist…

 

TASTENKÜRZEL BEDEUTUNG
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span>&lt;Strg&gt; + &lt;Umschalttaste&gt; + t</span></strong>
öffnet einen neuen Tab
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span><strong><span>&lt;Strg&gt; + d</span></strong></span></strong>
schließt einen Tab
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span><strong><span>&lt;Strg&gt; + Bild rauf</span></strong></span></strong>
öffnet nächsten Tab (rechts) bzw. den ersten
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span><strong><span><strong><span>&lt;Strg&gt; + Bild runter</span></strong></span></strong></span></strong>
öffnet vorherigen Tab (links) bzw. den letzen
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span><strong><span><strong><span><strong><span>&lt;Strg&gt; + &lt;Umschalttaste&gt; + Bild rauf</span></strong></span></strong></span></strong></span></strong>
verschiebt einen Tab nach rechts
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span><strong><span><strong><span><strong><span><strong><span>&lt;Strg&gt; + &lt;Umschalttaste&gt; + Bild unter</span></strong></span></strong></span></strong></span></strong></span></strong>
verschiebt einen Tab nach links

 

Hinweis: Wer das Terminal immer Griffbereit haben möchte, sollte sich einmal “guake” anschauen … ;-)

 

gnome_terminal

gnome_terminal

 

Xterm

Xterm ist Bestandteil des X.org Projekts und war lange Zeit das Standardterminal für Linuxsysteme mit grafischer Oberfläche.

 

CLI Companion

Wer die Linux-Befehle noch lernen möchte oder sich einige komplizierte Behle öfter benötigt, kann sich auch dieses Terminal anschauen. -> cli-companion-die-gui-in-der-konsole

 

CLICompanion

CLICompanion

 

Terminator

“Terminator ist ein in Python geschriebener Terminal-Emulator für die Desktop-Umgebung GNOME, der es ermöglicht mehrere Terminals innerhalb eines Fensters bzw. einzelner Tabs zu benutzen und mittels Tastatur-Kürzeln zwischen diesen zu wechseln. So kann man ohne Tabs und ohne weitere Terminalfenster mehrere Shells zur selben Zeit offen haben.” - http://wiki.ubuntuusers.de/Terminator

 

terminator_split_example

terminator_split_example

 

Wenn man seine Standard-Terminal ändern möchte, kann man dies mit dem Alternativen-System bewerkstelligen…

sudo update-alternatives --config x-terminal-emulator

 

Was für Shells gibt es?

Wenn man sich ein wenig näher mit dem Thema beschäftigt, stellt man schnell fest, dass es eine Menge Alternative Shells gibt. Ich beschränke mich einfach mal auf die (heutige) Standard-Shell die bash und einer Alternative der zsh (Z-Shell)

 

Bourne Again Shell (bash)

Die Bourne Again Shell ist die Standard-Shell der meisten Linux-Distributionen. Die Shell beherrscht die Features der Borune- Korn- und C-Shell. Redet jemand von einer Shell, spricht man meistens von Bash. Um das volle Potenzial der Bash zu nutzen sollte man sich “.bashrc“-Datei anschauen und an seine Bedürfnisse anpassen, für den Anfang sollte meine Datei als Vorlage genügen. -> bashrc

 

Z-Shell (zsh)

Die Zsh kann man als eine Zusammenstellung aller Verbesserungen und Features aus der bash, der csh und der tcsh betrachten.

Zu einigen ihrer Features zählen:

  • eine frei programmierbare Wortvervollständigung (TAB-Completion)
  • die Möglichkeit, die History aus anderen – gleichzeitig laufenden – Shells zu nutzen
  • Rechtschreibüberprüfung
  • nahezu vollständige Kompatibilität zur bash, ksh und tcsh

-> Quelle: http://de.wikipedia.org/wiki/Unix-Shell#Die_Z-Shell

Bei der Z-Shell kann hat man noch viel mehr Einstellungsmöglichkeiten, welche einem Anfangs ggf. überfordern können, daher auch hier meine “.zshrc“-Datei als Vorlage. -> zshrc

 

Z-Shell installieren:

sudo aptitude install zsh

Z-Shell ausprobieren:

zsh

Standardmäßig die Z-Shell verwenden:

sudo chsh -s /usr/bin/zsh `whoami`

 

Probieren geht über studieren…

… was ist damit sagen will, wer einmal die Vorteile der Shell erkannt hat und einige Befehle kennt, wird die Shell lieben lernen!

 

Linux-Dateipfade einigermaßen kennen

Auch wenn in der Shell meist angezeigt wird in welchem Verzeichnis man sich gerade befindet, kann es seht hilfreich sein, wenn man ungefähr weiß wo sich was bei Linux befindet! -> http://wiki.ubuntuusers.de/Verzeichnisstruktur

 

Verzeichnis Bedeutung ~ Windows
/
Wurzelverzeichnis
C:\
/boot
Bootloader
C:\
/etc
Systemkonfiguration registry

C:\WINDOWS\*.ini
/bin
Systemprogramme für Benutzer
C:\WINDOWS\,C:\WINDOWS\COMMAND\
/sbin
Systemprogramme und -dienste für Admins  
/lib
Systembibliotheken und Treiber
C:\WINDOWS\SYSTEM32\
/tmp
Temporäre Dateien
C:\WINDOWS\TEMP\
/usr
(“Unix System Resources”)  
/usr/bin
Programme für Benutzer
C:\Programme\*\
/usr/sbin
Programme und Dienste für Admins  
/usr/lib
Bibliotheken  
/home
Heimatverzeichnisse
C:\Dokumente und Einstellungen\
/home/user
Heimatverzeichnis des Benutzers user  
/root
Heimatverzeichnis des Benutzers root  
/var
Daten von Diensten  
/var/log
Systemprotokolle  
/media
Wechseldatenträger, z.B. USB-Stick  
/media/cdrom
CD-ROM
A:\, D:\, E:\,...

 

Beim Login in die Shell, landet man meistens in seinem eigenen home-Verzeichnis (z.B.: /home/lars/). Im “Prompt” (dem Text vor der Eingabeaufforderung, in der Shell) könnte nun so etwas angezeigt werden “lars@ubuntu:~$“.

lars ist hier der User-Name, ubuntu der Name des PCs und das ~ (Tilde-Zeichen) steht als Abkürzung und Synonym für das Homeverzeichnis, in welchem wir uns gerade befinden, dies kannst du gleich durch die Eingabe des Befehl “pwd” (print working directory) überprüfen. ;-)

 

Groß- und Kleinschreibung beachten

Anders als bei Windows unterscheidet Linux Groß- und Kleinschreibung, hier einige Beispiele zur Verdeutlichung …

mkdir lall

(mkdir – make directories)

mkdir Lall
touch lall

(touch – erstellt eine leere Datei)

touch Lall

 

Nun können wir uns mittels “ls” (ls - list directory contents) bzw. …

ls -latrF --color=auto

… anzeigen lassen, welche Dateien / Verzeichnisse im aktuellen Verzeichnis erstellt wurden. Mittels “rm” bzw. “rmdir” kannst du diese Dateien wieder löschen. Falls du versehentlich z.B.: “touch ./–help” ausführst und somit eine leere Datei mit dem Namen-”–help” erstellt hast, kannst du diese mittels “rm ./–help” wieder entfernen.

 

Der Befehl “man” (z.B.: man mkdir) zeigt eine ausführliche Hilfe zum angegebenen Befehl an und “apropos” (z.B.: apropos mkdir) zeigt dessen Funktion schnell an… zudem kann man hinter den Befehlen auch “–help” (mkdir –help) schreiben

 

Achtung
Achtung: Vorsicht der Befehl “rm -r” löscht rekursiv, am Anfang sollte man diesen Parameter ggf. mit -i kombinieren, so dass vor dem löschen einer Datei noch einmal nachgefragt wird, ob diese wirklich gelöscht werden soll. (z.B.: rm -ri lall/) -> safe-rm can save your life

 

Die Navigation

Ebenfalls ein sehr großes Themenfeld ist die Navigation in der Shell, angefangen von der Navigation durch die Verzeichnisse / Dateien … über die Verwendung der History (bereits eingegebene Befehle in der Shell) … bis hin zur Navigation innerhalb der Shell.

 

Navigation in Verzeichnissen

Befehl BEDEUTUNG
cd ..
wechselt ein Verzeichnis nach oben
cd ../..
wechselt zwei Verzeichnise nach oben
cd ~
wechselt in dein home-Verzeichnis
TAB
durch das drücken der Tabulator-Taste, wird deine Eingabe vervollständigt -> ggf. 2x hintereinander TAB drücken !!!
».«
jedes Verzeichnis enthält eine Referenz auf sich selbst, diesen Punkt benötigt man vor allem,

wenn man eine ausführbare Datei starten möchte… (z.b: cd /bin/; ./bash;)

pwd
zeigt an wo du dich befindest

 

Durch das drücken der TAB-Taste kann man sich viel Tipparbeit ersparen… :-)

 

Navigation in der Shell

BEFEHL / Tastenkürzel BEDEUTUNG
<Strg> + d
Logout aus der Shell (logout bzw. exit)
<Strg> + c
laufender Prozesse (im Vordergrund) wird beendet
<Strg> + l
räumt die Ausgabe auf (clear)
fc -l
zeigt die letzten Befehle in einer Liste an
Pfeiltasten (noch oben / unten)
letzte Befehle durchblättern
Pfeiltasten (noch rechts / links)
Cursor auf der Konsole (rechts / links) bewegen
<Strg> + r
sucht einen Befehl in der Bash-History (mehrmaliges drücken von Strg+r geht weiter in der History zurück)
Alt + .
schreibt den letzten Parameter des letzen Befehls auf die Konsole
!$
schreibt den letzten Parameter des letzen Befehls auf die Konsole (Alt + .)
!!
führt den letzten Befehl noch einmal aus
!string
startet den letzten Befehl, der mit sting anfängt
!?string
startet den letzten Befehl, der string enthält
^sting1^string2
wiederholt den letzten Befehl, wobei sting1 doch string2 ersetzt wird
<Strg> + a
Cursor am Anfang der Zeile
<Strg> + e
Cursor am Ende der Zeile
<Strg> + w
schneidet das letzte Wort aus
<Strg> + u
scheidet alles vor dem Cursor aus
<Strg> + k
scheidet alles hinter dem Cursor aus
<Strg> + y
fügt die zuletzt ausgeschnittenen Daten ein

 

PS: wie bereits erwähnt entfaltet die Shell ihr volles Potenzial erst, wenn man diese ein wenig an seine Wünsche anpasst, daher hier noch einmal der Verweiß auf die .bashrc und .zshrc

 

Kommandos hintereinander ausführen

Wie bereits kurz zuvor gezeigt, kann man Befehle auch hintereinander ausführen… z.B.:

cd /bin/; ./bash;

Hier werden die Befehle “cd /bin/” und “./bash” einfach nacheinander ausgeführt. Wenn man den zweiten Befehl jedoch nur ausführen möchte, wenn der erste Befehl ohne Probleme funktioniert hat, kann man && zwischen den beiden Befehlen verwenden… z.B.:

cd /bin_lall/ && ./bash;

Und wenn man den zweiten Befehl nur ausführen möchte, wenn der erste Befehl nicht funktioniert hat, nimmt man “||“… z.B.:

cd /bin_lall/ || echo "ggf. existiert /bin_lall nicht";

 

PS: Natürlich muss man nicht jedesmal in das Verzeichnis /bin wechseln, wenn man ein Programm aus diesem Verzeichnis öffnen möchte, dazu wird in der Shell die Variable “$PATH” verwendet. z.B.:

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11

 

Mehrzeilige Kommandos

Wenn man ein Kommando / Befehl über mehrere Zeilen aufteilen möchte, kann man dies mithilfe von “\” machen… z.B.:

find /etc/ \
-iname "pass*"
Hier gibt es weitere Infos zum “find”-Befehl und hier noch eine Befehlsübersicht für alle die gerade Ihre ersten Schritte auf der Shell wagen…

 

Syntax Name Beschreibung ~ Windows
pwd
present working directory Anzeige des aktuellen Arbeitsverz.  
cd Zielverzeichnis
change directory Verzeichniswechsel
CD
ls Verzeichnis
list Verzeichnisinhalt anzeigen
DIR
file Datei
% Dateiformat oder -typ  
echo Zeichenkette
% Zeichenkette ausgeben  
cat Datei
concatenate Dateiinhalt ausgeben
TYPE
more Datei
% dito, seitenweise
MORE
less Datei
% dito, blättern und suchen  
touch Datei
% Leere Datei anlegen  
cp Quelle Ziel
copy kopieren
COPY
mv Quelle Ziel
move verschieben, umbenennen
MOVE, REN
rm Datei
remove löscht eine Datei
DEL, ERASE
mkdir Verzeichnis
make directory neues Verzeichnis anlegen
MD
rmdir Verzeichnis
remove directory (leeres) Verzeichnis löschen
RD

-> linux-kommandos-als-hintergrundbild ;-)

 

Dateien bearbeiten

Wer direkt in der Shell Dateien verändern möchte, sollte sich den “vim”-Editor anschauen, wie die Shell ist dieser Editor gewöhnungsbedürftig aber man gewinnt Ihn mit der Zeit lieb… ;-) In diesem HowTo habe ich versucht die wichtigsten Funktionen von vim zusammenzufassen. Und hier noch eine Schnellübersicht:

 

BEFEHL / TASTENKÜRZEL BEDEUTUNG
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;">i</strong>
Text einfügen, vor dem Cursor
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;">R</strong>
Text ab Cursor-Position überschreiben
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;">&lt;Strg&gt; + v</strong>
Bereich markieren
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span>&lt;ESC&gt;</span></strong>
Bearbeitungsmodus beenden
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span>y</span></strong>
kopieren
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span>p</span></strong>
einfügen
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span>:q</span></strong>
vi/vim beenden
<strong style="font-family: Verdana, Arial, Helvetica, sans-serif; padding: 0px; margin: 0px;"><span style="font-weight: normal;"><strong>:w</strong></span></strong>
Datei speichern

 

 

vi-vim-cheat-sheet_de_layout

vi-vim-cheat-sheet_de_layout

 

Es gibt unter Linux noch etliche Programme, welche einem beim bearbeiten von Dateien hilfreich sein können z.B.: sed

sed -i 's/Ubuntu/Windows/g' test.txt

Dieser Befehl ersetzt das Wort “Ubuntu” durch “Windows” in der ganzen Datei “test.txt” im aktuellen Verzeichnis. Weitere Infos zu sed findest du hier -> streameditor-sed und hier noch ein alter Beitrag zum Thema -> Dateien-in-der-shell-bearbeiten

 

Programme im Hintergrund verschieben

Man kann Programme und Befehle auch im Hintergrund ausführen bzw. diese in den Hintergrund verschieben…

 

lars@ubuntu ~$ kommando1 & 
[1] 5520
lars@ubuntu ~$ kommando2 & 
[2] 5521
lars@ubuntu ~$ fg %2 
kommando2

 

kommando1 und kommando2 wurden beide im Hintergrund ausgeführt, dann wurde kommando2 mittels dem Befehl “fg” wieder in den Vordergrund geholt. Wenn man kommando2 wieder in den Hintergrund verschieben möchte drücken wir: <Strg> + z

[2]+  Stopped kommando2
lars@ubuntu ~$ bg 
[2]+ kommando2 &

Mit Hilfe des Befehls “

bg"

wird eine angehaltener Job der Shell in den Hintergrund verschoben und wieder gestartet:

Hier gibt es diesbezüglich weitere Infos: Prozess-anhalten

 

StdIn & StdOut

Sehr hilfreich sind folgende kleine Helfer in der Shell -> Pipezeichen (|) Größer-als-Zeichen (>) und Kleiner-als-Zeichen (<)

mithilfe dieser Zeichen kann man Programm bzw. dessen Ausgaben umleiten. z.B.:

ls -l /usr/bin > /tmp/Alle_Benutzerprogramme.txt

-> schreibt die Ausgabe von “ls” des Verzeichnisses /usr/bin/ in die Textdatei /tmp/Alle_Benutzerprogramme.txt

grep http /etc/services | wc -l

-> zählt alle Zeilen in der Textdatei /etc/services, die die Zeichenkette http enthalten

 

Der Befehl “grep” kann Verzeichnisse, Dateien oder Ausgaben durchsuchen bzw. filtern, daher solle man sich diesen Befehl noch mal genauer ansehen!!!

 

 

Zum Schluss verlinke ich noch einige alte Blog-Post welche weitere Informationen zur Shell beinhalten, viel Spaß beim testen… :D

 

Dateien verschieben in der Shell -> http://suckup.de/blog/2010/01/31/mv-linux/

- reguläre Ausdrücke (wildcards) in der Shell -> http://suckup.de/blog/2010/02/09/wildcards-in-der-shell/

Shell-Programmierung: Schleifen -> http://suckup.de/blog/2010/02/09/nice-try/http://suckup.de/blog/2010/01/31/bash-programmierung-schleifen/

Bedingungen in der Shell -> http://suckup.de/blog/2010/01/31/bedingungen-in-der-shell-linux/

crontab -> http://suckup.de/blog/2010/02/08/crontab/

ps – prozessstatus -> http://suckup.de/blog/2010/09/14/shell-ps-prozessstatus/

Rechnen in der Shell -> http://suckup.de/blog/2010/01/31/rechnen-in-der-shell/

HTML-Umlaute in der Shell korrigieren -> http://suckup.de/blog/2010/02/13/html-umlaute-korrigieren/

cdrecord – ISO erstellen und CD brennen -> http://suckup.de/blog/2010/01/31/cdrecord-iso-erstellen-und-brennen/

aptitude & dpkg -> http://suckup.de/blog/2010/02/13/aptitude-dpkg/

- Unix-Dateiattribute (Zugriffsrechte) verändern -> http://suckup.de/blog/2010/01/31/chmod-howto/

su & sudo & Setuid-Bit -> http://suckup.de/blog/2010/02/08/su-sudo-setuid-bit/

Systeminfos anzeigen -> http://suckup.de/blog/2010/02/08/systeminfos-anzeigen-lassen/

Speicherverbrauch anzeigen -> http://suckup.de/blog/2010/02/08/speicherverbrauch-anzeigen-lassen/

mount über SSH -> http://suckup.de/blog/2010/02/07/mount-ueber-ssh/

Ports via ssh weiterleiten -http://suckup.de/blog/2010/03/29/ports-via-ssh-weiterleiten/

SSH – Hostnamen vervollständigen -> http://suckup.de/blog/2010/09/14/ssh-hostnamen-vervollstaendigen/

Desktop Firewall – iptables -> http://suckup.de/blog/2010/01/31/desktop-firewall-iptables/

deine öffentliche IP-Adresse in der Shell -> http://suckup.de/blog/2010/01/31/deine-oeffentliche-ip-adresse/

offene Ports analysieren -> http://suckup.de/blog/2010/03/28/offene-ports-analysieren/

TCPdump – HowTo -> http://suckup.de/blog/2010/08/02/tcpdump-howto/

netstat + ss + lsof -> http://suckup.de/blog/2010/01/31/netstat-ss-lsof/

nethogs und iftop – Traffic analysieren -> http://suckup.de/blog/2010/01/31/nethogs-und-iftop-traffic-analysieren/

lsof – list open files -> http://suckup.de/blog/2010/02/22/lsof-list-open-files/

Ostereier obwohl es nicht Ostern ist

Die folgenden “Eastereggs” lassen sich im Linux-Alltag finden und falls du auch noch ein paar Eastereggs kennst, würde ich die gerne hören… :-)


YouTube:

Snake auf Youtube spielen ->

1.) Video bei 0:00 anhalten

2.) Pfeiltaste nach Links drücken

3.) danach zusätzlich Pfeiltaste kurz nach Oben drücken

4.) Vorsicht, das Spiel geht sofort los… :-)


Telnet:

… ich verrate mal nichts ;-)

telnet towel.blinkenlights.nl
telnet towel.blinkenlights.nl 666


Google:

In meiner “Feature-Liste” von Google fehlt noch einiges… ;-)

- suche nach ASCII-Art und dann achte auf das Google-Logo -> http://www.google.com/search?q=ascii+art

- auch wenn ich das schon einmal erwähnt habe -> www.google.com/bsdwww.google.com/linuxwww.google.com/microsoft

- einfach einmal auf “Insert Coin” klicken und spielen -> http://www.google.com/pacman/

- folgendes bei Google eingeben :-) -> answer to life, the universe and everything


aptitude:

Ich habe vor einiger Zeit bereits über “aptitude” berichtet, hier noch ein paar Features…

aptitude moo
aptitude -v moo
aptitude -vv moo
aptitude -vvv moo
aptitude -vvvv moo
aptitude -vvvvv moo

Die Ausgabe der Befehle spare ich mir, will dir ja nicht den Spaß verderben… :-)


Zudem ist unter der aptitude-Hilfe noch ein Osterei zu finden:

aptitude -h | tail -n 1


Außerdem ist noch ein Feature in aptitude eingebaut -> Minesweeper

aptitude 
<Strg>+t
linux_aptitude_minesweeper


Vim:

Auch in meiner umfangreichen “vim“-Sammlung fehlt ein entscheidender Befehl:

:help 42 
:Ni!


wget:

wget -S http://wordpress.com -O- 2>&1 | grep hacker 


Gnome:

Unter GNOME-Desktop -> Eingabeaufforderung (Alt + F2) -> und folgendes eingeben ->

“free the fish” -> kleiner schwimmender Fisch auf dem Desktop (klick auf den Fisch und versuche ihn zu verscheuchen…) :D
“gegls from outer space” -> GEGLs from Outer Space


Firefox:

Folgendes bei Firefox in der Adresszeile eingeben. :-)

about:robots
about:mozilla


Debian / Ubuntu etc.:

… um das “Fake-Release” anzuzeigen, muss man in der Konsole den folgenden Befehl eingeben, klappt auch bei Ubuntu! :-)

zgrep "The.*Release" /usr/share/doc/dpkg/changelog.Debian.gz

zcat /usr/share/doc/linux-image-`uname -r`/changelog.Debian.gz | egrep -e "Release"

… und hier noch ein Befehl der generell unter Linux funktionieren sollte. ->

ddate


Arch Linux: (pacman)

In der Datei /etc/pacman.conf im Bereich unter [options] fügen wir ILoveCandy ein… und schon haben wir eine neue Folgschrittsanzeigt bei pacman… :-)

transparenten Proxy per SSH umgehen

Ich hatte bereits einmal über das Thema “Ports via ssh weiterleiten” geschrieben, um z.B. pop3 oder smtp verschlüsselt zu nutzen. Heute zeige ich aus aktuellem Anlass, wie man mithilfe SSH einen transparenten Proxy im Netzwerk umgehen kann. Im Studentenwohnheim (Krefeld) ist jemand auf die glorreiche Idee gekommen alle Webseiten auf denen Filesharing betrieben werden kann, zu sperren.

z.B.: www.dropbox.com


Internet-Beschwerdestelle

Internet-Beschwerdestelle

(Tipp: mit “Alt” + “Druck” bekommt man einen Screenshot vom gewählten Fenster)


1.) Tunnel auf dem Client zum Server erstellen

Der folgende Befehl erstellt einen Socks kompatiblen Proxy per SSH-Tunnel. Wie im anderen Blog-Post beschrieben, kann man z.B. mit dem Parameter “-L” eine Verbindung zu einem anderen Proxy per SSH aufbauen.


ssh -D 3128 -fN user@server

(ssh -L 3128:proxyserver:3128 -fN user@proxyserver)


2.) SSH-Tunnel verwenden


Nun können wir einen neuen Proxy einstellen, unter Gnome …

System > Einstellungen > Netzwerk-Proxy

… als Socks-Rechner tragen wir nun “localhost” und den Port “3128″ ein.


Bildschirmfoto-Netzwerk

Bildschirmfoto-Netzwerk


unoconv: umwandlung zwischen allen Dokument-Formaten von OpenOffice

Mit unoconv kann man viele Dokument-Formate konvertieren, unterstützte Formate sind unter anderem das  “Open Document Format” (.odt), “MS Word” (.doc), “MS Office Open/MS OOXML” (.xml), “Portable Document Format” (.pdf), “HTML”, “XHTML”, “RTF”, “Docbook” (.xml)…  

Funktionen:

  • konvertiert alle Formate die OpenOffice unterstützt
  • OpenOffice unterstützt bis zu 100 Dokument Formate :-)
  • kann genutzt werden um Vorgänge zu automatisieren (Skripte -> z.B. shell oder php)
  • unterstützt weitere Tools -> “asciidoc”, “docbook2odf/xhtml2odt”
  • kann Style-Vorlagen (templates) während der Konvertierung anwenden (corporate identity)
  • kann sowohl als Server, als auch als Client fungieren


Formate:

Es folgt eine Liste von Ausgabe-Formaten von OpenOffice (und somit auch von unoconv), die Eingabe-Formate können sich jedoch unterscheiden -> INPUT / EXPORT


Export:

  • bib – BibTeX [.bib]
  • doc – Microsoft Word 97/2000/XP [.doc]
  • doc6 – Microsoft Word 6.0 [.doc]
  • doc95 – Microsoft Word 95 [.doc]
  • docbook – DocBook [.xml]
  • html – HTML Document (OpenOffice.org Writer) [.html]
  • odt – Open Document Text [.odt]
  • ott – Open Document Text [.ott]
  • ooxml – Microsoft Office Open XML [.xml]
  • pdb – AportisDoc (Palm) [.pdb]
  • pdf – Portable Document Format [.pdf]
  • psw – Pocket Word [.psw]
  • rtf – Rich Text Format [.rtf]
  • latex – LaTeX 2e [.ltx]
  • sdw – StarWriter 5.0 [.sdw]
  • sdw4 – StarWriter 4.0 [.sdw]
  • sdw3 – StarWriter 3.0 [.sdw]
  • stw – Open Office.org 1.0 Text Document Template [.stw]
  • sxw – Open Office.org 1.0 Text Document [.sxw]
  • text – Text Encoded [.txt]
  • txt – Plain Text [.txt]
  • vor – StarWriter 5.0 Template [.vor]
  • vor4 – StarWriter 4.0 Template [.vor]
  • vor3 – StarWriter 3.0 Template [.vor]
  • xhtml – XHTML Document [.html]
  • [...]


Installation:

aptitude install unoconv asciidoc docbook2od


Beispiele 1: Standard

Als erstes ein simples Beispiel, hier wird einfach “odt” in ein “pdf” umgewandelt. Sehr hilfreich ist auch sich die Optionen einmal anzuschauen.

# unoconv - Dienst starten
unoconv --listener &
# odt -> pdf 
unoconv -f pdf some-document.odt
# Standard 
(unoconv --server localhost --port 2002 --stdout -f pdf some-document.odt)

Beispiele 2: Vorlage

Wie bereits auf der Entwicklerseite zu lesen ist, hilf uns ein Screenshot nicht wirklich weiter, daher folgt ein zweites Beispiel mit Vorlagen.

# Beispiel Dateien herunterladen 
wget http://dag.wieers.com/cv/Makefile
wget http://dag.wieers.com/cv/curriculum-vitae-dag-wieers.txt
wget http://dag.wieers.com/cv/curriculum-vitae-docbook.ott

# unoconv - Dienst starten
unoconv --listener &
# resume.txt -> resume.xm
asciidoc -b docbook -d article -o resume.xml resume.txt
# resume.xml -> resume.tmp.odt
docbook2odf -f --params generate.meta=0 -o resume.tmp.odt resume.xml
# resume.tmp.odt -> resume.odt + Template
unoconv -f odt -t template.ott -o resume.odt resume.tmp.odt
# resume.tmp.odt -> resume.pdf + Template
unoconv -f pdf -t template.ott -o resume.pdf resume.odt
# resume.tmp.odt -> resume.html + Template
unoconv -f html -t template.ott -o resume.html resume.odt
# resume.tmp.odt -> resume.doc + Template
unoconv -f doc -t template.ott -o resume.doc resume.odt

Beispiele 3: Server <-> Client

Wie bereits erwähnt kann man den Dienst auch als Server starten und von anderen Rechnern darauf zugreifen.

# unoconv - Server-Dienst starten
unoconv --listener --server 1.2.3.4 --port 4567
# Client -> Server 
unoconv --server 1.2.3.4 --port 4567

Beispiele 4: PHP

Man kann dies nun auch in Shell-Skripten nutzen oder wie in diesem Beispiel in PHP einbinden.

$this->Filegenerator = new FilegeneratorComponent ($this->params["form"]['uploaddocfile']);
// if the filegenerator did all it's magic ok then process
if($this->Filegenerator)
// returns the text version of the PDF
$text = $this->Filegenerator->convertDocToTxt();
// returns the html of the PDF
$html = $this->Filegenerator->convertDocToHtml();
// returns the generated pdf file
$pdf = $this->Filegenerator->convertDocToPdf($doc_id);
}
<?php
/**
* Class Used to convert files.
*@author jamiescott.net
*/
class FilegeneratorComponent extends Object {

// input folder types
private $allowable_files = array ('application/msword' => 'doc' );
// variable set if the constuctor loaded correctly.
private $pass = false;
// store the file info from constuctor reference
private $fileinfo;

/**
* Enter description here...
*
* @param array $fileinfo
* Expected :
* (
[name] => test.doc
[type] => application/msword
[tmp_name] => /Applications/MAMP/tmp/php/php09PYNO
[error] => 0
[size] => 79360
)
*
*
* @return unknown
*/
function __construct($fileinfo) {

// folder to process all the files etc
define ( 'TMP_FOLDER', TMP . 'filegenerator/' . $this->generatefoldername () . '/' );

// where unoconv is installed
define ( 'UNOCONV_PATH', '/usr/bin/unoconv' );
// where to store pdf files
define ( 'PDFSTORE', ROOT . '/uploads/generatedpdfs/' );
// where to store doc files
define ( 'DOCSTORE', ROOT . '/uploads/docfiles/' );
// apache home dir
define ( 'APACHEHOME', '/home/apache' );
// set some shell enviroment vars
putenv ( "HOME=".APACHEHOME );
putenv ( "PWD=".APACHEHOME );

// check the file info is passed the tmp file is there and the correct file type is set
// and the tmp folder could be created
if (is_array ( $fileinfo ) &amp;amp;&amp;amp; file_exists ( $fileinfo ['tmp_name'] ) &amp;amp;&amp;amp; in_array ( $fileinfo ['type'], array_keys ( $this->allowable_files ) ) &amp;amp;&amp;amp; $this->createtmp ()) {

// bass by reference
$this->fileinfo = &amp;amp;$fileinfo;
// the constuctor ran ok
$this->pass = true;
// return true to the instantiation
return true;

} else {
// faild to instantiate
return false;

}

}

/**
*      * takes the file set in the constuctor and turns it into a pdf
* stores it in /uploads/docfiles and returns the filename
*
* @return filename if pdf was generated
*/
function convertDocToPdf($foldername=false) {

if ($this->pass) {

// generate a random name
$output_pdf_name = $this->generatefoldername () . '.pdf';

// move it to the tmp folder for processing
if (! copy ( $this->fileinfo ['tmp_name'], TMP_FOLDER . 'input.doc' ))
die ( 'Error copying the doc file' );

$command = UNOCONV_PATH;
$args = ' --server localhost --port 2002 --stdout -f pdf ' . TMP_FOLDER . 'input.doc';

$run = $command . $args;

//echo $run; die;
$pdf = shell_exec ( $run );
$end_of_line = strpos ( $pdf, "\n" );
$start_of_file = substr ( $pdf, 0, $end_of_line );

if (! eregi ( '%PDF', $start_of_file ))
die ( 'Error Generating the PDF file' );

if(!file_exists(PDFSTORE.$foldername)){
mkdir(PDFSTORE.$foldername);
}

// file saved
if(!$this->_createandsave($pdf, PDFSTORE.'/'.$foldername.'/', $output_pdf_name)){
die('Error Saving The PDF');
}

return $output_pdf_name;

}

}

/**
* Return a text version of the Doc
*
* @return unknown
*/
function convertDocToTxt() {

if ($this->pass) {

// move it to the tmp folder for processing
if (! copy ( $this->fileinfo ['tmp_name'], TMP_FOLDER . 'input.doc' ))
die ( 'Error copying the doc file' );

$command = UNOCONV_PATH;
$args = ' --server localhost --port 2002 --stdout -f txt ' . TMP_FOLDER . 'input.doc';

$run = $command . $args;

//echo $run; die;
$txt = shell_exec ( $run );

// guess that if there is less than this characters probably an error
if (strlen($txt) < 10)
die ( 'Error Generating the TXT' );

// return the txt from the PDF
return $txt;

}

}

/**
* Convert the do to heml and return the html
*
* @return unknown
*/
function convertDocToHtml() {

if ($this->pass) {

// move it to the tmp folder for processing
if (! copy ( $this->fileinfo ['tmp_name'], TMP_FOLDER . 'input.doc' ))
die ( 'Error copying the doc file' );

$command = UNOCONV_PATH;
$args = ' --server localhost --port 2002 --stdout -f html ' . TMP_FOLDER . 'input.doc';

$run = $command . $args;

//echo $run; die;
$html= shell_exec ( $run );
$end_of_line = strpos ( $html, "\n" );
$start_of_file = substr ( $html, 0, $end_of_line );

if (! eregi ( 'HTML', $start_of_file ))
die ( 'Error Generating the HTML' );

// return the txt from the PDF
return $html;

}

}
/**
* Create file and store data
*
* @param unknown_type $data
* @param unknown_type $location
* @return unknown
*/
function _createandsave($data, $location, $file) {

if (is_writable ( $location )) {

// In our example we're opening $filename in append mode.
// The file pointer is at the bottom of the file hence
// that's where $somecontent will go when we fwrite() it.
if (! $handle = fopen ( $location.$file, 'w' )) {
trigger_error("Cannot open file ($location$file)");
return false;
}

// Write $somecontent to our opened file.
if (fwrite ( $handle, $data ) === FALSE) {
trigger_error("Cannot write to file ($location$file)");
return false;
}

fclose ( $handle );
return true;

} else {
trigger_error("The file $location.$file is not writable");
return false;
}

}

function __destruct() {

// remove the tmp folder

if (file_exists ( TMP_FOLDER ) &amp;amp;&amp;amp; strlen ( TMP_FOLDER ) > 4)
$this->removetmp ();

}

/**
* Create the tmp directory to hold and process the files
*
* @return unknown
*/
function createtmp() {

if (is_writable ( TMP )) {

if (mkdir ( TMP_FOLDER ))
return true;

} else {

return false;
}

return false;

}

/**
* Delete the tmp dir
*
* @return unknown
*/
function removetmp() {

if (strlen ( TMP_FOLDER ) > 3 &amp;amp;&amp;amp; file_exists ( TMP_FOLDER )) {

if ($this->recursive_remove_directory ( TMP_FOLDER ))
return true;

}

return false;
}

/**
* Return a rendom string for the folder name
*
* @return unknown
*/
function generatefoldername() {

return md5 ( microtime () );

}

/**
* Recursivly delete directroy or empty it
*
* @param unknown_type $directory
* @param unknown_type $empty
* @return unknown
*/
function recursive_remove_directory($directory, $empty = FALSE) {
// if the path has a slash at the end we remove it here
if (substr ( $directory, - 1 ) == '/') {
$directory = substr ( $directory, 0, - 1 );
}

// if the path is not valid or is not a directory ...
if (! file_exists ( $directory ) || ! is_dir ( $directory )) {
// ... we return false and exit the function
return FALSE;

// ... if the path is not readable
} elseif (! is_readable ( $directory )) {
// ... we return false and exit the function
return FALSE;

// ... else if the path is readable
} else {

// we open the directory
$handle = opendir ( $directory );

// and scan through the items inside
while ( FALSE !== ($item = readdir ( $handle )) ) {
// if the filepointer is not the current directory
// or the parent directory
if ($item != '.' &amp;amp;&amp;amp; $item != '..') {
// we build the new path to delete
$path = $directory . '/' . $item;

// if the new path is a directory
if (is_dir ( $path )) {
// we call this function with the new path
recursive_remove_directory ( $path );

// if the new path is a file
} else {
// we remove the file
unlink ( $path );
}
}
}
// close the directory
closedir ( $handle );

// if the option to empty is not set to true
if ($empty == FALSE) {
// try to delete the now empty directory
if (! rmdir ( $directory )) {
// return false if not possible
return FALSE;
}
}
// return success
return TRUE;
}
}
}
?>

CLI Companion – die GUI in der Konsole

CLI Companion ist ein Terminal mit integrierter GUI oder sollte ich besser sagen ein GUI mit integriertem Terminal? Egal. Du kannst Shell-Kommandos (mit Beschreibung) abspeichern, so dass du diese mit der Zeit lernen kannst.


Installation:

sudo add-apt-repository ppa:clicompanion-devs/clicompanion-nightlies
sudo apt-get update
sudo apt-get install clicompanion


Beispiel:

CLICompanion

CLI Companion


Quelle:
launchpad.net/clicompanion

Linux-Server analysieren

Dieser Blog-Post ist als Antwort auf die Frage “Nun würde mich mal interessieren, welche Tools euch zum Administrieren eines Linux Servers helfen und speziell auch welchen Taskmanager ihr verwendet.”, aus dem folgendem Blog gedacht. -> infoblog.li/besserer-taskmanager-fuer-den-linux-server-htop/


1.) Überblick verschaffen

Wenn man nicht genau weiß, wo das Problem liegt, muss man sich erst-einmal einen groben Überblick über die Situation verschaffen, dabei helfen die folgenden Befehle:


1.1) top – CPU- und Arbeitsspeicher-Auslastung analysieren

top


1 -> zeigt die Auslastung der einzelnen CPUs an

b / B -> hebt die aktiven Prozesse hervor

z -> wie “b oder B” nur mit Farbe ;-)

i -> zeigt nur aktive Prozesse an

M -> zeigt die Prozesse sortiert nach dem Speicherverbrauch an

P -> zeigt die Prozesse sortiert nach der CPU-Last an

d -> gibt die Aktualisierungszeit an

k -> kill – tötet einen Prozess




1.2) df / du – Festplattenverbrauch analysieren

df -h

-h -> auch für Menschen lesbar (–human-readable)



df -h

df -h


Wenn wir den Speicherverbrauch nun weiter analysieren müssen, weil z.B. ein Verzeichnis unter /var zu groß ist, können wir dies mit “du” machen.

du -h | grep "^[0-9,]*[MG]" | sort -hr | less


Erklärung: “du” gibt die Größe von Dateien und Verzeichnissen aus “-h” zeigt dies leserlich an, “|” der Pipe leitet die Ausgabe weiter, “grep” ist universal einsetzbar, um etwas (Dateien / Ausgaben…) zu durchsuchen und wir suchen alle Zeilen, in denen “^” am Anfang eine Zahl  “0 1 2 3 4 5 6 7 8 9″ oder / und “,” in beliebiger Häufigkeit “*” gefolgt von einem großen “M” oder einem “G”. Diese Ausgabe wird per Pipe “|” an “sort” weitergegeben, wo diese Ausgabe nach sortiert wird und “|” schließlich mit “less” angezeigt wird. (mit q kann man less wieder beenden) Wer mehr über Reguläre Ausdrücken lernen möchte, kann sich dies hier antun ;-) -> http://linuxwiki.de/


Wer will kann dich solche “Funktionen” einfach in die .bashrc eintragen…

alias du_suckup='du -h | grep "^[0-9,]*[MG]" | sort -hr | less'


1.3) lsof – Beziehung zwischen Dateien & Prozessen analysieren

Der Befehl “lsof” kann eingesetzt werden, um z.B. zu analysieren, welcher Prozess oder Anwender momentan eine bestimmte Datei verwendet oder auch welcher User, welchen Port offen hält + die dazugehörige PID (ProzessID)…

lsof -a -i -u www-data


lsof - Beispiel

lsof - Beispiel


Wer mehr zu dem Thema erfahren möchte, kann in einen alten Blog-Beitrag weiter lesen -> suckup.de/blog/2010/02/22/lsof-list-open-files


2.) Prozesse analysieren

Hier verweise ich einfach mal auf zwei alte Blog-Beiträge.:

2.1) der Befehl “ps”, um bestimmte Prozesse aufzuspüren -> suckup.de/blog/2010/09/14/shell-ps-prozessstatus

2.2) und noch einige Programm, um den verbrauchten Arbeitsspeicher zu analysieren -> suckup.de/blog/2010/02/08/speicherverbrauch-anzeigen-lassen


3.) Hardware analysieren

Auch hier verweise ich auf einen alten Beitrag.:

3.1) hier noch eine Sammlung von Befehlen mit denen man z.B. die Festplatte auf Fehler prüfen kann ->  http://suckup.de/blog/2010/02/08/systeminfos-anzeigen-lassen/


4.) Netzwerk analysieren

Und auch hier verweise ich auf ein paar alte Beiträge.:

4.1) mit “TCPdump” kannst du den Netztraffik analysieren (sniffen) ähnlich wie Wireshark, nur auf der Konsole. :-) -> suckup.de/blog/2010/08/02/tcpdump-howto

4.2) offene Ports analysieren mit “nmap” + “fuser” -> suckup.de/blog/2010/03/28/offene-ports-analysieren


weitere Schritte

Mit Hilfe dieser Befehl sollte man einige Problem bereits eingrenzen können, ich würde parallel unter /var/log/ nachschauen, ob irgendetwas auffälliges in den Logfiles steht …

ls -altr /var/log/

-> Dateien rekursiv nach ihrer letzten Änderung anzeigen (neuste Datei steht nun unten)

tail -f test.log

-> das Logfile wird nun kontinuierlich mit-gelesen, so dass man neu auftretende Fehler bemerkt