BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

Selbstentpackendes Archiv aus Textdateien erstellen

Besitzt man viele Textdateien, die man verschicken oder übertragen möchte, kann man mit shar(1) ganz einfach ein selbstentpackendes Archiv erstellen. Im folgenden Beispiel werden drei Textdateien erstellt, wovon sich eine in einem Unterordner befindet.

# echo "Erste Datei" > test1
# echo "Zweite Datei" > test2
# mkdir ordner
# echo "Dritte Datei" > ordner/test3

Nun wird mit Hilfe von shar ein Archiv erstellt.

# shar `find . -print` > /tmp/archiv

Dieses Archiv kann nun als Mail verschickt oder auf einen anderen Rechner übertragen werden. Zum Entpacken kann das Archiv einfach als Shell-Skript ausgeführt werden, danach werden die Dateien entpackt:

# sh archiv 
c - .
x - ./test1
x - ./test2
c - ./ordner
x - ./ordner/test3
# ls -l
total 8
-rw-r--r-- 1 beat wheel 708 16 Jun 13:29 archiv
drwxr-xr-x 2 beat wheel 512 16 Jun 13:29 ordner/
-rw-r--r-- 1 beat wheel 12 16 Jun 13:29 test1
-rw-r--r-- 1 beat wheel 13 16 Jun 13:29 test2
# cat test?
Erste Datei
Zweite Datei

shar(1) befindet sich sowohl auf FreeBSD also auch auf OpenBSD im Basissystem.

 Permalink

tail auf mehrere Dateien gleichzeitig anwenden

Möchte man ein tail -f gleichzeitig auf mehrere Dateien anwenden, so kann man einfach multitail verwenden. multitail findet man sowohl in den FreeBSD- als auch in den OpenBSD-Ports unter sysutils/multitail:

# cd /usr/ports/sysutils/multitail && make install clean

Nun können die verschiedenen Dateien angegeben werden, die man betrachten möchte. Das Terminalfenster wird dann durch die Anzahl der zu betrachtenden Dateien geteilt:

# multitail <Datei1> <Datei2> [<Datei3>] [...]

Betrachtet man Dateien mit multitail, so können durch das Drücken von F1 alle vorhandenen Befehle und ihre Tastenkombinationen angezeigt werden. Durch das Drücken von Q verlässt man multitail.

Sollen mehrere Dateien vereint in einem Fenster angezeigt werden, kann die -I Option von multitail verwendet werden:

# multitail <Datei1> -I <Datei2> [-I <Datei3>] [...]

Nun werden die neuen Einträge der jeweiligen Datei sofort im gemeinsamen Fenster angezeigt.

multitail besitzt noch viele weitere Optionen und Einsatzmöglichkeiten, diese sind ausführlich in der Manpage multitail(1) beschrieben. Auf der Webseite von multitail findet man ausserdem viele Beispiele zur Benutzung von multitail.

 Permalink

Dateinamen aus Pfad extrahieren

In einem Shellskript kann es vorkommen, dass man einen vollständigen Pfad zu einer Datei besitzt und man nur den Dateinamen verwenden möchte. Dazu gibt es basename(1). Man übergibt einfach den vollständigen Pfad an basename und kriegt den Dateinamen zurück:

# basename /usr/local/sbin/portsopt
portsopt

Umgekehrt kriegt man mit dirname(1) das Verzeichnis zurück, in dem sich die Datei befindet:

# dirname /usr/local/sbin/portsopt
/usr/local/sbin

Sowohl basename als auch dirname findet man in FreeBSD und OpenBSD im Basissystem.

 Permalink

OpenBSD in FreeBSD mit QEMU installieren

Mit QEMU lassen sich nicht nur ISO-Images testen, sondern auch ganze Betriebssysteme installieren. Dazu muss zuerst QEMU installiert werden:

# cd /usr/ports/emulators/qemu && make install clean

Nun kann eine Datei erstellt werden, in die ein Betriebssystem installiert werden soll:

# qemu-img create <Dateiname> <Grösse>

Möchte man zum Beispiel OpenBSD 4.0 in einer 2 GB grossen Datei installieren, so erstellt man diese Datei wie folgt:

# qemu-img create OPENBSD.img 2GB
Formating 'OPENBSD.img', fmt=raw, size=2097152 kB

Nun kann man das OpenBSD cd40.iso Image starten (welches sich auf der OpenBSD-CD befindet oder man im Internet herunterladen kann), um das System zu installieren:

# qemu -hda <Datei in die das System installiert werden soll> -cdrom <Installations ISO Image> -boot d

In diesem Fall zum Beispiel:

# qemu -hda OPENBSD.img -cdrom /cdrom/4.0/i386/cd40.iso -boot d

Sollte das Starten mit folgender Fehlermeldung fehlschlagen,

# qemu -hda OPENBSD.img -cdrom /cdrom/4.0/i386/cd40.iso -boot d
Falscher Systemaufruf(core dumped)

so muss das aio Kernelmodul nachgeladen werden:

# kldload aio

Hat man das KQEMU-Kernelmodul geladen, so hängt QEMU während des Startens von OpenBSD. Also muss das KQEMU Kernelmodul entladen werden:

# kldunload kqemu.ko

Nun startet OpenBSD und kann installiert werden. Konfiguriert man die erkennte Netzwerkkarte mit DHCP, so wird in QEMU automatisch eine IP-Adresse vergeben, mit welcher man auch aus QEMU heraus ins Internet kann, solange der Rechner mit dem Internet verbunden ist. Als Installationsquelle kann danach ftp ausgewählt werden und ein FTP-Server, zum Beispiel mirror.switch.ch, angegeben werden, von welchem die Dateisets heruntergeladen und installiert werden.

Ist die Installation beendet, so kann man OpenBSD in der QEMU herunterfahren und danach das frisch installierte System wie folgt starten:

# qemu -hda OPENBSD.img

Mit QEMU lässt sich nicht nur OpenBSD installieren, sondern auch zum Beispiel NetBSD, Linux oder Windows.

Comments (1)  Permalink

Dateien schneller finden

Sucht man eine Datei auf der Festplatte, so kann man zum Beispiel find(1) dazu benutzen:

# find / -name "*<Teil des Names der gesuchten Datei>*"

Da dabei jedes mal die ganze Festplatte durchsucht wird, ist dies nicht der effektivste Weg, wenn man mehrere Dateien sucht. Dafür gibt es locate(1). Vor dem ersten Gebrauch von locate muss eine Datenbank erstellt werden, auf die locate später zurückgreift:

# /usr/libexec/locate.updatedb
>>> WARNING
>>> Executing updatedb as root. This WILL reveal all filenames
>>> on your machine to all login users, which is a security risk.

Erstellt man die Datenbank als root-Benutzer, so können alle Benutzer des Systems den Inhalt von Verzeichnissen herausfinden, von denen sie normalerweise nicht die Berechtigungen haben. Dies kann auf Mehrbernutzersystemen ein Problem sein. Dort sollte die Datenbank als unprevilegierter Benutzer erstellt werden:

# su -m nobody -c /usr/libexec/locate.updatedb

Ist die Datenbank erstellt, so kann sie mit locate durchsucht werden, wenn man eine Datei sucht:

# locate <Teil des Names der gesuchten Datei>

Möchte man, dass die Gross-/Kleinschreibung ignoriert wird, so kann man zusätzlich die -i Option verwenden.

Die locate-Datenbank wird wöchentlich automatisch auf FreeBSD durch das periodic weekly Skript /etc/periodic/weekly/310.locate und auf OpenBSD durch /etc/weekly aktualisiert.

Comments (2)  Permalink

Prozess-ID anhand des Prozessnamens finden

Mit pgrep(1) lässt sich die Prozess-ID eines Prozesses anhand seines Namens herausfinden:

# pgrep syslogd
22758

Mit der -l Option wird neben der Prozess-ID auch der Prozessname angezeigt:

# pgrep -l syslogd
22758 syslogd

Mit der -f Option werden nicht nur die Prozessnamen nach dem Suchbegriff durchsucht, sondern auch die Argumente, die den Prozessen übergeben worden sind:

# pgrep -lf SSL
37342 /usr/local/sbin/httpd -DSSL
37325 /usr/local/sbin/httpd -DSSL
37262 /usr/local/sbin/httpd -DSSL
36630 /usr/local/sbin/httpd -DSSL

So kann man nun die Prozess-ID eines zum Beispiel hängengebliebenen Prozesses herausfinden und dieser kann dann mit kill(1) terminiert werden. Wer ein bisschen mutiger ist, verwendet pkill(1), welcher wie pgrep funktioniert, nur dass nicht die Prozess-ID der gefunden Prozesse ausgegeben, sondern an alle gefundenen Prozesse ein Signal zur Terminierung gesendet wird.

# pgrep -lf vi 2008 vi /home/beat/chruetertee/ideen
# pkill -f vi
# pgrep -lf vi

pkill(1) und pgrep(1) sind sowohl auf FreeBSD als auch auf OpenBSD im Basissystem vorhanden.

Comments (1)  Permalink

Herausfinden, welcher Benutzer wieviel Speicherplatz verbraucht

Um herauszufinden, welcher Benutzer wieviel Speicherplatz verbraucht, kann man quot(8) verwenden. Möchte man dies von allen Partitionen sehen, so kann man die -a Option verwenden:

# quot -a

Die Ausgabe erfolgt in der Grösseneinheit, die in der System-Variable BLOCKSIZE definiert ist. Die standardmässig gesetzte Grösse ist KB. Möchte man z.B. die Benutzung von /usr anzeigen und die Ausgabe in MB darstellen, so setzt man BLOCKSIZE auf M :

# setenv BLOCKSIZE M
# echo $BLOCKSIZE
M
# quot /usr
/dev/ar0s1f:
27398 alain
11956 root
974 mysql
347 www
208 beat
4 nobody
...

Mit der Option -v können nun auch die Anzahl Dateien angezeigt werden, die in den letzten 30, 60 und 90 Tagen nicht benutzt wurden:

# quot -v /usr
/dev/ar0s1f:
27398 alain 27264 27264 27264
11956 root 9626 4020 2644
974 mysql 598 537 519
347 www 92 92 76
208 beat 16 16 16
4 nobody 0 0 0
...

Hat man auf einer Partition zu wenig Speicherplatz, so kann mit quot(8) herausgefunden werden, welcher Benutzer viel Speicherplatz braucht und seine abgelegten Daten nicht benutzt.

quot(8) ist sowohl auf FreeBSD als auch auf OpenBSD im Basissystem enthalten.

Comments (5)  Permalink

Tunneln mit OpenSSH

Möchte man auf einen Port eines Rechners von einem anderen Rechner aus zugreifen, dies allerdings nicht erlaubt oder durch eine Firewall geblockt ist, mit SSH der Zugriff auf den Rechner aber möglich ist, so kann man den gewünschten Port tunneln.

# ssh -L <Lokaler Port>:<Zielrechner>:<Port auf Zielrechner> <Benutzer>@<Tunnelrechner>

Möchte man zum Beispiel von Rechner B den Port 3306 benutzen und es ist möglich, sich auf Rechner B per SSH einzuloggen, so kann man dies wie folgt tun:

# ssh -L 3306:localhost:3306 <Benutzer>@<Rechner B>

Möchte man zum Beispiel auf Port 3306 von Rechner C zugreifen, welcher von Rechner B aus erreichbar ist, aber nicht von unserem Rechner, man kann sich aber auf Rechner B per SSH einloggen, so kann man das folgendermassen machen:

# ssh -L 3306:<Rechner C>:3306 <Benutzer>@<Rechner B>

Nun kann man in beiden Fällen auf den localhost Port 3306 zugreifen, welcher dann von OpenSSH auf den Zielrechner getunnelt wird.

Ist auf dem SSH-Server die Option AllowTcpForwarding no gesetzt, so wird das Tunneln nicht funktionieren. Ob dies der Fall ist, kann auf FreeBSD und OpenBSD in der /etc/ssh/sshd_config nachgeschaut werden.

Comments (1)  Permalink

Datei aufteilen

Soll eine Datei auf eine CD, ein ZIP-Drive oder eine Floppy gespeichert werden, ist aber für das Medium zu gross, so kann man die Datei mit split(1) aufteilen.

# split -b <Grösse der Teile> <Zu grosse Datei> <Dateinamen-Prefix der Teile>

Möchte man zum Beispiel die folgende Datei auf drei Floppys verteilen, so kann man dies wie folgt tun:

# ls -al dump.tar.gz 
-rw-r--r-- 1 root wheel 2719811 Dec 29 22:18 dump.tar.gz
# split -b 1m dump.tar.gz dump.part.
# ls -l dump.part.*
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.aa
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.ab
-rw-r--r-- 1 root wheel 622659 Dec 29 22:23 dump.part.ac

Nun wurden drei Dateien erzeugt, welche maximal 1 MB gross sind und auf den Floppys gespeichert werden können. Die Grösse der einzelnen Teile kann mit der -b Option bestimmt werden. Der Buchstabe nach der Zahl bestimmt die Einheit. Ein k bedeutet Kilobyte, ein m bedeutet Megabyte. Für Gigabyte gibt es allerdings keine Abkürzung.

Sollen die Teile nun wieder zusammengefügt werden, nimmt man cat(1) zu Hilfe:

# cat <Dateinamen-Prefix der Teile>* > <Dateinamen der ursprünglichen Datei>

Die Reihenfolge der Dateien wird automatisch anhand der Endungen der einzelnen Dateien erkannt. In diesem Beispiel würde dies folgendermassen aussehen:

# ls -al dump.*
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.aa
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.ab
-rw-r--r-- 1 root wheel 622659 Dec 29 22:23 dump.part.ac
# cat dump.part.* > dump.tar.gz
# ls -al dump.*
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.aa
-rw-r--r-- 1 root wheel 1048576 Dec 29 22:23 dump.part.ab
-rw-r--r-- 1 root wheel 622659 Dec 29 22:23 dump.part.ac
-rw-r--r-- 1 root wheel 2719811 Dec 29 22:31 dump.tar.gz
 Permalink

Zeilenlänge von Texten limitieren

fmt(1) formatiert Textdateien so, dass standardmässig eine Zeile aus 65, maximal jedoch aus 75 Zeichen besteht.

# more freebsd
FreeBSD® is an advanced operating system for x86 compatible (including Pentium® and Athlon), amd64 compatible (including Opteron, Athlon64, and EM64T), UltraSPARC®, IA-64, PC-98 and ARM architectur
es. It is derived from BSD, the version of UNIX® developed at the University of California, Berkeley. It is developed and maintained by a large team of individuals. Additional platforms are in vari
ous stages of development.
# fmt freebsd
FreeBSD® is an advanced operating system for x86 compatible (including
Pentium® and Athlon), amd64 compatible (including Opteron, Athlon64,
and EM64T), UltraSPARC®, IA-64, PC-98 and ARM architectures. It is
derived from BSD, the version of UNIX® developed at the University
of California, Berkeley. It is developed and maintained by a large
team of individuals. Additional platforms are in various stages of
development.

Die Anzahl Zeichen pro Zeile kann auch selber bestimmt werden:

# fmt <Optimale Anzahl Zeichen> <Maximale Anzahl Zeichen> <Textdatei>

Es kann auch nur eine maximale Anzahl Zeichen angegeben werden:

# fmt -w <Maximale Anzahl Zeichen> <Textdatei>

So kann man zum Beispiel eine pkg-descr auf 80 Zeichen pro Zeile beschränken:

# fmt -w 80 pkg-descr.raw > pkg-descr
 Permalink
Prev Next11-20/44