Mit pwd(1) wird das Verzeichnis angezeigt, in dem man sich zur Zeit befindet. Folgt man auf FreeBSD einem Symlink, so wird, je nachdem welche Shell man benutzt, von pwd der logische oder der physikalische Pfad angezeigt. In folgendem Beispiel zeigt der Symlink test2 auf das Verzeichnis test1:
# mkdir test1
# ln -s test1 test2
# ls -l
total 2
drwxr-xr-x 2 beat wheel 512 12 Mai 13:48 test1/
lrwxr-xr-x 1 beat wheel 5 12 Mai 13:48 test2@ -> test1
Verwendet man nun die tcsh und folgt dem Symlink ,so wird von pwd der physikalische Pfad angezeigt:
tcsh# cd test2/
tcsh# pwd
/tmp/test1
Möchte man sich den logischen Pfad anzeigen lassen, so verwendet man die -L Option von pwd:
tcsh# pwd -L
/tmp/test2
Verwendet man die Bourne-Shell, so wird von pwd der logische Pfad angezeigt:
sh# cd test2
sh# pwd
/tmp/test2
Soll nun von pwd der physikalische Pfad angezeigt werden, so kann die -P Option von pwd verwendet werden:
sh# pwd -P
/tmp/test1
Die Umgebungsvariable PWD zeigt in beiden Shells immer den logischen Pfad an:
# cd test2
# echo $PWD
/tmp/test2
Mit mkdir lassen sich Verzeichnisse anlegen. Möchte man nun ein Verzeichnis mit einem Unterverzeichnis darin anlegen, so wird dies nicht funktionieren.
# mkdir /tmp/test/test2
mkdir: /tmp/test: No such file or directory
Damit alle Verzeichnisse im Pfad erstellt werden, die noch nicht existieren, kann die Option -p verwendet werden.
# mkdir -p /tmp/test/test2
Mit der -m Option vom mkdir können auch gleich die Rechte des neu erstellten Verzeichnisses festgelegt werden:
# mkdir -m 700 test
# ls -l
total 2
drwx------ 2 beat wheel 512 5 Mai 18:03 test/
Kombiniert man die -m und die -p Optionen, so werden nur die Rechte des letzten Unterverzeichnisses durch die -m Option beeinflusst. Alle anderen erstellten Zwischenverzeichnisse haben Standardrechte.
# ls -l
total 0
# mkdir -m 700 -p test/test2
# ls -l
total 2
drwxr-xr-x 3 beat wheel 512 5 Mai 18:10 test/
# ls -l test/
total 2
drwx------ 2 beat wheel 512 5 Mai 18:10 test2/
mkdir(1) ist natürlich sowohl in FreeBSD als auch in OpenBSD im Basissystem vorhanden.
Möchte man die Ausgabe eines Programmes auf der Standardausgabe anzeigen und gleichzeitig in eine Datei schrieben, so kann man tee(1) einsetzen. Folgender Befehl führt ein make install clean aus, schickt die Ausgabe auf die Standardausgabe und schreibt diese gleichzeitig nach /tmp/make:
# make install clean | tee /tmp/make
Existiert die Datei, in welche man die Ausgabe schreibt, schon, so wird der Inhalt dieser überschrieben. Möchte man die Ausgabe an die Datei anhängen, so dass existierender Inhalt nicht überschrieben wird, verwendet man die -a Option von tee. Sowohl auf FreeBSD als auch auf OpenBSD befindet sich tee im Basissystem.
Besitzt man viele Mehrbenutzersysteme, die man immer auf die gleiche Weise härten möchte, empfiehlt es sich einen Blick auf lockdown zu werfen. lockdown findet man im Portsbaum unter security/lockdown.
# cd /usr/ports/security/lockdown && make install clean
Nun wird ein Shellskript unter /usr/local/bin/lockdown installiert. Dieses kann nun den eigenen Wünschen angepasst werden. Dazu erstellt man eine Kopie des Skriptes:
# cp /usr/local/bin/lockdown /usr/local/bin/lockdown.custom
lockdown passt folgende Dateien den eigenen Wünschen an:
- /etc/ssh/sshd_config
- /etc/rc.conf
- /etc/auth.conf
- /etc/sysctl.conf
- Kernelkonfiguration
Ausserdem werden die Rechte von Programmen angepasst oder ganz entfernt, so dass normale Benutzer diese Programme nicht mehr benutzen können.
Zuerst muss die kern-Variable gesetzte werden, so dass sie auf die verwendete Kernelkonfiguration zeigt:
kern="/usr/local/bin/editkernel /usr/src/sys/i386/conf/<Kernelname>"
In der Section Mounting options werden die Optionen von Mountpunkten angepasst. In Build a debug kernel können Kerneloptionen der aktuellen Kernelkonfiguration hinzugefügt werden. Der Kernel muss danach allerdings manuell neu gebaut werden. Danach werden die verschiedenen Konfigurationsdateien der Maschine angepasst. Im letzten Abschnitt werden dann die Rechte von verschiedenen Programmen angepasst.
Hat man das Skript einmal seinen Wünschen angepasst, kann es ausgeführt werden:
# lockdown
Möchte man nun das Skript auf einem anderen Server ausführen, kann man einfach lockdown aus den Ports installieren, das selber angepasste Skript auf diesen Server kopieren und ausführen. So können mehrere Systeme innert kürzester Zeit identisch abgesichert werden.
Mit logger(1) lassen sich Meldungen an syslog schicken. Dies kann vor allem bei Skripten, die unbeaufsichtigt laufen, wie cron-Jobs, von Vorteil sein. Eine solche Meldung lässt sich wie folgt erzeugen:
# logger -p <Facility>.<Priorität> -t <Bezeichnung> <Meldung>
Die Facility und Priorität welche von syslog aufgezeichnet werden, findet man in der /etc/syslog.conf heraus. Als Bezeichnung kann ein Wort genommen werden, mit dem alle Einträge gekennzeichnet werden, zum Beispiel den Skriptnamen.
Führt man folgenden Befehl aus:
# logger -p user.notice -t test "Das ist ein Test"
So findet man in der /var/log/message folgende Zeile:
Apr 14 08:21:17 daedalus test: Das ist ein Test
Die Meldung kann mit der -f Option auch aus einer Datei ausgelesen werden. Wird logger mit der -s Option aufgerufen, so wird die Meldung zusätzlich auch noch auf der Standardausgabe angezeigt. logger findet man sowohl auf FreeBSD als auch auf OpenBSD in Basissystem. Mehr Informationen findet man in der Manpage logger(1).
Mit tail(1) lassen sich die letzten 10 Zeilen einer Datei anzeigen. Benutzt man tail mit der Option -f, so werden zwar auch die letzten 10 Zeilen angezeigt, jedoch wird die Datei nicht geschlossen.
# tail -f <Logdatei>
Werden nun in diese Datei neue Einträge geschrieben, so werden diese von tail -f automatisch angezeigt. tail ist sowohl auf FreeBSD als auch auf OpenBSD im Basissystem vorhanden. tail auf FreeBSD besitzt allerdings noch eine Besonderheit. Benutzt man tail mit der -F Option, so werden wie bei -f fortlaufend die neuen Einträge angezeigt. Wird jetzt aber die Logdatei, die man betrachtet, rotiert, das heisst die Datei wird weggesichert und eine neue leere Datei an derselben Stelle erstellt, so würde tail -f immer noch von der alten Datei lesen, in die allerdings keine Einträge mehr geschrieben werden. tail -F dagegen erkennt, dass die Datei rotiert wurde und liest automatisch von der neuen Datei weiter. tail -f wird durch Ctrl + c beendet.
Besitzt man zum Beispiel eine USB-Festplatte, welche mit UFS formatiert ist und an verschiedenen FreeBSD Rechnern benutzt wird, so kann man sich das Mounten der Festplatte vereinfachen, indem man Labels benutzt. Damit man ein Label auf einer Partition erstellen kann, muss die Festplatte mit einem FreeBSD Rechner verbunden, jedoch nicht gemountet sein. Auch muss man zuerst das geom_label-Kernelmodul laden:
# kldload geom_label.ko
Nun kann das Label mit Hilfe von tunefs(8) auf die Partition geschrieben werden:
# tunefs -L <Label> <Partition>
Zum Beispiel:
# tunefs -L usbdisk /dev/da0s3c
Will man nun auf einem FreeBSD Rechner die Festplatte mounten, so muss, falls dies noch nicht geschehen ist, das geom_label-Kernelmodul geladen werden. Möchte man das Modul dauerhaft laden, so trägt man folgende Zeile in der /boot/loader.conf ein:
geom_label_load="YES"
Sobald man nun die Festplatte mit dem System verbindet, wird folgende Meldung auf der Konsole ausgegeben:
GEOM_LABEL: Label for provider da0s3 is ufs/usbdisk.
Nun lässt sich die Festplatte auf jedem FreeBSD System immer gleich mounten:
mount /dev/ufs/usbdisk /mnt/usb/
Mehr Informationen zu den Labels findet man in der Manpage glabel(8).
Mit dmidecode lassen sich detaillierte Informationen, wie Hersteller, Modellname, Seriennummer und BIOS Version des Rechners, auslesen. Je nach Hersteller findet man auch Informationen über den Prozessor, die RAM-Bausteine und unter Umständen sogar die Slotbelegung von RAM oder Erweiterungskarten.
dmidecode findet man auf FreeBSD und OpenBSD unter sysutils/dmidecode im Portbaum. Zur Ausführung benötigt dmidecode root-Rechte. Wird es ohne Optionen aufgerufen, so werden alle vorhanden Informationen angezeigt:
# dmidecode
Mehr Informationen findet man in der Mapage dmidecode(8).
Muss der Fortschritt eines Prozesses immer durch die Eingabe eines Befehls nachgeschaut werden, so kann man dies mit cmdwatch(1) automatisieren. Übergibt man cmdwatch nur den Befehl, den man ausführen möchte, so wird dieser alle 2 Sekunden ausgeführt und die Ausgabe angezeigt:
# cmdwatch "<Befehl>"
Möchte man zum Beispiel den Fortschritt beim Wiederherstellen eines RAID1-Arrays beobachten, kann man cmdwatch wie folgt benutzen:
# cmdwatch "atacontrol status ar0"
Every 2s: atacontrol status ar0 Fri Mar 16 19:44:07 2007
ar0: ATA RAID1 subdisks: ad3 ad2 status: REBUILDING 59% completed
Soll das Zeitintervall verändern werden, so kann der -n Option die Anzahl Sekunden übergeben werden, nach denen der Befehl wieder ausgeführt wird. Möchte man zum Beispiel alle 5 Sekunden einen df -k ausführen um zuzusehen wie sich die Partitionsbenutzung verändert, so kann man cmdwatch wie folgt verwenden:
# cmdwatch -n 5 "df -k"
Every 5s: df -k Sat Mar 17 12:21:28 2007
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 507630 110396 356624 24% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 507630 18 467002 0% /tmp
/dev/ad0s1f 42645860 29636174 9598018 76% /usr
/dev/ad0s1e 1012974 94138 837800 10% /var
linprocfs 4 4 0 100% /usr/compat/linux/proc
Verwendet man zusätzlich die -d Option, so werden die Änderungen markiert.
cmdwatch findet man in den FreeBSD-Ports unter sysutils/cmdwatch und kann wie folgt installiert werden:
# cd /usr/ports/sysutils/cmdwatch/ && make install clean
cmdwatch beendet man mit Ctrl + c.
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.