BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

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

Binäre Aktualisierung des Basissystems

Werden im FreeBSD Basissystem Sicherheitslücken gefunden, so kann man diese auch binär mit freebsd-update stopfen. In FreeBSD 6.2 und 7-CURRENT befindet sich freebsd-update im Basissystem, alle älteren Versionen können freebsd-update aus den Ports installieren:

# cd /usr/ports/security/freebsd-update && make install clean

Nun können noch gebrauchte Patches heruntergeladen werden:

# freebsd-update fetch

Wurden Patches gefunden, die noch nicht eingespielt wurden, so können diese nun installiert werden:

# freebsd-update install

Auch der Kernel wird aktualisiert, allerdings nur wenn man den GENERIC Kernel verwendet. Hat man einen selber zusammengestellten Kernel, so muss man den Quellcode aktualisieren und den Kernel selber neu bauen. Aber auch wenn man den Kernel mit freebsd-update aktualisiert, muss das System neu gestartet werden, damit der neue Kernel in Betrieb genommen wird.

Man kann freebsd-update auch in einen cron-Job aufnehmen. So wird regelmässig nach Aktualisierungen gesucht, diese Heruntergeladen und per Mail eine Meldung verschickt, dass neue Patches eingespielt werden können. Verwendet man ein System mit freebsd-update im Basissystem, so kann folgende Zeile in /etc/crontab eingetragen werden:

 0 5 * * * root /usr/sbin/freebsd-update cron

Verwendet man freebsd-update aus den Ports, so lautet der Pfad /usr/local/sbin/freebsd-update.

Related Entries:
Gespeicherte Optionen nach OptionsNG konvertieren
Ports-Subversion-Repository spiegeln
sysinstall-Ersatz für neuere FreeBSD-Versionen
Alte FreeBSD-Port Patchdateien aufsplitten
FreeBSD-Portbaum auf Fehler überprüfen
 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

Notizen zur Konfiguration eines Servers mit FreeBSD 6.2

Rechtzeitig zum Erscheinen von FreeBSD 6.2 wurde das PDF mit "Notizen zur Konfiguration eines Servers mit FreeBSD" auf FreeBSD 6.2 aktualisiert. Zudem wurden die Optionen in den Konfigurationsdateien besser dokumentiert sowie die pf-Firewall und gmirror hinzugefügt.
Das PDF kann unter http://www.chruetertee.ch/freebsd/ heruntergeladen werden. Es handelt sich dabei nicht um eine Schritt-für-Schritt Anleitung, sondern mehr um eine Sammlung von Möglichkeiten zur Konfiguration.
Comments (3)  Permalink

Befehle in der tcsh zu einer bestimmten Zeit ausführen

In der tcsh lassen sich Befehle zu einer bestimmten Zeit ausführen. Muss man zum Beispiel um 17:00 gehen, so kann man sich um 16:45 eine Warnung in der Shell ausgeben, um 17:00 den Shellpromt ändern und um 17:05 den Rechner automatisch herunterfahren lassen:

# sched 16:45 echo Du musst langsam gehen
# sched 17:00 set prompt="Los jetzt >"
# sched 17:05 shutdown -p +1 Ich hab Dich gewarnt

Die gespeicherten Befehle lassen sich mit sched ansehen:

# sched
1 16:45 echo Du musst langsam gehen
2 17:00 set prompt="Los jetzt >"
3 17:05 shutdown -p +1 Ich hab Dich gewarnt

Möchte man jetzt einen Befehl wieder entfernen, so benutzt man die Nummer, die von sched vor jeden Befehl angezeigt wird:

# sched -3
# sched
1 16:45 echo Du musst langsam gehen
2 17:00 set prompt="Los jetzt >"

Auch lässt sich die Zeit in Stunden und Minuten von der aktuellen Zeit her angeben:

# date 
Sa 13 Jan 2007 11:34:20 CET
# sched +0:5 echo xyz zurückrufen
# sched
1 11:39 echo xyz zurückrufen

Was man Bedenken sollte ist, dass wenn man die Shell schliesst, auch die gespeicherten Befehle weg sind.

Related Entries:
Wort in der tcsh löschen
Programm mit which finden
Liste der besuchten Verzeichnisse merken
foreach-Schleife in der tcsh
tcsh bei Inaktivität beenden
 Permalink

history der tcsh benutzen

Die tcsh merkt sich die zuletzt verwendeten Befehle, so dass man diese zu einem späteren Zeitpunkt wieder verwenden kann. Die ganze Liste der verwendeten Befehle kann wie folgt angeschaut werden:

# history
114 9:56 cd /tmp/
115 9:56 ls -aol
116 9:56 more test
117 9:57 ssh test.chruetertee.ch
118 9:57 history

Die Grösse der History kann für einen Benutzer in der ~/.cshrc oder für alle Benutzer in der /etc/csh.cshrc festgelegt werden:

set history = 1000

Auch kann festgelegt werden, wieviele Befehle bei einem Logout gespeichert werden sollen, damit sie beim nächsten Anmelden wieder zur Verfügung stehen:

set savehist = 100

Der zuletzt verwendete Befehl kann ganz einfach mit zwei Ausrufezeichen nochmals ausgeführt werden:

# !!
history
114 9:56 cd /tmp/
115 9:56 ls -aol
116 9:56 more test
117 9:57 ssh test.chruetertee.ch
118 9:57 history
119 9:58 history

Vor jedem Befehl in der History steht eine Nummer. So kann ein ganz bestimmter Befehl nochmals ausgeführt werden, indem man ein Ausrufezeichen und die Nummer des Befehls in der tcsh eingibt:

# !115
ls -aol

Gibt man ein Ausrufezeichen und einige Buchstaben ein, so wird der letzte Befehl ausgeführt, welcher mit diesen Buchstaben beginnt:

# !mo
more test

Möchte man nur den Befehl sehen und nicht ausführen, so hängt man ein Doppelpunkt und ein p an:

# !mo:p
more test

Mit einem Fragezeichen nach dem Ausrufezeichen wird der letzte Befehl ausgeführt, der die Zeichenfolge nach dem Fragezeichen beinhaltet:

# !?tmp
cd /tmp/

Auch lassen sich Befehle direkt mit einem sed nach einem Doppelpunkt bearbeiten. Folgendes Beispiel führt Befehl 117 aus, tauscht allerdings test mit bla aus:

# !117:s/test/bla/
ssh bla.chruetertee.ch
Related Entries:
Wort in der tcsh löschen
Programm mit which finden
Liste der besuchten Verzeichnisse merken
foreach-Schleife in der tcsh
tcsh bei Inaktivität beenden
 Permalink

FAT-Partition, welche grösser als 128GB ist, mounten

Muss man eine FAT-Partition, welche grösser als 128GB ist, mounten, so muss man zuerst einen Kernel erstellen, welcher folgende Option beinhaltet:

options   MSDOSFS_LARGE

Danach kann die FAT-Partition ganz normal gemountet werden. Dies sollte man allerdings nur machen, wenn man keine andere Option hat, da gemäss src/sys/conf/NOTES für jede Datei auf der FAT-Partition 32 Byte im Kernel-Speicher benötigt werden, was bei zu vielen Dateien auf der FAT-Partition zu einer Kernel-Panic führen könnte.

Besser ist es FAT-Partitionen, welche kleiner als 128GB sind, zu verwenden, oder besser noch ganz auf FAT zu verzichten.

 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
Prev Next211-220/305