8. Terminal Inhaltsverzeichnis

Ich stelle hier einige nützliche Beispiele für Terminal-Befehle in Mac OS X vor. Die meisten davon nutze ich selbst regelmäßig; es sind also Beispiele aus der Praxis.

Der Vorteil beim Terminal ist, daß die Befehle eindeutig sind. Wenn man hingegen ein graphisches Hilfsprogramm benutzt, dann weiß man nie, was es wirklich tut.

Stichwort-Liste

8.1 Sichern von Verzeichnissen

Ich sichere die erste Ebene meines privaten Verzeichnisses und bestimmte Unter-Verzeichnisse. Dazu packe ich bestimmte Gruppen von Daten in einzelne Archive und brenne diese anschließend auf CD/DVD.

8.1.1 Sichern der obersten Ebene

Um die erste Ebene zu archivieren und zu komprimieren, wobei eventuelle Meta-Daten erhalten bleiben, nehme ich diesen Befehl:

tar -czvf ~/Desktop/hometoplevel.tgz \
--no-recursion /Users/macmark/*

Das Zeichen "\" jeweils am Ende einer Zeile ermöglicht mehrzeilige Befehlseingabe. Es kommentiert den Zeilenumbruch aus. Ohne dieses Zeichen sollte alles in einer Zeile stehen.

Das erzeugt ein komprimiertes Archiv namens "hometoplevel.tgz" auf meinem Schreibtisch, welches alle Dateien enthält, die im Verzeichnis des Benutzers "macmark" (das bin ich) auf oberster Ebene liegen. Die Einzelteile des Befehls haben folgende Bedeutung (von links nach rechts):

8.1.2 Sichern von Unter-Verzeichnissen

Um das komplette Verzeichnis mit (beispielsweise) meinen Dokumenten zu sichern, nehme ich diesen Befehl:

tar -czvf ~/Desktop/Documents.tgz \
/Users/macmark/Documents/*

Das erzeugt ein komprimiertes Archiv namens "Documents.tgz" auf meinem Schreibtisch. Die Bedeutung der Einzelteile ist analog zum Sichern der obersten Ebene.

8.1.3 Inkrementelles Sichern von Unter-Verzeichnissen

Später möchte ich nur noch Daten sichern, die neu hinzugekommen sind seit einem Zeitpunkt. Um alle meine Dokumente zu sichern, die nach einem Datum neu erstellt oder verändert wurden, nehme ich diesen Befehl:

tar -czvf \
~/Desktop/Documents_2006-02-19.tgz \
--newer-mtime '2005-11-27 00:00' /Users/macmark/Documents/*

Das erzeugt ein komprimiertes Archiv namens "Documents_2006-02-19.tgz" auf meinem Schreibtisch. Die Bedeutung der meisten Einzelteile ist analog zum Sichern der obersten Ebene. Neu ist:

--newer-mtime '2005-11-27 00:00': Berücksichtige alle seit diesem Datum und dieser Uhrzeit neu erstellten oder geänderten Dateien (newer modified time).

8.1.4 Entpacken der Archive

Zum Entpacken eines wie oben erstellten Archivs kann man einen Befehl wie diesen verwenden:

tar -xzvf \
Documents_2006-02-19.tgz

Damit wird das angegebene Archiv (eventuell den ganzen Pfad angeben, falls man sich nicht im selben Verzeichnis befindet) in dem Verzeichnis entpackt, in dem man sich gerade befindet. Neu bei diesem Kommando ist:

x: Extrahiere, das bedeutet "entpacke" (extract).

8.1.5 Verschlüsseltes Diskimage

Um mein gesamtes privates Verzeichnis in einem verschlüsselten Diskimage zu speichern, verwende ich:

sudo hdiutil create -srcfolder ~ \
/Volumes/PlattenName/macmark.dmg -encryption

Die Einzelteile des Befehls haben folgende Bedeutung:

8.2 Aqua ändern

Man kann mit bestimmten Terminal-Befehlen Voreinstellungen für die Benutzungsoberfläche verändern, an die man sonst nicht herankommt.

8.2.1 Wassertropfen von Exposé

Erdball

Man kann einen transparenten Wassertropfen aktivieren, der auf der Oberfläche Wassertropfen von Exposé schwimmt, und mit dem die Exposé-Funktion "alle Fenster dieses Programms" per Mausklick und die Exposé-Funktion "alle Fenster" per alt-Mausklick aktiviert werden kann. Um diesen zu aktivieren gibt man ein:

defaults write com.apple.Dock \
wvous-floater -bool true

Die Einzelteile des Befehls haben folgende Bedeutung (von links nach rechts):

Danach neu einloggen oder dies eingeben, wodurch das Dock beendet wird. Es wird sofort automatisch neu gestartet und erkennt die neuen Voreinstellungen:

killall Dock

Um den Tropfen wieder zu beseitigen gibt man anstelle von true einfach false ("falsch") ein.

Vergleiche dazu Scott Knaster: Hacking Mac OS X Tiger, Kapitel 3

8.2.2 Verkleinerungs-Effekte

Beim Verkleinern eines Fensters ins Dock und zurück kann man zwischen drei verschiedenen Effekten wählen:

Danach neu einloggen oder dies eingeben, wodurch das Dock beendet wird. Es wird sofort automatisch neu gestartet und erkennt die neuen Voreinstellungen:

killall Dock

Der erste Effekt saugt Fenster ein, der zweite skaliert sie und der dritte ist der bekannte Standard-Effekt.

8.2.3 Undurchsichtige Menüleiste

Wenn man bei Leopard die Menüleiste lieber nicht halbdurchsichtig, sondern undurchsichtig haben möchte, dann gibt man ein:

sudo defaults write \
/System/Library/LaunchDaemons/com.apple.WindowServer \
'EnvironmentVariables' -dict 'CI_NO_BACKGROUND_IMAGE' 1

Nach dem nächsten Neustart ist die Menüleiste dann undurchsichtig. Man kann Werte zwischen 1.0 (weiß) und 0.0 (grau) wählen.

Danke an Steve Miner für seinen Tip.

Wenn man sie wieder transparent haben möchte:

sudo defaults delete \
/System/Library/LaunchDaemons/com.apple.WindowServer \
'EnvironmentVariables'

Nach dem nächsten Neustart ist die Menüleiste dann wieder durchsichtig.

8.3 SSH-Tunnel und Sicherheit

Mit SSH kann man eine Kommunikation verschlüsseln, die ansonsten im Klartext erfolgen würde, und unsichere Verbindungen durch einen SSH-Tunnel gesichert nutzen.

Um SSH-Verbindungen zu nutzen, muß am Zielrechner "Remote Login" beziehungsweise "Entfernte Anmeldung" aktiviert sein.

8.3.1 SSH-Tunnel für VNC

Zum Absichern einer VNC-Verbindung kann man sie durch einen SSH-Tunnel schicken. Der Tunnel wird so erstellt:

ssh -L 59005:127.0.0.1:5900 \
mickey@284.159.24.101

Die Einzelteile des Befehls haben folgende Bedeutung:

Wenn ich nun auf meinem Rechner VNC eine Verbindung zum lokalen Port 59005 aufnehmen lasse, dann wird eine Verbindung per SSH-Tunnel zum entfernten Rechner genutzt. Als Zieladresse der Verbindung ist 127.0.0.1:59005 anzugeben also der Port 59005 des eigenen Rechners.

Ich verwende den Port 59005 zur Weiterleitung, weil ich dazu nicht root sein muß. Die Ports bis zur Nummer 1023 darf nur root ändern.

Das ersetzt eine direkte unsichere VNC-Verbindung zum Rechner an Adresse 284.159.24.101 auf Port 5900.

Als VNC Client nutze ich Chicken of the VNC.

Als VNC Server nutze ich OSXvnc.

8.3.2 SSH-Tunnel für AFP

Mit der normalen Version von Mac OS X kann der AFP-Server kein verschlüsseltes AFP zur Verfügung stellen. Man kann sich jedoch anders behelfen.

Zum Absichern einer AFP-Verbindung kann man sie durch einen SSH-Tunnel schicken. Der Tunnel wird so erstellt:

ssh -L 54854:127.0.0.1:548 \
mickey@284.159.24.101

Die Einzelteile des Befehls haben folgende Bedeutung:

Nun kann man den anderen Rechner so über AFP erreichen:

afp://127.0.0.1:54854

Ich verwende den Port 54854 zur Weiterleitung, weil ich dazu nicht root sein muß. Die Ports bis zur Nummer 1023 darf nur root ändern.

8.3.3 SSH-Zugriff einschränken

Wenn man SSH aktiviert hat und darüber hinaus nichts unternimmt, dann kann sich jeder auf dem Rechner angelegte Benutzer per SSH anmelden. Es ist ratsam, nur möglichst wenigen diesen Zugriff zu ermöglichen. In der Datei /etc/sshd_config sollte daher der Zugriff nur für ausdrücklich genannte Benutzer definiert werden mit der neu hinzuzufügenden Zeile

AllowUsers mickey goofy

In diesem Beispiel können sich nur die beiden genannten Benutzer per SSH einloggen. Außerdem empfiehlt es sich, root ausdrücklich keine Verbindung zu erlauben, indem die folgende erste Zeile wie gezeigt auskommentiert bleibt und die andere ergänzt wird, um es nochmal ausdrücklich definiert zu haben:

#PermitRootLogin yes
PermitRootLogin no

Die auskommentierte erste Zeile zeigt den Standardwert, der auch angenommen wird, wenn man den Wert nicht ausdrücklich setzt.

Allerdings kann man sich standardmäßig nicht als root an Mac OS X anmelden, es sei denn man hat (in den Versionen vor Leopard) es im NetInfo Manager aktiviert. Seit Leopard ist der NetInfo Manager ganz beseitigt worden und man kann die Aktivierung im /Applications/Utilities/Directory Utility.app vornehmen. In Schnee-Leopard ist das Programm unter System Preferences, Accounts, Login Options, Network Account Server, Open Directory Utility … erreichbar. Ferner kann auch die obige Liste ausdrücklich erlaubter SSH-Benutzer ein Anmelden als root verhindern.

Solche Beschränkungen sind nützlich, weil es die Regel ist, daß täglich Versuche per Internet vorkommen, sich auf anderen Rechnern via SSH anzumelden.

8.3.3.1 Ergänzungen zu SSH für Mac OS X 10.5 Leopard

Bei Leopard kann man weiterhin das oben beschriebene Vorgehen nutzen. Man kann jedoch auch die SSH-Konfiguration in den Systemeinstellungen verwenden, die es ebenfalls erlaubt, die Benutzer, die sich per SSH anmelden dürfen, festzulegen.

Wenn man beide Konfigurationsmöglichkeiten verwendet, sollte man darauf achten, daß sich die Regeln nicht widersprechen. Wenn beispielsweise die Textkonfiguration nur den Benutzer DumbGuy erlaubt und die Systemeinstellung nur den Benutzer Bozo, dann kann sich niemand per SSH anmelden.

8.4 Umbenennen vieler Dateien

Eine für graphische Benutzungsschnittstellen schwierige Aufgabe ist diese: Alle Dateien, die verstreut in Unterverzeichnissen liegen und eine bestimmte Endung haben, einfach umbenennen mit einer anderen Endung. Beispielsweise alle .txt-Dateien in .html-Dateien umbenennen.

Mit dem Terminal geht das flott:

for f in `find . -name "*.txt"` ; do \
mv ./"$f" "${f%txt}html"; done

Der Befehl besteht aus zwei Befehlen, die ineinander verschachtelt sind. Ein Befehl sucht alle Dateien im aktuellen Verzeichnis und darunterliegenden Verzeichnissen, die auf .txt enden. Der andere arbeitet diese Liste ab und schneidet jeweils hinten "txt" ab und hängt "html" dran.

Das Zeichen "\" jeweils am Ende einer Zeile ermöglicht mehrzeilige Befehlseingabe. Es kommentiert den Zeilenumbruch aus. Ohne dieses Zeichen sollte alles in einer Zeile stehen.

Die Einzelteile des Befehls haben folgende Bedeutung:

Terminal-Befehle unterscheiden zwischen Groß- und Klein-Buchstaben; also auf die Schreibweise auch bei den Datei-Endungen achten.

8.5 Untersuchen von Dateien

Man kann sich mit einigen Terminal-Befehlen einen Überblick verschaffen, was für eine Datei einem vorliegt. Das ist besonders hilfreich bei Dateien, die man lieber nicht Doppelklicken will.

Dateityp feststellen:

file meineDatei

Datei-Attribute ansehen (setzt Xcode voraus und darin die Nach-Installation der Command-Line-Tools):

getfileinfo meineDatei

Inhalt eines Archivs (ZIP) anzeigen, ohne es zu entpacken:

unzip -l meineDatei

Texte aus einer Datei anzeigen. Das kann erste Hinweise liefern, was sie tun will:

strings meineDatei

8.5.1 Erweiterte Attribute von Dateien

Leopard kennt den speziellen Befehl xattr zur Handhabung von erweiterten Attributen (extended attributes), von denen die Quarantäne eines ist.

xattr -h
usage: xattr [-l] file [file ...]
xattr -p [-l] attr_name file [file ...]
xattr -w attr_name attr_value file [file ...]
xattr -d attr_name file [file ...]
The first form lists the names of all xattrs on the given file(s).
The second form (-p) prints the value of the xattr attr_name.
The third form (-w) sets the value of the xattr attr_name to attr_value.
The fourth form (-d) deletes the xattr attr_name.

options:
-h: print this help
-l: print long format (attr_name: attr_value)

So kann man sich die erweiterten Attribute einer Datei auflisten:

xattr Britney\ Spears\ -\ Baby\ One\ More\ Time.mp3/
oder
xattr "Britney Spears - Baby One More Time.mp3"
com.apple.FinderInfo
com.apple.quarantine

So kann man das Quarantäne-Attribut einer Datei lesen:

xattr -p com.apple.quarantine Britney\ Spears\ -\ Baby\ One\ More\ Time.mp3/
0000;4735e135;Safari;FD0BDC21-5AC2-4B06-80E0-DAA4001ADEA6|com.apple.Safari

So kann man das Quarantäne-Attribut einer Datei entfernen:

xattr -d com.apple.quarantine "Britney Spears - Baby One More Time.mp3"

8.5.2 Testlauf im Sandkasten

Seit Leopard können alle möglichen ausführbaren Dateien in beliebig definierten Sandkästen laufen. Beispiele für solche Sandkästen, sogenannte Sandbox-Profile, findet man im Verzeichnis /usr/share/sandbox.

Man kann selbst einen Sandkasten mit solch einer Datei definieren, aber es ist unter anderem auch möglich, die Rahmenbedingungen im Kommando selbst anzugeben. Im folgenden Beispiel rufe ich Safari auf und nehme ihm die Möglichkeit, Dateien zu schreiben oder auf das Netzwerk zuzugreifen:

sandbox-exec -p "(version 1) (allow default) (deny network*) (deny file-write*) (debug deny)" /Applications/Safari.app/Contents/MacOS/Safari

Da außerdem die Debug-Funktion eingeschaltet ist für versuchte, aber nicht gewährte Zugriffe, kann man in Console.app die gescheiterten Versuche lesen.

Wenn man ein Programm also auf seine Funktion testen will, kann man es erstmal in einem geeigneten Sandkasten laufen lassen. Zu beachten ist, daß man nicht open verwenden sollte, weil das Programm dann nicht als Kindprozeß dieses Kommandos laufen würde und somit dessen Sandkasten nicht erben kann, sondern daß man direkt die ausführbare Programmdatei innerhalb des Programmpaketes startet wie im obigen Beispiel.

Wenn man alle kontrollierbaren Aktionen sehen möchte, dann sollte man (debug all) nutzen in obigem Befehl.

8.6 Start-Informationen

Wenn man anstelle des grauen Apfels beim Systemstart lieber die Aktivitäten beobachten möchte, dann gibt man folgendes ein:

sudo nvram boot-args="-v"

Dadurch wird der entsprechende Parameter im nichtflüchtigen Speicher gesetzt. Möchte man es rückgängig machen, ersetzt man "-v" durch "".

8.7 Unsichtbare Dateien im Finder

Wenn man auch die normalerweise nicht-angezeigten UNIX-Dateien im Finder sehen möchte, dann gibt man folgendes ein:

defaults write com.apple.finder AppleShowAllFiles true

Beim nächsten Start des Finders, zum Beispiel beim nächsten Anmelden, wirkt sich dies dann aus. Möchte man es rückgängig machen, ersetzt man "true" durch "false".

8.8 Hintergrund-Prozesse analysieren

Um zu sehen, was auf dem Rechner so alles im Hintergrund läuft, aber nicht serienmäßig ist, also nachträglich installiert wurde, kann man wie folgt vorgehen:

sudo launchctl list | grep -v com.apple > ~/Desktop/non_apple_launchd_root.txt

Das ist eine Liste der für root geladenen Aufgaben, die nicht den Apple-Stempel haben. Genauer gesagt sind diese Aufgaben Dämonen oder Agenten.

Außerdem könnten im eigenen Benutzerkontext Agenten laufen:

launchctl list | grep -v com.apple > ~/Desktop/non_apple_launchd_user.txt

Interessant ist auch, wenn bei kextstat etwas auftaucht, was nicht com.apple.* heißt. Schnell rauszufinden mit:

kextstat | grep -v com.apple > ~/Desktop/non_apple_kexts.txt

Das zeigt die geladenen Kernel-Erweiterungen an. Bevor da Drittsoftware auftauchen darf, würde ich mir das dreimal überlegen. Und dann kann man noch nachschauen, welche Prozesse laufen:

ps -ax > ~/Desktop/ps.txt

Der Mac verwendet keine cronjobs mehr, falls doch einer eingetragen ist, dann ist er verdächtig:

crontab -l > ~/Desktop/user_crontab.txt

sudo crontab -l > ~/Desktop/root_crontab.txt

8.9 Programme-Besitzer korrigieren

Programme, die ein Administrator unter /Applications ablegt, haben diesen als Besitzer. Die Programme, die mit dem System ausgeliefert werden, haben jedoch das System als Besitzer. So kann man die Programme finden, die nicht das System als Besitzer oder die Administrator-Gruppe nicht als Gruppe haben:

find /Applications -type d -iname "*.app" \
\( -not -user root -or -not -group admin \) -exec ls -adl {} +

Und so bekommen die betreffenden Programme, genauer gesagt sind es ja Verzeichnisse, System und Administrator-Gruppe als Besitzer und außerdem lasse ich sie nochmals ausgeben:

Zuerst nur den Besitzer korrigieren:

sudo find /Applications -type d -iname "*.app" \
-not -user root \
-exec ls -ald {} + -exec chown root: {} +

Da zwei verschiedene Gruppen in Frage kommen, wird die Gruppe nur korrigiert, wenn keine der beiden verwendet wird:

sudo find /Applications -type d -iname "*.app" \
\( -not -group wheel -and -not -group admin \) \
-exec ls -ald {} + -exec chown :admin {} +

8.10 Virtuellen Server ansprechen

Virtuelle Server teilen sich mit anderen eine IP-Adresse. Damit die gewünschte Seite ausgeliefert werden kann, wird daher zusätzlich noch der Host-Name aus der Anfrage gelesen. Per Terminal kann man eine passende Anfrage absetzen.

Diese Zeilen tippen und jede mit Return abschliessen:

nc 80.150.6.143 80
GET / HTTP/1.1
Host: macmark.de
Referrer: mactechnews.de
User-Agent: MyFatNetcatBrower

Zweimal Return drücken und dann die Seite lesen. Das klappt mit jeder beliebigen Seite. Das ist ganz nützlich, wenn die DNS mal ausfallen.

8.11 Zugriff auf Netzwerk-CD/DVD einrichten

Wenn man wie beim MacBook Air die CD/DVD-Laufwerke anderer Rechner nutzen will, genügt es nicht, auf diesen die gemeinsame Nutzung einzuschalten. Es sind zwei weitere Befehle nötig und nach einem Neustart kann dann beispielsweise mein MacBook, das ein defektes optisches Laufwerk hat, CDs/DVDs verwenden, die in meinem iMac eingelegt sind:

defaults write com.apple.NetworkBrowser EnableODiskBrowsing -bool true defaults write com.apple.NetworkBrowser ODSSupported -bool true

Thematisch ergänzende Querverweise

Valid XHTML 1.0!

Besucherzähler


Latest Update: 11. September 2015 at 19:51h (german time)
Link: osx.macmark.de/osx_terminal.php