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.
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.
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):
tar
: Archiv-Befehl (tape archiver)c
: Erstelle ein neues Archiv (create)z
: Komprimiere es (zip)v
: Liste betroffene Dateien (verbose)f
: Das Archiv sei folgende Datei (file)~/Desktop/hometoplevel.tgz
: Pfad für Archiv--no-recursion
: Ignoriere Unterverzeichnisse (no recursion)/Users/macmark/*
: Pfad zu den zu archivierenden DatenUm 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.
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).
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).
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:
create
: Erzeuge ein Diskimage.-srcfolder ~
: Verwende als Quelle mein privates Verzeichnis./Volumes/PlattenName/macmark.dmg
: Das Diskimage soll "macmark.dmg"
heißen und auf der Festplatte "PlattenName" gespeichert werden.-encryption
: Nimm die Standardverschlüsselung vor.Man kann mit bestimmten Terminal-Befehlen Voreinstellungen für die Benutzungsoberfläche verändern, an die man sonst nicht herankommt.
Man kann einen transparenten Wassertropfen aktivieren, der auf der Oberfläche 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):
defaults
: Voreinstellungenwrite
: Schreibe eine Voreinstellungcom.apple.Dock
: Betroffenes Programmwvous-floater
: Betroffene Eigenschaft (Exposé
hieß während der Entwicklung WindowVous)-bool
: Art des Wertes ist ein Wahrheitswert (boolean)true
: Inhalt des Wertes ist "wahr".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
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.
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.
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.
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:
ssh mickey@284.159.24.101
: Baue eine verschlüsselte
SSH-Verbindung auf zum Rechner
an Adresse 284.159.24.101 und identifiziere Dich bei diesem als Benutzer mickey.-L 59005
: Leite alle Daten, die zu meinem
lokalen (-L) Port 59005 geschickt werden, durch den
SSH-Tunnel.127.0.0.1:5900
: Am Ende des Tunnels (am Zielrechner mit Adresse 284.159.24.101)
entschlüssele die Daten wieder und leite sie von dort aus dann weiter
auf den Port 5900 an der Adresse 127.0.0.1.
Diese Adresse wird vom Zielrechner interpretiert;
die Adresse ist also in diesem Beispiel er selbst, da 127.0.0.1 immer die lokale Adresse
eines jeden Rechners selbst ist. Der Port 5900 wird in der Regel für
VNC verwendet.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.
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:
ssh mickey@284.159.24.101
: Baue eine verschlüsselte
SSH-Verbindung auf zum Rechner
an Adresse 284.159.24.101 und identifiziere Dich bei diesem als Benutzer mickey.-L 54854
: Leite alle Daten, die zu meinem
lokalen (-L) Port 54854 geschickt werden, durch den
SSH-Tunnel.127.0.0.1:548
: Am Ende des Tunnels (am Zielrechner mit Adresse 284.159.24.101)
entschlüssele die Daten wieder und leite sie von dort aus dann weiter
auf den Port 548 an der Adresse 127.0.0.1.
Diese Adresse wird vom Zielrechner interpretiert;
die Adresse ist also in diesem Beispiel er selbst, da 127.0.0.1 immer die lokale Adresse
eines jeden Rechners selbst ist. Der Port 548 wird in der Regel für
AFP verwendet.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.
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.
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.
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:
`find . -name "*.txt"`
: Dieser Befehl wird zuerst befolgt wegen der
speziellen Hochkommata, die ihn umgeben. Er erstellt eine Liste aller Dateien, die
im aktuellen Verzeichnis oder in darunterliegenden Verzeichnissen liegen, und
die auf .txt
enden. Die Liste der gefundenen Dateien wird dann in den
umgebenden Befehl eingesetzt.
for f in `(Liste)` ; do
: Die Liste wird abgearbeitet der Reihe nach.
mv ./"$f" "${f%txt}html"; done
: Jeder Datei(pfad)name wird
umbenannt (mv), wobei vom Namen,
der jeweils in $f gespeichert ist, hinten "txt" abgeschnitten wird (mit %txt)
und dann "html" angehängt wird.
Terminal-Befehle unterscheiden zwischen Groß- und Klein-Buchstaben; also auf die Schreibweise auch bei den Datei-Endungen achten.
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
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"
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.
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 "".
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".
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
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 {} +
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.
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