BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

Temporäre Dateien in einem Shellskript verwenden

Erstellt man in einem Shellskript mehrere temporäre Dateien, so muss sichergestellt werden, dass die Dateien noch nicht existieren. Dazu kann man mktemp verwenden. Die X im übergeben Dateinamen werden von mktemp durch einen einmaligen Schlüssel ersetzt. Der Pfad zur erstellten Datei wird von mktemp zurückgegeben:

# mktemp /tmp/test.XXXXXXXXXX
/tmp/test.d8zo9nRkAd

Nun kann mktemp zum Beispiel wie folgt in einem Shellskript verwendet werden:

TMPFILE=`mktemp /tmp/test.XXXXXXXXXX` || exit 1
echo "Test" >> ${TMPFILE}

mktemp ist auf FreeBSD und OpenBSD bereits im Basissystem vorhanden. Mehr Informationen zu mktemp findet man in der Manpage mktemp(1).

 Permalink

SSL-verschlüsselte Dienste testen

Unverschlüsselte Netzwerkdienste wie HTTP/POP3/IMAP/SMTP können mit telnet(1) auf ihre Funktionalität getestet werden:

# telnet www.chruetertee.ch 80
Trying 217.150.245.53...
Connected to www.chruetertee.ch.
Escape character is '^]'.
GET /
<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.chruetertee.ch/">here</a>.</p>
</body></html>
Connection closed by foreign host.

Wird der Datenverkehr mit SSL verschlüsselt, kann telnet nicht mehr verwendet werden. Möchte man den Dienst trotzdem testen, kann s_client von OpenSSL verwendet werden. Zuerst werden Informationen zum Zertifikat und der SSL-Verbindung angezeigt, danach können Befehle wie mit telnet abgesetzt werden:

# openssl s_client -connect www.chruetertee.ch:443
CONNECTED(00000003)
<Zertifikatisinfo>
---
Certificate chain
0 s:/C=CH/ST=Zurich/L=Zurich/O=chruetertee.ch/CN=www.chruetertee.ch/emailAddress=hostmaster@chreutertee.ch
i:/C=CH/ST=Zurich/L=Zurich/O=chruetertee.ch/CN=www.chruetertee.ch/emailAddress=hostmaster@chreutertee.ch
---
Server certificate
-----BEGIN CERTIFICATE-----
<Zertifikat>
-----END CERTIFICATE-----
subject=/C=CH/ST=Zurich/L=Zurich/O=chruetertee.ch/CN=www.chruetertee.ch/emailAddress=hostmaster@chreutertee.ch
issuer=/C=CH/ST=Zurich/L=Zurich/O=chruetertee.ch/CN=www.chruetertee.ch/emailAddress=hostmaster@chreutertee.ch
---
No client certificate CA names sent
---
SSL handshake has read 1231 bytes and written 340 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
SSL-Session:
<Session Info>
---
GET /
<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.chruetertee.ch/">here</a>.</p>
</body></html>
closed

OpenSSL und s_client sind auf FreeBSD und OpenBSD bereits im Basissystem vorhanden. Mehr Informationen zu s_client findet man in der Manpage s_client(1), eine Übersicht der OpenSSL Tools findet man in der Manpage openssl(1).

Comments (2)  Permalink

Smart Array RAID Controller auf FreeBSD verwalten

Auf einem Server mit einem Smart Array Controller kann der RAID Controller mit Hilfe des hpacucli (HP Array Configuration Utility CLI) direkt aus dem Betriebssystem heraus verwaltet werden. hpacucli findet man im FreeBSD Portsbaum unter sysutils/hpacucli:

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

Danach kann hpacucli gestartet werden, wobei die vorhandenen RAID Controller erkannt werden. Möchte man sich danach alle verfügbaren Kommandos von hpacucli anschauen, kann help eingegeben werden.

# hpacucli
HP Array Configuration Utility CLI 7.50.18.0
Detecting Controllers...Done.
Type "help" for a list of supported commands.
Type "exit" to close the console.

=>

Alle verfügbaren Informationen zu allen verfügbaren RAID Controllern, in diesem Beispiel nur einer, erhält man mit ctrl all show:

=> ctrl all show 
Controller Smart Array P400 at 0
Bus Interface: PCI
Slot: 0
Serial Number: 123456789
Cache serialnumber: 123456789
RAID 6 (ADG) Status: Enabled
RAID 6 (ADG) Enabler Status: Enabled
Controller Status: OK
Chassis Slot: 1
Hardware Revision: Rev D
Firmware Version: 2.08
Rebuild Priority: Medium
Expand Priority: Medium
Surface Scan Delay: 15 sec
Cache Board Present: True
Cache Status: OK
Accelerator Ratio: 100/0 (read/write)
Total Cache Size: 512 MB
Battery Pack Count: 1
Battery Status: OK

Möchte man sich nur den Status des Controllers anzeigen lassen, kann dies mit ctrl all show status gemacht werden:

=> ctrl all show status
Smart Array P400 in Slot 0
Controller Status: OK
Cache Status: OK
Battery Status: OK

Möchte man sich nun die Komponenten des Controllers genauer anschauen, kann der Controller festgelegt werden:

=> set target ctrl slot=0
controller slot=0

Nun lassen sich die Informationen zu allen Festplatten an diesem Controller mit pd all show anzeigen:

=> pd all show
Smart Array P400 in Slot 0
physicaldrive 1:1
Port: 2I
Box: 1
Bay: 1
Status: OK
Drive Type: Data Drive
Interface Type: SAS
Size: 73.4 GB
Transfer Speed: 3.0 Gbps
Rotational Speed: 10000
Firmware Revision: HPD5
Serial Number: 3123456789
physicaldrive 1:2
Port: 2I
Box: 1
Bay: 2
Status: OK
Drive Type: Data Drive
Interface Type: SAS
Size: 73.4 GB
Transfer Speed: 3.0 Gbps
Rotational Speed: 10000
Firmware Revision: HPD5
Serial Number: 123456789

Auch die daraus erstellten "Logical Drives" können mit ld all show angezeigt werden:

=> ld all show
Smart Array P400 in Slot 0
Logical Drive: 1
Size: 68.3 GB
Fault Tolerance: 1+0
Heads: 255
Sectors Per Track: 32
Cylinders: 17562
Stripe Size: 128 KB
Status: Ok
Array Accelerator: Enabled
Has Data On Drive: True
Unique Identifier: 123456704C3953554112345678
Preferred Controller Chassis Slot: 1

Nun kann man mit hpacucli direkt neue "Logical Drives" erstellen und Parameter des Controllers während des Betriebs verändern. Eine komplette Übersicht der Befehle findet man auf folgender Seite: http://people.freebsd.org/~jcagle/hpacucli-readme

Mehr Informationen zu FreeBSD auf HP Proliant Servern findet man auf folgender Seite: http://people.freebsd.org/~jcagle/

Der Status eines "Logical Drives" kann auch mit cciss_vol_status ausgelesen werden.

 Permalink

Aufzeichnen welche Dateien von einem Programm angelegt werden

Mit Hilfe von ftrace lässt sich aufzeichnen, welche Dateien von einem Programm erstellt werden. ftrace findet man in den FreeBSD Ports unter sysutils/ftrace:

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

Im folgenden Beispiel wird aufgezeichnet, welche Dateien angelegt werden, wenn man ein make install in /usr/ports/ports-mgmt/portsopt ausführt. Das Ergebnis wird nach /tmp/filelist geschrieben:

# cd /usr/ports/ports-mgmt/portsopt
# ftrace /tmp/filelist make install
===> Extracting for portsopt-1.4
=> MD5 Checksum OK for portsopt-1.4.tar.gz.
=> SHA256 Checksum OK for portsopt-1.4.tar.gz.
===> Patching for portsopt-1.4
===> Configuring for portsopt-1.4
===> Installing for portsopt-1.4
===> Generating temporary packing list
===> Checking if ports-mgmt/portsopt already installed
install -o root -g wheel -m 555 /usr/ports/ports-mgmt/portsopt/work/portsopt-1.4/portsopt /usr/local/sbin
===> Registering installation for portsopt-1.4
# cat /tmp/filelist
/usr/ports/ports-mgmt/portsopt/work
/usr/ports/ports-mgmt/portsopt/work/portsopt-1.4
/usr/ports/ports-mgmt/portsopt/work/portsopt-1.4/portsopt
/usr/ports/ports-mgmt/portsopt/work/.extract_done.portsopt._usr_local
/usr/ports/ports-mgmt/portsopt/work/.patch_done.portsopt._usr_local
/usr/ports/ports-mgmt/portsopt/work/.configure_done.portsopt._usr_local
/usr/ports/ports-mgmt/portsopt/work/.build_done.portsopt._usr_local
/usr/ports/ports-mgmt/portsopt/work/.PLIST.mktmp
/usr/ports/ports-mgmt/portsopt/work/.PLIST.mktmp
/usr/ports/ports-mgmt/portsopt/work/.PLIST.mktmp
/usr/ports/ports-mgmt/portsopt/work/.PLIST.mktmp
/usr/local/share/nls/POSIX
/usr/local/share/nls/en_US.US-ASCII
/usr/local/sbin/portsopt
/var/db/pkg/portsopt-1.4
/var/db/pkg/portsopt-1.4/+CONTENTS
/var/db/pkg/portsopt-1.4/+DESC
/var/db/pkg/portsopt-1.4/+COMMENT
/var/db/pkg/portsopt-1.4/+MTREE_DIRS
/usr/ports/ports-mgmt/portsopt/work/.PLIST.flattened
/usr/ports/ports-mgmt/portsopt/work/.PLIST.setuid
/usr/ports/ports-mgmt/portsopt/work/.PLIST.writable
/usr/ports/ports-mgmt/portsopt/work/.PLIST.objdump
/usr/ports/ports-mgmt/portsopt/work/.install_done.portsopt._usr_local

Sollen versteckte Dateien nicht aufgezeichnet werden, kann die -i Option verwendet werden:

# cd /usr/ports/ports-mgmt/portsopt && ftrace -i /tmp/filelist make install
===> Extracting for portsopt-1.4
=> MD5 Checksum OK for portsopt-1.4.tar.gz.
=> SHA256 Checksum OK for portsopt-1.4.tar.gz.
===> Patching for portsopt-1.4
===> Configuring for portsopt-1.4
===> Installing for portsopt-1.4
===> Generating temporary packing list
===> Checking if ports-mgmt/portsopt already installed
install -o root -g wheel -m 555 /usr/ports/ports-mgmt/portsopt/work/portsopt-1.4/portsopt /usr/local/sbin
===> Registering installation for portsopt-1.4
# cat /tmp/filelist
/usr/local/share/nls/POSIX
/usr/local/share/nls/en_US.US-ASCII
/usr/local/sbin/portsopt
/var/db/pkg/portsopt-1.4
/var/db/pkg/portsopt-1.4/+CONTENTS
/var/db/pkg/portsopt-1.4/+DESC
/var/db/pkg/portsopt-1.4/+COMMENT
/var/db/pkg/portsopt-1.4/+MTREE_DIRS
 Permalink

UFS-Snapshots verwenden

Mit Hilfe eines Snapshots kann man den Stand eines Dateisystems festhalten. Verwendet man UFS als Dateisystem, so kann mit mount(8) ein Snapshot erzeugt werden. Folgendes Beispiel erzeugt einen Snapshot mit dem Namen snap1 von /var im Verzeichnis /var/.snap:

# mount -u -o snapshot /var/.snap/snap1 /var

Möchte man nun Daten des Snapshots lesen, so kann dieser mit Hilfe von mdconfig(8) und mount ins System eingebunden werden. Werden nun Änderungen am Dateisystem vorgenommen, sind diese im Snapshot nicht sichtbar:

# echo "test" > /var/testdatei
# mount -u -o snapshot /var/.snap/snap1 /var
# mdconfig -a -t vnode -f /var/.snap/snap1  -u 0
WARNING: opening backing store: /var/.snap/snap1 readonly
# mkdir /mnt/snap1
# mount -o ro /dev/md0 /mnt/snap1
# cat /mnt/snap1/testdatei
test
# echo "test2" >> /var/testdatei
# cat /var/testdatei
test
test2
# cat /mnt/snap1/testdatei
test

Vorhandene Snapshots können mit Hilfe von snapinfo(8) gefunden werden:

# snapinfo -a
/var/.snap/snap1

Eine detailliertere Ausgabe erhält man mit der -v Option:

# snapinfo -v -a
/dev/ad0s1a mounted on /
        no snapshots found
/dev/ad0s1d mounted on /tmp
        no snapshots found
/dev/ad0s1f mounted on /usr
        no snapshots found
/dev/ad0s1e mounted on /var
        snapshot /var/.snap/snap1 (inode 172)

Wird der Snapshot nicht mehr benötigt, kann er mit Hilfe vom umount(8), mdconfig und rm(1) aus dem System entfernt und gelöscht werden:

# umount /mnt/snap1
# mdconfig -d -u 0
# rm -f /var/.snap/snap1

Benutzt man ZFS als Dateisystem, stehen auch Shapshots zur Verfügung, diese werden allerdings mit Hilfe von zfs(1) verwaltet.

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

Inhalt zweier Verzeichnisse vergleichen

Um den Inhalt zweier Verzeichnisse zu vergleichen kann man DirComp verwenden. DirComp findet man im FreeBSD Portsbaum unter sysutils/dircomp. Falls man die grafische Oberfläche zu DirComp nicht installieren möchte, kann der Port mit WITHOUT_X11 installiert werden:

# cd /usr/ports/sysutils/dircomp && make -DWITHOUT_X11 install clean

Nun können die beiden Verzeichnisse, welche vergleichen werden sollen, an DirComp übergeben werden. Verwendet man die -s Option, so werden auch die Dateien in den Unterverzeichnissen verglichen. Die Ausgabe wird dabei aus Sicht des zweiten übergebenen Verzeichnisses ausgegeben:

# DirComp -s dir1 dir2
DirComp V1.3

Older          : Datei1
Older          : Datei2
Deleted        : Datei3
Younger        : dir/AuchEineDatei
New            : dir/UndNochEine

Verglichen werden dabei die Zeiten zu denen die Datei das letzte Mal verändert wurde. Sollen die Dateien anhand Ihres Inhaltes verglichen werden, kann die -c Option verwendet werden:

# DirComp -c dir1 dir2
DirComp V1.3

Älter          : Datei2
Gelöscht       : Datei3
 Permalink

Zusammenfassung aus sendmail-Logdatei erstellen

Mit Hilfe von mreport lässt sich eine Zusammenfassung aus einer sendmail-Logdatei generieren. mreport findet man in den FreeBSD Ports unter mail/mreport:

# cd /usr/ports/mail/mreport && make install clean

Ruft man mreport ohne Argumente auf, so wird eine Zusammenfassung von /var/log/maillog erstellt:

# mreport
[mailserver.chruetertee.ch] [/var/log/maillog]
* [ 101] 2547567 mail1@cheutertee.ch empfänger1@example.org
[ 22] 3471 mail1@cheutertee.ch empfänger2@example.org
[ 10] 2452 mail2@cheutertee.ch empfänger1@example.org
[ 4] 1152 mail2@cheutertee.ch empfänger2@example.org

=====================
Total Bytes : 2561966
Number of Records : 137
---------------------
Host Name : mailserver.chruetertee.ch
Input File : /var/log/maillog
Output File : stdout
First Record : Mar 9 10:34:37
Last Record : Mar 14 12:30:07
---------------------
Time Taken : 773 µs
=====================
mreport-0.9 by Jason Armstrong

In der ersten Spalte wird angezeigt, wieviele Mails von diesem Absender an den Empfänger gesendet wurden. Die zweite Spalte zeigt die Gesamtgrösse aller Mails in Byte an, danach wird die Absenderadresse und die Empfängeradresse ausgegeben. Mit der -i Option kann ein alternativer Pfad zur sendmail-Logdatei angegeben werden. Verwendet man die -o Option, wird die Ausgabe in eine Datei geschrieben:

# mreport -i /var/log/maillog.archive -o /tmp/mreport.out

Soll nur eine Zusammenfassung für bestimmte Mailadressen generiert werden, kann mit der -p Option ein Teil der Mail-Adresse angegeben werden. Verwendet man die -l Option, so werden nur Adressen, welche das übergebene Argument im Domainnamen haben, in der Statistik berücksichtigt:

# mreport -l test
[mailserver.chruetertee.ch] [/var/log/maillog]

[ 4] 2452 root@test.chreutertee.ch empfänger1@example.org

=====================
Total Bytes : 2452
Number of Records : 1
---------------------
Host Name : mailserver.chruetertee.ch
Input File : /var/log/maillog
Output File : stdout
First Record : Mar 9 10:34:37
Last Record : Mar 14 12:30:07
---------------------
Time Taken : 694 µs
=====================
mreport-0.9 by Jason Armstrong

Mehr Informationen zu mreport findet man in der Manpage mreport(8).

 Permalink

Verzeichnis überwachen und auf Veränderungen reagieren

Mit Hilfe von wait_on kann zum Beispiel mittels eines Shell-Skripts ein Verzeichnis oder eine Datei überwacht und falls neue Dateien in das Verzeichnis geschrieben werden oder die überwachte Datei geändert wird, darauf reagiert werden. wait_on findet man im FreeBSD Portbaum unter sysutils/wait_on:

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

Als Argument kann wait_on zum Beispiel ein Verzeichnis übergeben werden. Danach wartet wait_on, bis in diesem Verzeichnis zum Beispiel eine neue Datei gespeichert oder gelöscht wird. Sobald eine solche Änderung erkannt wird, beendet sich wait_on. Anhand des Rückgabewertes von wait_on kann bestimmt werden, was für eine Änderung im Verzeichnis vorgenommen wurde. Verwendet man die -h Option werden zusätzliche Informationen zur Änderung ausgegeben:

# sleep 10 && touch /tmp/test &
# wait_on -h /tmp/
/tmp/: written
# echo $?
2

Die Bedeutungen aller Rückgabewerte sind in der Manpage von wait_on beschrieben.

Nun kann zum Beispiel ein Shell-Skript erstellt werden, welches auf neue Dateien in einem Verzeichnis reagiert.

#!/bin/sh
SOURCE=/var/upload


while :; do
wait_on $SOURCE
....
<Verarbeitet neue Dateien>
...
done

Mehr Informationen zu wait_on findet man in der Manpage wait_on(1).

 Permalink

Text einer Word-Datei auslesen

Mit Hilfe von antiword kann der Text einer Word-Datei ausgelesen und wenn gewünscht in eine Textdatei geschrieben werden. antiword findet man in den FreeBSD Ports unter textproc/antiword:

# cd /usr/ports/textproc/antiword && make install clean

Der Pfad zur Word-Datei muss als Argument an antiword übergeben werden. Der Text wird dann auf der Standardausgabe ausgegeben. Dieser kann wenn gewünscht in eine Textdatei umgelenkt werden:

# antiword <.doc-Datei> > <Text-Datei>

Wird die -f Option verwendet, werden in der Textausgabe fett geschriebene Textpassagen mit *Sternchen*, kursiver Text durch /Slashes/ und unterstrichener Text mit _Unterstrichen_ gekennzeichnet. Verwendet man die -a Option und gibt das gewünschte Papierformat an, wird ein PDF im entsprechenden Format generiert:

# antiword -a a4 <.doc-Datei> > <PDF-Datei>

Möchte man ein PostScript erstellen, kann die -p Option und das gewünschte Papierformat angegeben werden:

# antiword -p a4 <.doc-Datei> > <PS-Datei>
Mehr Informationen zu antiword findet man in der Manpage antiword(1).
 Permalink

Durchsatz einer Netzwerkschnittstelle beobachten

Möchte man den aktuellen Durchsatz einer Netzwerkschnittstelle beobachten, kann man ifstat verwenden. ifstat findet man in den FreeBSD Ports unter net/ifstat:

# cd /usr/ports/net/ifstat && make install clean

Ruft man ifstat ohne Optionen auf, wird der aktuelle Durchsatz aller aktiven Netzwerkschnittstellen ausser der Loopback-Schnittstelle angezeigt. Der aktuelle Wert wird immer unter die letzte Zeile geschrieben:

# ifstat
em0 ath0
KB/s in KB/s out KB/s in KB/s out
0.00 0.00 301.53 9.91
0.00 0.00 257.42 7.66
0.00 0.00 304.30 9.36
0.00 0.00 314.56 9.77
0.00 0.00 274.49 12.07
0.00 0.00 451.21 14.38

Soll nur jeweils der aktuelle Wert alleine angezeigt werden, kann die -S Option verwendet werden:

# ifstat -S
em0 ath0
KB/s in KB/s out KB/s in KB/s out
0.00 0.00 344.64 10.11

Möchte man die Werte der verschiedenen Schnittstellen addieren, kann mit der -T Option ein Total-Wert angezeigt werden:

# ifstat -S -T
em0 ath0 Total
KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out
26.49 0.00 345.02 39.49 371.51 39.49

Soll die Loopback-Schnittstelle auch angezeigt werden, kann dazu die -l Option verwendet werden:

# ifstat -S -l
em0 ath0 lo0
KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out
0.00 0.00 365.15 11.23 40.00 40.00

Mit der -t Option wird jeweils die aktuelle Zeit am Anfang der Zeile angezeigt:

# ifstat -t
Time em0 ath0
HH:MM:SS KB/s in KB/s out KB/s in KB/s out
18:54:01 0.00 0.00 356.23 11.20
18:54:02 0.00 0.00 352.90 10.86
18:54:03 0.00 0.00 302.90 9.60

ifstat kann durch das Drücken von Ctrl + C wieder beendet werden. Mehr Informationen zu ifstat findet man in der Manpage ifstat(1).

Comments (3)  Permalink
Prev Next191-200/325