ImpressumFrank Seitz Wassermühlenstr. 2 25436 Uetersen E-Mail: fsfseitz.de Tel.: +49-176-78243503 Alle Artikel Inhaltsverzeichnis Rechtliche Hinweise Code auf GitHub Code auf meta::cpan KategorienAbonnieren |
Mittwoch, 21. September 2022Perl: Mehrzeilige Ersetzung auf DateienIn Dateien eines Verzeichnisbaums wollen wir eine mehrzeilige Ersetzung vornehmen. Unter Nutzung von Perl geht dies mit einem Einzeiler: $ find DIR ... | xargs perl -0777 -p -i -E 's/REGEX/REPLACEMENT/gms'
Hierbei ist REGEX ein Regulärer Ausdruck, der Text über mehreren Zeilen matchen kann. Wie funktioniert der Aufruf? Perl verarbeitet die Dateien, die von xargs(1) als Argumente übergeben werden, und behandelt sie gemäß den angegebenen Optionen:
Beispiel Entferne im Verzeichnisbaum DIR die Inline-Dokumentation (POD) aus allen .pm-Dateien: $ find DIR -name '*.pm' | xargs perl -0777 -p -i -E 's/^=[a-z].*?^=cut\n//gms'
Freitag, 20. August 2021Mojolicious: Webanwendung auf Entwicklungsrechner einrichtenWir entwickeln auf Basis von Mojolicious eine Webanwendung NAME und möchten, dass diese
Diese Anforderungen lassen sich leicht mit morbo als Webserver in Kombination mit der Prozesssteuerung systemd realisieren. Hierbei ist morbo der Entwicklungs-Webserver von Mojolicious und systemd die fundamentale Prozesssteuerung vieler Linux-Systeme (ein moderner Ersatz für init). Ein zusätzlicher Webserver wie nginx oder apache wird nicht benötigt. Die Unit-Datei NAME.service, mit der wir den Service gegenüber systemd definieren, ist recht einfach (Erläuterungen zur einzig interessanten Zeile ExecStart siehe im Folgenden): [Unit]
Description=DESCRIPTION
After=network.target
[Service]
Type=simple
User=USER
ExecStart=bash -lc "morbo PROGRAM --listen http://*:PORT --watch SOURCEDIR --verbose >LOGFILE.log 2>&1"
[Install]
WantedBy=multi-user.target
Hierbei ist:
Die systemd Unit-Datei kopieren wir in das Verzeichnis /etc/systemd/system. Mit folgender Kommandofolge machen wir die Anwendung dauerhaft und sofort verfügbar: # systemctl daemon-reload # Konfigurationsänderung systemd bekannt machen # systemctl enable NAME # Service aktivieren, so dass die Anwendung beim Booten gestartet wird # systemctl start NAME # Service sofort verfügbar machen (ohne Rebooten zu müssen) Den Status überprüfen wir mit: # systemctl status NAME Die Anwendung kann jederzeit gestoppt und gestartet werden mit: # systemctl stop NAME # systemctl start NAME Der automatische Start beim Booten lässt sich ab- und anschalten mit: # systemctl disable NAME # systemctl enable NAME Die Liste aller vorhandenen Unit-Files und ihres jeweiligen Status: # systemctl list-unit-files Vorschlag für eine Verzeichnisstruktur im Homeverzeichnis von USER: ~/etc/systemd/NAME.service # Unit-Datei, per Symlink referenziert von /etc/systemd/system aus, Qwner ist USER ~/var/log/NAME.log # Logdatei ~/opt/NAME/... # Projektverzeichnis Die konkrete Kommandozeile zum Starten der Anwendung lautet dann: morbo ~/opt/NAME/bin/PROGRAM --listen http://*:PORT --watch ~/opt/NAME --verbose >~/var/log/NAME.log 2>&1 nohupnohup morbo ~/opt/NAME/bin/PROGRAM --listen http://*:PORT --watch ~/opt/NAME --verbose >~/var/log/NAME.log 2>&1 & Links
Montag, 25. Januar 2021Debian: Netzwerk-Installation von USB-StickWer im Netz nach "debian installation" sucht, stößt auf folgendes Dokument: Debian GNU/Linux Installation Guide, welches erschlagend ist. Dabei ist die Installation von Debian sensationell einfach:
Voraussetzung hierfür ist, dass der Rechner, auf dem die Installation stattfindet, eine Verbindung ins Internet aufbauen kann (per Ethernet oder WLAN). Zusätzlicher Vorteil: Der Stick kann auch im Recovery-Fall genutzt werden (eine Netzwerkverbindung ist in dem Fall nicht nötig). LinksSamstag, 9. Februar 2019Shell: Umgebung universell nutzbar aufsetzenFür die Ausführung von Programmen ist es oft notwendig, dass bestimmte Umgebungsvariablen gesetzt sind. Dies kann allgemeine Variablen betreffen, wie z.B. den Suchpfad PATH oder programmspezifische Variablen, wie z.B. ORACLE_HOME. Die Frage ist, wie man eine Shell-Umgebung aufsetzt, so dass diese möglichst universell nutzbar ist, insbesondere, wenn Programme auch von außerhalb der eigenen interaktiven Sitzung, z.B. via cron, sudo oder ssh ausgeführt werden sollen. Die Shell (bash, ksh, sh) führt bei jedem Login die nutzerspezifische Datei .profile aus. Werden in dieser Datei alle Environment-Variablen gesetzt (und exportiert), kann die Umgebung leicht in anderen Kontexten genutzt werden. Die Variablen in einer rc-Datei (.bashrc oder .kshrc) zu setzen ist verkehrt, da der Inhalt einer rc-Datei ausschließlich bei interaktiven Sitzungen ausgeführt wird und daher ausschließlich Definitionen enthalten sollte, die für eine Benutzerinteraktion mit der Shell relevant sind (Beispielsweise: Aussehen des Prompt, Aliase, Länge der History, Farben für ls(1), usw.). TTY-Login, SSH LoginDies ist der normale Anwendungsfall. Eine Login-Shell wird gestartet und im Zuge dessen .profile ausgeführt. Ausführung eines Remote-Kommandos per SSHDas Remote-Kommando ersetzt in diesem Fall die Login-Shell. Wir sorgen mit bash -l dafür, dass die Login-Umgebung hergestellt wird: $ ssh USER@HOST "bash -lc 'COMMAND'" X11 Terminal Window LoginHier ist es wichtig, dass beim Öffnen des Terminals eine Login-Shell ausgeführt wird. Ggf. ist es nötig, hierfür eine Option in den Einstellungen zu aktivieren. In den Einstellungen des Xfce Terminals heißt die Option "Run command as login shell", ist per Default dekativert und sollte aktiviert werden. sudoBei sudo sorgt die Option -i dafür, dass das Kommando an eine Login-Shell übergeben wird: $ sudo -iu USER COMMAND cron, eigene crontabWie bei der Ausführung eines Remote-Kommandos per ssh sorgen wir mit bash -l dafür, dass die Login-Umgebung vor Ausführung des Kommandos hergestellt wird. * * * * * bash -lc COMMAND cron, fremde crontabAnstelle der bash nutzen wir sudo (wie oben): * * * * * sudo -iu USER COMMAND Dienstag, 10. Mai 2016Debian: HP Color LaserJet Pro MFP M277dw einrichtenDrucker-KonfigurationKonfigurationsprogramm des Druckers unter seiner IP im lokalen Netz, z.B. http://192.168.178.24/ Linux-Treiber und HilfsprogrammeHPLIB (HP Linux Imaging and Printing) installieren: # apt-get install hplip hplib-gui hplib-doc Lokale Dokumentation: file:///usr/share/doc/hplip-doc/index.html Überprüfung der Abhängigkeiten, Permissions etc. von HPLIP und Nachinstallation von fehlenden Paketen (dies ist in diesem speziellen Fall durch die Installation per apt-get - was ungewöhnlich ist - nicht sicher gestellt): $ hp-check Verfügbarkeit des Druckers via USB, Ethernet, WLAN prüfen: $ hp-probe Treiber des Druckers herunterladen und Drucker und Fax rudimentär einrichten: $ hp-setup -i HP Device Manger: $ hp-toolbox CUPSDer Drucker unter CUPS: http://localhost:631 Drucker zum Default-Drucker machen (für lpr/lpq): $ lpoptions -d PRINTER ScannenMit dem Programm hp-scan kann vom Flachbett oder über den Dokumenteneinzug gescannt und das Ergebnis lokal gespeichert werden, ohne mit einem USB-Stick hantieren zu müssen. Außerdem hat das Programm diverse Optionen, mit denen auf das Scan-Ergebnis Einfluss genommen werden kann ($ man hp-scan). Beispiel: Scanne alle A4-Seiten (--size=a4), die auf der automatischen Dokumentenzufuhr (--adf) eingelegt sind in Farbe (--mode=color) mit 150 DPI (--resolution=150) und füge sie zu einem PDF-Dokument (Dateiendung .pdf) zusammen: $ hp-scan --adf --size=a4 --mode=color --resolution=150 --file=FILE.pdf Im Falle von PDF sind die Auflösungen 75, 100, 150, 200, 300 DPI möglich, bei JPG oder PNG bis zu 1200 DPI. LinksFreitag, 9. Oktober 2015Grep: Finde in Dateibaum Worte eines bestimmten MustersFinde innerhalb des Dateibaums DIR alle Vorkommen des Wortmusters REGEX und gib die Wortliste sortiert aus (GNU grep): $ grep -oPhr REGEX DIR | sort | uniq
Soll die Menge der Dateien näher eingeschränkt werden, lässt sich dies durch ein vorgeschaltetes find erreichen (Option -r bei grep entfällt dann): $ find DIR -type f -print0 | xargs -0 grep -oPh REGEX | sort | uniq
AnwendungsfallFinde in Dateibaum app mit Perl-Quelltexten die Namen aller verwendeten Klassen, die mit "R1::" beginnen: $ grep -oPhr 'R1::[:\w]+' app | sort | uniq R1::AppHome R1::Array R1::CheckValue R1::ClassLoader R1::Config R1::Dbms::Database ... LinksMittwoch, 22. Juli 2015Globale in-place Textersetzung mit sed oder PerlMitunter möchte man einen Text oder ein Muster global über mehreren Dateien FILE ... ersetzen. Unter Unix/Linux geht das am einfachsten mit sed (GNU): $ sed -i s/PATTERN/REPLACEMENT/g FILE ... Das Gleiche, angewendet auf einen Dateibaum DIR: $ find DIR -type f | xargs sed -i s/PATTERN/REPLACEMENT/g Perl bietet die sed-Funktionaltät mit einer ähnlich einfachen Kommandozeile: $ perl -pi -e s/PATTERN/REPLACEMENT/g FILE ... Der Vorteil von Perl gegenüber sed ist dessen leistungsfähigere Regex-Engine. Bei GNU sed lassen sich mit Option -r "Extended Regular Expressions" einschalten (die eher an Perl Regexes heranreichen). WICHTIG: Die Ersetzungsoperation wird zeilenweise angewendet, d.h. eine Ersetzung über Zeilengrenzen hinweg ist nicht möglich. LinksSonntag, 31. Mai 2015Debian Testing (stretch) mit Xfce DesktopSpezielle Anpassungen nach Installation von Debian Testing mit Xfce Desktop. Desktop-Verzeichnisse verlegenBeim ersten Login werden verschiedene Standardverzeichnisse im Home-Verzeichnis des Benutzers angelegt: Desktop Documents Downloads Music Pictures Public Templates Videos Die Pfade dieser Verzeichnisse können benutzerspezifisch in der Datei ~/.config/user-dirs.dirs umdefiniert werden. Eine globale Umdefinition ist in /etc/xdg/user-dirs.defaults möglich. Siehe auch keyboard(1). Dead Keys und Caps Lock eleminierenUnter Debian wird diese Einstellung in der Datei /etc/default/keyboard vorgenommen. Die Konfiguration gilt sowohl für die Console als auch unter X11. XKBMODEL="pc105" XKBLAYOUT="de" XKBVARIANT="nodeadkeys" <-- schaltet Dead Keys ab XKBOPTIONS="caps:none" <-- schaltet Caps Lock ab BACKSPACE="guess" In /usr/share/X11/xkb/rules/xorg.lst sind alle Einstellmöglichkeiten (model, layout, variant, option) aufgezählt. System Sounds aktivieren, in Thunderbird bei Mailempfang
Exim4 - Smarthost konfigurierenExim4 so konfigurieren, dass sämtliche Mail an einen Smarthost delegiert wird, mit: # dpkg-reconfigure exim4-config Option auswhlen: "mail sent by smarthost; no local mail" Das Programm schreibt am Ende die Konfigurationsinformation in die Datei /etc/exim4/update-exim4.conf.conf. Die Authentisierung auf dem Smarthost wird in die Datei /etc/exim4/passwd.client eingetragen. Hat der Server keine TLS-Verschlüsselung wird die Macro-Definition AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS='yes' zur Datei /etc/exim4/update-exim4.conf.conf hinzugefügt. Emacs Keybindings auf EingabefeldernEmacs-Tastaturkommandos sind auf den Eingabefeldern der GUI-Applikationen verfügbar, wenn als globale Einstellung vorgenommen wird: Applications / Settings / Settings Editor / xsettings / Gtk / KeyThemeName / Edit / Value=Emacs Flash-Plugin für IceweaselDas Flash-Plugin für den Mozilla-Abkömmling Iceweasel kann bei Adobe heruntergeladen werden: https://get.adobe.com/flashplayer/. Installation: die .tar.gz Datei lokal entpacken und die darin enthaltene Shared Libraray ins Plugin-Verzeichnis des Browsers kopieren. # cp libflashplayer.so /usr/lib/mozilla/plugins Unter Add Ons / Plugins kann das Plugin im laufenden Browser aktiviert werden. Andernfalls wird es ab dem nächsten Neustart des Browsers genutzt. Kernel-Modul für Intel WLAN-AdapterDas Kernel-Modul für den Intel WLAN-Adapter (meines Rechners) ist proprietär und wird daher bei der Debian-Installation nicht automatisch mit installiert. Er ist jedoch im non-free Bereich verüfgbar und kann einfach nachinstalliert werden (vorausgesetzt, dass in /etc/apt/sources.list der Bereich non-free eingetragen ist): # apt-get install firmware-iwlwifi Kernel-Modul für Realtek Ethernet-KarteDasselbe wie für den WLAN-Adapter gilt für die Ethernetkarte. Das Fehlen des Moduls rtl8411-2.fw wird beim Booten bemängelt, es scheint jedoch nicht wirklich benötigt zu werden, da das Ethernet-Interface auch ohne das Modul funktioniert. Gegen die Fehlermeldung hilft: # apt-get install firmware-realtek NetzwerkmanagerXfce hat keinen eigenen Netzwerkmanager für die Verwaltung von LAN- und WLAN-Verbindungen. Ein leichtgewichtiger Netzwerkmanager ist Wicd. Installation: # apt-get install wicd Er installiert sich als Autostart-Applikation und wird aus dem Panel oder unter Applications / Internet / Wicd Network Manager aufgerufen. Beim Start sucht wicd nach den WLAN-Netzen der Umgebung. Führt dies zu der Meldung "No wireless networks found", ist möglicherweise das Wireless Interface (meist wlan0) nicht unter den Preferences eingetragen. Das Menü zum Aufruf des Dialogs verbirgt sich hinter dem Pfeil oben rechts. Skype2016-08-14 Debian-Paket (skypeforlinux-64-alpha.deb) von skype.com herunterladen (Link siehe https://wiki.debian.org/skype). Installation: # apt-get update # gdebi skypeforlinux-64-alpha.deb 2015-05-23 Installation (32-Bit-Programm auf 64-Bit-System): # dpkg --add-architecture i386 # apt-get update # wget -O skype-install.deb http://www.skype.com/go/getskype-linux-deb # dpkg -i skype-install.deb # apt-get -f install Siehe: https://wiki.debian.org/skype VimPer Default ist ein einfacher vi-Klon installiert, der im Insert-Mode die Escape-Sequenzen der Pfeiltasten nicht behandelt. Vim hat dieses Problem nicht: # apt-get install vim Ferner lohnt es sich, in die Vim-Konfigurationsdatei /etc/vim/vimrc zu schauen und dort weitere Optionen zu aktivieren, z.B. Mausunterstützung und Syntax-Highlighting. Bell abschaltenDie Bell unterliegt nicht den Soundeinstellungen und ist extrem laut. Mit $ xset b off lässt sie sich abschalten. Soll das immer gelten, kann das Kommando unter Applications / Settings / Session and Startup / Application Autostart / Add zu den Autostart-Kommandos hinzugefügt werden. Java 8Quelle definieren: # vi /etc/apt/sources.list.d/webupd8team-java.list deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main Installation: # apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 # apt-get update # apt-get install oracle-java8-installer Version prüfen: # java -version java version "1.8.0_45" Java(TM) SE Runtime Environment (build 1.8.0_45-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode) Nvidia Grafikkarte mit BumblebeeInstallation: # apt-get install bumblebee bumblebee-nvidia # shutdown -r now Grafikanwendung starten: $ optirun CMD Status der Nvidia-Karte prüfen: # cat /proc/acpi/bbswitch Weitere Infos: Sonntag, 24. Mai 2015Unix Epoch in lesbare Zeitangabe wandeln und umgekehrtUm einen Unix Epoch-Wert (Sekunden seit 1.1.1970 0 Uhr UTC) mit Shell-Mitteln in eine lesbare Zeitangabe (lokale Zeitzone) zu wandeln, kann man sich des Kommandos date bedienen: $ date -d @1406546442 Mo 28. Jul 13:20:42 CEST 2014 Dasselbe in einer besser strukturierten Darstellung: $ date -d @1406546442 '+%F %T %z' 2014-07-28 13:20:42 +0200 Hierbei ist: %F - Datum %T - Uhrzeit %z - Zeitzone als hhmm-Offset Soll die Ausgabe in einer anderen als der lokalen Zeitzone erfolgen, wird die Environment-Variable TZ entsprechend gesetzt (hier Ausgabe in UTC): $ TZ=UTC date -d @1406546442 '+%F %T %z' 2014-07-28 11:20:42 +0000 Dasselbe im ISO-8601 Datumsformat (sekundengenau): $ date -d @1406546442 --iso-8601=seconds 2014-07-28T13:20:42+0200 Die Umkehrung - also die Wandlung einer lesbaren Zeitangabe (der lokalen Zeitzone, wenn keine angegeben ist, hier: MESZ) in Epoch - ist auch möglich: $ date -d '2014-07-28 13:20:42' +%s 1406546442 Soll die Interpretation in einer anderen Zeitzone als der lokalen Zeitzone erfolgen, kann dies durch Setzen der Environmentvariable TZ erreicht werden: $ TZ=UTC date -d '2014-07-28 13:20:42' +%s 1406553642 # Differenz zu oben: -7200, also minus 2 Stunden gegenüber MESZ Der aktuelle Zeitpunkt als Epoch-Wert: $ date +%s 1406548003 Details siehe date(1) Manpage Samstag, 23. Mai 2015fslint: Datei-Dubletten findenUm Datei-Dubletten in einem Verzeichnis oder Dateibaum zu finden, gibt es unter Unix/Linux meines Wissens keine Standard-Toolchain. Es existiert aber eine Programmsammlung namens fslint, die u.a. auch ein Programm zum Finden von Dubletten enthält. Installation (Debian): # apt-get install fslint Ungewöhnlich an dieser Programmsammlung ist, dass die enthaltenen Kommandozeilenprogramme nicht in ein Verzeichnis des Suchpfads installiert werden, sondern zunächst nur über das GUI-Programm fslint-gui genutzt werden können. Die Kommandozeilenprogramme werden von der Shell erst gefunden, wenn man PATH um den Installationspfad der Werkzeugsammlung erweitert: $ PATH=/usr/share/fslint/fslint:$PATH Auch existieren zu den einzelnen Programmen - außer dem GUI-Programm - keine Manpages. Informationen über die Benutzung erhält man bei Aufruf des jeweiligen Programms mit der Option -h. Eine Übersicht über die Programmsammlung: $ man fslint-gui Das Programm zum Finden von Dubletten heißt findup. Beschreibung des Programms und Beispiele: $ findup -h Finde alle Dubletten in Dateibaum DIR (also rekursiv) und zeige diese an: $ findup DIR Lösche alle Dubletten in Dateibaum DIR - bis auf jeweils ein Exemplar: $ findup -d DIR Bei Angabe der Option -r werden Subverzeichnisse nicht durchsucht. Links: Samstag, 17. Januar 2015Dateibaum chronologisch sortiert anzeigenMitunter weiß (oder vermutet) man, dass ein Programm Dateien in einen Bereich des Dateisystems schreibt, aber man weiß nicht genau in welche Verzeichnisse und wie die Dateien heißen. Dem lässt sich auf den Grund gehen, indem man sich unmittelbar nach Beendigung des Programms die Pfade des betreffenden Dateibaums chronlogisch nach dem letzten Modifikationszeitpunkt sortiert anzeigen lässt. Unter den letzten Pfaden in der Liste sollten die gesuchten Dateien zu finden sein. Die Unix-Kommandozeile (mit GNU find), die dies leistet, lautet: $ find DIR -type f -printf '%T+ %p\n' | sort Hierbei ist DIR das Wurzelverzeichnis des untersuchten Dateibaums. Für jede Datei wird eine Zeile ausgegeben, bestehend aus der mtime in ISO-ähnlicher Darstellung (%T+) und dem Pfad (%p) der Datei. Details siehe find(1) Manpage Samstag, 31. Mai 2014Linux Kernelparameter ändernKernel-Parameter können zur Laufzeit des Linux-Systems mit dem Kommando sysctl geändert werden. Typischer Problemfall: Beim Starten meldet ein Programm (hier der PostgreSQL-Server), dass ein Kernel-Parameter (hier die maximale Größe eines Shared-Memory-Segments) nicht ausreicht: The PostgreSQL server failed to start. FATAL: could not create shared memory segment. DETAIL: Failed system call was shmget(key=5432001, size=536084480, 03600). HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. Der betreffende Kernel-Parameter (hier kernel.shmmax) kann mit $ sysctl kernel.shmmax kernel.shmmax = 33554432 abgefragt werden. Man sieht, der Wert ist zu klein. Mit # sysctl kernel.shmmax=600000000 kernel.shmmax = 600000000 kann der Parameter auf einen ausreichenden Wert gesetzt werden. Zum Setzen muss man über root-Rechte verfügen. Anschließend sollte der Fehler nicht mehr auftreten. Um die Setzung permanent zu machen, muss sie in eine der Konfigurationsdateien des Systems eingetragen werden, typischerweise /etc/sysctl.conf oder in eine selbst erstellte Datei in /etc/sysctl.d, z.B. /etc/sysctl.d/NN-local.conf (NN ist der numerische Wert, der die Postion in der Ladereihenfolge festlegt). Eine selbst erstellte Datei hat den Vorteil, dass Änderungskonflikte vermieden werden, wenn die Paketverwaltung Änderungen an der globalen Datei /etc/sysctl.conf vornimmt. Dienstag, 19. Februar 2013Shell: stderr auf Pipe umleiten und andere dup-OperationenEiner der weniger einleuchtenden Shell-Operatoren ist der Operator >&. Den Klassiker, die Umlenkung von stdout und stderr in eine Datei, $ cmd >/tmp/file 2>&1 kennt jeder, der häufiger unter Unix unterwegs ist. Es stellt sich dabei aber immer leicht die Frage: Wie war das nochmal? Muss 2>&1 vor der Umlenkung >/tmp/file stehen? Oder dahinter? Gleichgültig ist die Reihenfolge jedenfalls nicht. Die Beschreibung auf der Bash-Manpage ist recht knapp:
Das heißt, man kann den Operator N>&M als Zuweisung verstehen: Das Ausgabeziel (Terminal, Datei oder Pipe), das seitens des schreibenden Prozesses über Deskriptor M erreicht wird, wird von der Shell (zusätzlich) mit Deskriptor N verbunden. Alles, was der schreibende Prozess auf Desktiptor N schreibt, gelangt somit an das gleiche Ziel wie das, was er auf Deskriptor M schreibt. Liegen mehrere Umlenkungsoperationen vor, werden diese von links nach rechts ausgewertet. Es folgen einige Anwendungsfälle. Stderr und stdout gemeinsam auf eine Pipe lenken$ cmd1 2>&1 | cmd2
Ergebnis: stdout und stderr gehen auf die Pipe. Stderr statt stdout auf eine Pipe lenken$ cmd1 2>&1 >/dev/null | cmd2
Ergebnis: stderr geht auf die Pipe, stdout geht nach /dev/null. Stdout und stderr vertauschen$ cmd 3>&1 1>&2 2>&3 3>&-
Ergebnis: stdout und stderr sind vertauscht. Montag, 26. November 2012meld: Unterschiede zwischen Dateien anzeigen und bearbeitenEin ausgezeichnetes Programm zur Visualisierung und interaktiven Bearbeitung von Unterschieden zwischen Dateien ist meld. Es unterstützt
Vergleich zweier Dateien: $ meld FILE1 FILE2 Die Unterschiede werden grafisch dargestellt. Innerhalb differierender Zeilen werden die Unterschiede bis auf Zeichenebene markiert. Die Dateien können mithilfe des eingebauten Editors bearbeitet werden. Dabei entstehende Differenzen werden just-in-time neu berechnet und angezeigt. Mittels Klick auf einen der eingeblendeten Pfeile (s. Sceenshot) wird eine Änderung insgesamt in die gegenüberliegende Datei übertragen, die Differenz also eleminiert.
Links: Sonntag, 24. Juni 2012Wechseldatenträger mit Ext[234]-Dateisystem ein Label gebenWechseldatenträger (USB Festplatten, Memory Sticks) werden unter Linux automatisch nach /media/<name> gemountet. Hat der Datenträger ein Label, wird dieses als (sprechender) <name> verwendet. Label setzen: # tune2fs -L <name> <device> Sonntag, 10. Juni 2012Liste der geöffneten TCP-PortsZeige die Liste der geöffneten TCP-Ports und welche Programme sie nutzen: # netstat -pant -p : Zeige PID und Programmnamen -a : Zeige sowohl Listening- als auch Non-Listening-Sockets -n : Zeige numerische Werte statt symbolischer Host-, Port- und Benutzernamen -t : Zeige TCP-Ports (-u UDP-Ports) LinksDonnerstag, 9. Februar 2012Android: Entwicklungsumgebung unter Linux aufsetzenAuf dem Adroid Developer Portal ist unter dem Einstiegspunkt Installing the SDK beschrieben, wie eine Android-Entwicklungsumgebung aufgesetzt wird. Die Information ist allerdings über etliche Seiten verstreut, weswegen ich die Schritte hier zusammenfasse. Unser Ziel ist die Einrichtung einer Android-Entwicklungsumgebung unter Linux mit anschließender Erstellung eines "Hello World"-Programms, das wir unter Android ausprobieren können. Wir arbeiten an der Kommandozeile ohne die Verwendung einer IDE (Eclipse), denn wir wollen das Android SDK zunächst direkt, ohne den Mantel einer IDE kennen lernen. Alle hier genannten Dateinamen, Versionsnummern und Screenshots beziehen sich auf den Zeitpunkt der Erstellung des Blog-Eintrags und können sich danach natürlich geändert haben. Anhand der im Text angegebenen Links können diese Angaben geprüft und ggf. sinngemäß ersetzt werden. Wir setzten voraus, dass das Java SE JDK und Ant auf dem System bereits installiert sind. Sollte das nicht der Fall sein, lässt sich dies unter Debian leicht nachholen: $ apt-get install openjdk-6-jdk $ apt-get install ant 1. Als erstes legen ein Verzeichnis android an. Der Name und der Ort im Dateisystem sind gleichgültig. In diesem Verzeichnis befindet sich nach Abschluss der folgenden Schritte die Android Entwicklungsumgebung mit dem "Hello World"-Programm. $ mkdir ~/android $ cd ~/android 2. Als nächstes laden wir das SDK Starter Package von der http://developer.android.com/sdk/index.html herunter. Für Linux ist dies die Datei android-sdk_r16-linux.tgz. $ wget http://dl.google.com/android/android-sdk_r16-linux.tgz $ tar xvzf android-sdk_r16-linux.tgz Der Tarball entpackt sich in das Subverzeichnis android-sdk-linux. Das SDK Starter-Package enthält noch nicht die volle Entwicklungsumgebung, sondern Suchpfad erweitern$ PATH=~/android/android-sdk-linux/tools:$PATH SDK-Manager aufrufen und weitere Komponenten nachladen$ android
Suchpfad erweitern$ PATH=~/android/android-sdk-linux/platform-tools:$PATH Android Virtual Device (AVD) erzeugenhttp://developer.android.com/guide/developing/devices/managing-avds.html Wiederum android aufrufen und $ android Menüpunkt "Tools/Manage AVDs..." Name: Target: Programm "Hello World" generierenhttp://developer.android.com/resources/tutorials/hello-world.html $ android create project \ --package com.example.helloandroid \ --activity HelloAndroid \ --target 2 \ --path project/HelloAndroid Programm installieren$ cd project/HelloAndroid $ ant debug Buildfile: /home/fs/android/project/HelloAndroid/build.xml ... $ adb install bin/HelloAndroid-debug.apk 106 KB/s (4871 bytes in 0.044s) pkg: /data/local/tmp/HelloAndroid-debug.apk Success LinksMittwoch, 8. Februar 2012Java SE 7 JDK unter Linux installierenDas Java SE (Standard Edition) Devolpment Kit (JDK) gibt es hier. Wir folgen dem Workflow und laden die gewünschten Archiv-Dateien herunter. Für Standard Edition 7 sind es für Linux x86 die Dateien:
Wir gehen in ein beliebiges Verzeichnis (z.B. /opt/java) und entpacken die Dateien dort: $ tar xvzf jdk-7u2-linux-i586.tar.gz $ tar xvzf jdk-7u2-linux-i586-demos.tar.gz $ unzip jdk-7u2-apidocs.zip $ mv docs jdk1.7.0_02 Im Unterverzeichnis jdk1.7.0_02 befindet sich nun das JDK einschließlich Dokumentation (Unterverzeichnis docs mit docs/index.html als Startseite) und Beispielen (Unterverzeichnisse demo und samples). Wir nutzen diese Java-Installation, indem wir das Environment darauf einstellen: $ export JAVA_HOME=`pwd`/jdk1.7.0_02 $ PATH=$JAVA_HOME/bin:$PATH Programm "Hello world": $ vi HelloWorldApp.java class HelloWorldApp { public static void main(String[] args) { System.out.println("Hello World!"); } } Klasse kompilieren und ausführen: $ javac HelloWorldApp.java $ java HelloWorldApp Hello World! Java SE 6 JDKFür Standard Edition 6 sind es für Linux x86 nur zwei Archiv-Dateien, da das JDK-Archiv die Beispiele mit enthält:
Das Auspacken verläuft geringfügig anders, da die Daten in ein Shell-Archiv eingepackt sind: $ sh jdk-6u30-linux-i586.bin $ unzip jdk-6u30-apidocs.zip $ mv docs jdk1.6.0_30 Das JDK befindet sich in Unterverzeichnis jdk1.6.0_30. Donnerstag, 19. Januar 2012Debian GNU/Linux von USB-Stick bootenRescue SystemHat man die Kontrolle über ein Linux-System verloren (es bootet nicht mehr, Anmelden als root ist nicht möglich, o.ä.) ist es nützlich ein Rescue-System zu haben, von dem aus man das defekte System untersuchen und ggf. reparieren kann. Ein solches Rescue-System lässt sich leicht auf einem USB-Stick installieren. Hierzu holt man sich das Image eines Live-Systems von einem Debian-Mirror und kopiert es 1:1 auf den USB-Stick. Die Live-Systeme von Debian finden sich unter http://www.debian.org/CD/live/. Sie basieren auf dem aktuellen Stable-Release für die Architekturen i386 und amd64 und unterscheiden sich in der Desktop-Umgebung (Gnome, KDE, LXDE, Xfce oder Terminal): debian-live-<version>-<arch>-gnome-desktop.<ext> debian-live-<version>-<arch>-kde-desktop.<ext> debian-live-<version>-<arch>-lxde-desktop.<ext> debian-live-<version>-<arch>-xfce-desktop.<ext> debian-live-<version>-<arch>-rescue.<ext> debian-live-<version>-<arch>-standard.<ext> Hierbei ist: <version> die Versionsnummer des Stable-Release (aktuell 6.0.3) <arch> die Prozessor-Architektur (amd64 oder i386) <ext> die Dateiendung .iso oder .img Da jedes Live-System aus nur einer Datei besteht und bootfähig ist, gestaltet sich das Herunterladen und Installieren sehr einfach: # wget <file> # dd if=<file> of=/dev/sd<x> bs=1M # sync Hierbei ist: <file> eine der obigen Dateien <x> der Device-Buchstabe des USB-Stick Fertig. Vorsicht! Ein falscher Device-Name kann Daten auf anderen Geräten als dem USB-Stick oder gar das System komplett zerstören. Er sollte daher akribisch geprüft werden. Er lässt sich z.B. mit fdisk -l ermitteln. Sollte der Stick beim Einstecken automatisch gemountet worden sein, was wahrscheinlich ist, muss er vor Ausführung des dd-Kommandos erst mit umount ausgehängt werden. Zum Booten vom Stick stellt man die Bootreihenfolge im BIOS-Setup entweder dauerhaft um oder ändert sie "on the fly" beim Bootvorgang, durch Drücken der Taste, die eine Auswahl des Boot-Device erlaubt (z.B. ESC). Beim Eee PC Asus 1001PX lässt sich der Stick nur mit der letzterer Methode booten. Ein automatisches Booten vom Stick funktioniert nicht, es wird immer von der Festplatte gebootet. Installer für Debian TestingDie Images für das Erzeugen eines Debian-Installers für Testing auf einem USB-Stick (oder einer CD) befinden sich hier: http://www.debian.org/devel/debian-installer/ Businesscard-ISO-ImageDas Businesscard-Image lässt sich vereinfacht auf den USB-Stick bringen, da es in die boot.img-Partition passt. Das NetInst-Image von Testing ist dafür zu groß (siehe NetInst-ISO-Image). # wget -N http://d-i.debian.org/daily-images/<arch>/daily/\ hd-media/boot.img.gz # wget -N http://cdimage.debian.org/cdimage/daily-builds/daily/\ arch-latest/<arch>/iso-cd//debian-testing-<arch>-businesscard.iso # zcat boot.img.gz >/dev/sd<x> # mount /dev/sd<x> /mnt # cp debian-testing-<arch>-businesscard.iso /mnt # umount /dev/sd<x> Hierbei ist: <arch> die Prozessor-Architektur (i386, amd64, ...) <x> der Device-Buchstabe des USB-Stick NetInst-ISO-ImageDas NetInst-Image muss wegen seiner Größe mittels Syslinux auf den USB-Stick gebracht werden. Syslinux benötigt eine Partitionierung mit einer FAT16-Partition à la Device Boot Start End Blocks Id System /dev/sdc1 * 2048 7829503 3913728 6 FAT16 Wie diese erstellt wird, siehe http://wiki.debian.org/BootUsb#Partitioning_the_USB_key. Ferner werden folgende Pakete benötigt: mbr, mtools, syslinux. # wget http://d-i.debian.org/daily-images/<arch>/daily/hd-media/vmlinuz # wget http://d-i.debian.org/daily-images/<arch>/daily/hd-media/initrd.gz # http://cdimage.debian.org/cdimage/daily-builds/daily/arch-latest/\ <arch>/iso-cd/debian-testing-<arch>-netinst.iso # install-mbr /dev/sd<x> # mkdosfs /dev/sd<x>1 mkdosfs 3.0.12 (29 Oct 2011) # syslinux -i /dev/sd<x>1 # mount /dev/sd<x>1 /mnt # cp vmlinuz initrd.gz debian-testing-i386-netinst.iso /mnt # cat >/mnt/syslinux.cfg default vmlinuz append initrd=initrd.gz ^D # umount /dev/sd<x>1 Hierbei ist: <arch> die Prozessor-Architektur (i386, amd64, ...) <x> der Device-Buchstabe des USB-Stick LinksProgrammNAME debian-to-usb - Erzeuge bootbaren USB-Stick mit Debian Image USAGE debian-to-usb [OPTIONS] IMAGE DEVICE debian-to-usb --get net-inst debian-to-usb --get businesscard-inst OPTIONS --verbose=BOOL (Default: 1) Gib die ausführenden Kommandos aus. --help Diese Hilfe. IMAGE Der Dateiname eines Debian Live-Image mit der Endung .iso oder .img oder einer der beiden Bezeichner businesscard-inst Erzeuge Installer aus Businesscard-Image. net-inst Erzeuge Installer aus NetInst-Image. DEVICE Der Device-Name, unter dem der USB-Stick angesprochen wird. Z.B. "/dev/sdb". Das Device darf nicht gemountet sein. Vorsicht! Ein falscher Device-Name kann Daten auf anderen Geräten oder gar das System zerstören. Er sollte daher akribisch geprüft werden. Er lässt sich z.B. mit "fdisk -l" ermitteln. AUTHOR Frank Seitz, http://www.fseitz.de/ COPYRIGHT Copyright (C) Frank Seitz, 2012 Donnerstag, 29. Dezember 2011STRATO HiDrive unter Linux nutzenInstallation von davfs (Debian): # apt-get install davfs2 Dateisystem manuell mounten: # mkdir /hidrive # mount -t davfs https://webdav.hidrive.strato.com /hidrive Username: myname Password: mypassword Eintrag zur fstab hinzufügen: # vi /etc/fstab ... https://webdav.hidrive.strato.com /hidrive davfs noauto,user 0 0 Dateisystem vereinfacht manuell mounten: # mount /hidrive Dateibaum DIR per rsync in HiDrive Nutzerverzeichnis übertragen, ohne Verwendung des Mountpoint: $ rsync -avz -e ssh DIR myname@rsync.hidrive.strato.com:/users/myname/ Unter "Einstellungen/Kontenverwaltung/OpenSSH-Schlüssel" kann der Public-Key des aufrufenden Benutzers hochgeladen werden, so dass sich die Passworteingabe vermeiden lässt. LinksSamstag, 26. November 2011Cisco vpnclient unter Linux Kernel 2.6.38+
ProblemDas für frühere Kernel-Versionen kompilierte Kernel-Modul cisco_ipsec crasht bei Aufruf des Cisco vpnclient unter Linux 2.6.38. Das System ist danach nur noch eingeschränkt nutzbar. LösungDas Problem wurde auf http://forum.tuxx-home.at diskutiert und behoben. Der Patch dort funktioniert allerdings nicht, da der Patch, den man nur per Copy&Paste erhalten kann, in der Form defekt ist. Ich habe diesen händisch restauriert und aus den Patches
einen einzigen Patch erstellt, der auf das originale Cisco-Archiv angewendet werden kann. Installation vpnclient für Linux 2.6.38+
Links
Freitag, 14. Januar 2011Finde Dateinamen mit SonderzeichenFinde in Dateibaum DIR alle Dateinamen mit Sonderzeichen, also mit Zeichen, die nicht im ASCII-Zeichensatz liegen: find DIR | perl -ne "print if /[^[:ascii:]]/" Umlaute und andere Non-ASCII-Zeichen in Dateinamen sind problematisch und sollten vermieden werden, wenn nicht garantiert ist, dass systemweit mit ein und demselben Encoding gearbeitet wird, denn das Encoding eines Dateinamens lässt sich aus diesem nicht herleiten. Dienstag, 9. Februar 2010GNU Makefile zum Konvertieren von DateienMitunter soll eine Menge von Dateien, die man erstellt und bearbeitet, systematisch in etwas anderes, z.B. ein anderes Format, konvertiert werden. Die Konvertierung lässt sich mit dem Utilty make organisieren, so dass überflüssige Konvertierungen vermieden werden. Wie sieht ein GNU Makefile für diese Aufgabe aus? Das folgende (fiktive) Beispiel geht davon aus, dass wir .in-Dateien in .out-Dateien konvertieren wollen. Die Konvertierung übernimmt das (fiktive) Programm in2out.
Montag, 8. Februar 2010Syntax-Highlighting mit highlightHighlight stellt die Syntax von zahlreichen Programmiersprachen farbig und mit Fontattributen wie kursiv und fett dar: $ highlight --syntax=LANG --fragment <CODE >CODE.html Die Option --syntax=LANG stellt die Programmiersprache ein, --fragment sorgt dafür, dass keine vollständige HTML-Seite, sondern einbettbarer HTML-Code generiert wird. Die zugehörigen CSS-Klassen liefert folgendes Kommando nach stdout: $ highlight --print-style --style-outfile=stdout | grep '^\.' >CODE.css Das nachgeschaltete grep sorgt dafür, dass der Output auf die relevanten Klassen für eine Einbettung eingeschränkt wird. LinksFreitag, 29. Januar 2010Rsync: Abweichende Rechte einstellenMit der Option -a führt rsync den Abgleich im "Archive Mode" durch, d.h. Symlinks, Devices, Permissions, Ownerschaft usw. werden auf die Zielmaschine transferiert. Was aber, wenn gewisse Unterschiede erforderlich sind, z.B. die Ownerschaft einiger Dateien verschieden sein muss, weil der Owner oder die Group auf der Zielmaschine anders heißen? Beispiel: Die Group des HTTP-Servers heißt auf der einen Maschine "www-data" während sie auf der anderen Maschine "apache" heißt. Über die Group bekommt der HTTP-Server Rechte auf bestimmten Dateien eingeräumt, sie muss also passend zur Maschine gesetzt sein. Solche Differenzen kann rsync nicht auflösen und bietet auch keine Option hierfür. Es lässt sich aber mit einem nachgeschalteten Shell-Skript erreichen, das via ssh auf der Zielmaschine ausgeführt wird: rsync -avz --delete -e ssh DIR1/ USER@HOST:DIR2 ssh USER@HOST CMD Wird CMD in DIR1 abgelegt, wird es durch den rsync-Aufruf mit verwaltet, also automatisch auf dem neusten Stand gehalten. Donnerstag, 21. Januar 2010Verzeichnisse via rsync abgleichenVerzeichnisbaum spiegeln (local => remote)$ rsync -avz --delete DIR1/ USER@HOST:DIR2 Der trailing Slash bei DIR1/ ist wichtig, da sonst DIR1 in dir DIR2 hineinkopiert wird. Die Verzeichnisse können unterschiedlich heißen. Bei Angabe der Option -n wird die Ausführung nur simuliert. Via ssh$ rsync -e ssh -avz --delete DIR1/ USER@HOST:DIR2 Via ssh mit speziellem Port$ rsync --rsh='ssh -p port' -avz --delete DIR1/ USER@HOST:DIR2
(Seite 1 von 1, insgesamt 26 Einträge)
|
Kalender
StatistikLetzter Artikel:
08.07.2024 21:11 157 Artikel insgesamt
Links
|