Category: Shell Tutorial


Eigentlich dachte ich, diesen Artikel hätte ich bereits seit langem geschrieben, aber das scheint offenbar doch nicht so.

Wer ein Shell Script mit dem wohlklingenden Namen klickmich.sh auf dem Desktop hat und dies per Doppelklick ausführen möchte, muss leider feststellen, dass diese Datei nicht ausgeführt wird, sondern mit einem Programm (in meinem Fall XCode) geöffnet wird.

Das ist etwas schade… :)

Wenn man aber klickmich.sh in klickmich.command umbenennt, dann verhält sich Mac OS X so, wie man es eigentlich erwartet. Das Shell Script wird ausgeführt. Aber Achtung! Bedingung ist, dass das Shell Script mit dem executable Bit versehen ist. Dies wird erreicht, indem man im Terminal

chmod +x /path/to/klickmich.command

ausführt. Ein ausführlicher Artikel über Dateiberechtigungen findet sich ebenfalls auf apfelschwein.net.

Prozesse mit top anzeigen

Wer immer eine aktualisierte Ausgabe von den laufenden Prozessen auf dem System anschauen möchte, kann top verwenden:

Processes:  60 total, 2 running, 58 sleeping... 190 threads            13:48:08
Load Avg:  0.16, 0.18, 0.20     CPU usage:  5.9% user, 5.0% sys, 89.0% idle
SharedLibs: num =  191, resident = 23.1M code, 4.10M data, 5.34M LinkEdit
MemRegions: num =  6998, resident =  119M + 8.44M private, 65.9M shared
PhysMem:   178M wired,  166M active,  110M inactive,  455M used, 56.2M free
VM: 7.88G +  129M   315027(0) pageins, 168555(0) pageouts
PID COMMAND      %CPU   TIME   #TH #PRTS #MREGS RPRVT  RSHRD  RSIZE  VSIZE
983 top          8.6%  0:00.45   1    19    20   740K   376K  2.47M  27.0M
971 bash         0.0%  0:00.01   1    14    17   220K   776K   788K  27.1M
970 sshd         0.0%  0:00.04   1    11    43   136K   968K   916K  29.5M
963 sshd         0.0%  0:00.13   1    16    44   124K   968K  2.76M  29.6M
927 NetCfgTool   0.0%  0:00.02   1    21    25   248K   556K  3.24M  27.2M
926 writeconfi   0.0%  0:00.07   1    22    26   328K   612K  8.00M  27.8M
924 System Pre   0.0%  0:01.00   3   128   210  10.5M  8.79M  28.3M   345M
922 mdimport     0.0%  0:00.18   3    60    45   868K  2.02M  2.65M  38.8M
917 bash         0.0%  0:00.00   1    14    18   216K   776K   812K  27.1M
916 login        0.0%  0:00.01   1    16    41   144K   488K   612K  26.9M
885 firefox-bi   2.4% 39:04.94   6   100   434  59.0M  27.7M  93.1M   472M
857 Preview      0.0%  1:09.03   1    71   136  1.59M  5.00M  3.40M   333M
574 GimmeSomeT   0.0%  0:50.67   4   105   576  4.34M  10.1M  8.45M   354M
573 iTunes       5.4%  2:20:49   8   198  1031  13.8M  11.9M  19.6M   392M
558 VLC          0.4% 10:45.68   7   136   412  3.14M  6.45M  3.20M   374M
394 AppleSpell   0.0%  0:00.02   1    30    32  4.00K  1.12M  1.68M  37.2M
378 cupsd        0.0%  0:00.16   2    29    26   284K   704K   492K  27.9M
236 System Eve   0.0%  0:01.53   1    61    89   840K  1.48M  1.43M   318M
208 Terminal     0.0% 15:46.23  11   159   198  3.40M  9.00M  14.4M   349M
192 usbmuxd      0.0%  0:00.01   2    21    23  4.00K   292K   284K  27.0M
189 gstlaunche   0.0%  0:00.56   1    58   125   304K  2.80M  1.00M   324M
188 iCalAlarmS   0.0%  0:00.81   1    61    76   568K  2.27M  1.13M   319M
186 iTunesHelp   0.0%  0:00.41   2    61    90   252K  3.71M   800K   325M
185 UniversalA   0.0%  2:22.85   1    63    89   400K  2.99M  1020K   324M
181 Finder       0.0%  0:07.88   3   119   205  1.98M  8.46M  2.98M   353M

Die Ausgabe wird einmal pro Sekunde aktualisiert (wobei man dies mit -s einstellen kann). Mit top -o cpu wird nach CPU Benutzung sortiert, mit top -u rsize nach Memory Belegung.

Die Handhabung von top unter Debian ist meiner Meinung nach komfortabler, da sämtliche Einstellungen während top läuft angepasst werden können. Dies geht zwar unter Mac OS X auch, man muss aber top mit dem Parameter -L starten.

Prozesse von Mac OS X anzeigen

Wer sich interessiert, was für Prozesse auf einem Mac OS X ausgeführt wird, kann im Terminal den Befehl ps nutzen.

Hier ein Auszug was auf apfelschwein so abgeht:

apfelschwein:~ andy$ ps auxwww
USER       PID %CPU %MEM      VSZ    RSS  TT  STAT STARTED      TIME COMMAND
andy       573   4.6  3.8   401904  20020  ??  S    Tue11PM 139:58.02 /Applications/iTunes.app/Contents/MacOS/iTunes -psn_0_11141121
andy       885   2.1 18.2   483412  95288  ??  Ss   10:17AM  38:41.46 /Applications/Firefox.app/Contents/MacOS/firefox-bin -psn_0_19136513 -foreground
andy       558   0.1  0.6   383836   3280  ??  S    Tue10PM  10:41.76 /Applications/VLC.app/Contents/MacOS/VLC -psn_0_10878977
andy       971   0.1  0.2    27728    792  p2  Ss    1:32PM   0:00.02 -bash
root       974   0.1  0.1    27316    420  p2  R+    1:33PM   0:00.00 ps auxwww
root        31   0.0  0.1    28364    284  ??  Ss   Sun11PM   0:00.04 /usr/sbin/KernelEventAgent
root        32   0.0  0.1    28564    664  ??  Ss   Sun11PM   0:04.74 /usr/sbin/mDNSResponder -launchdaemon
root        33   0.0  0.2    27580    928  ??  Ss   Sun11PM   0:01.56 /usr/sbin/netinfod -s local
root        34   0.0  0.1    27288    308  ??  Ss   Sun11PM   0:00.36 /usr/sbin/syslogd
root        37   0.0  0.2    30032    856  ??  Ss   Sun11PM   0:03.35 /usr/sbin/configd
root        38   0.0  0.2    34516   1124  ??  Ss   Sun11PM   0:00.80 /usr/sbin/coreaudiod
root        39   0.0  0.1    27776    648  ??  Ss   Sun11PM   0:00.52 /usr/sbin/diskarbitrationd
root        40   0.0  0.1    28420    472  ??  Ss   Sun11PM   0:00.06 /usr/sbin/memberd -x
[..]

Die PID ist die Process ID. Jedem Prozess wird eine solche, eindeutige Nummer zugewiesen. Warum dies wichtig ist, wird in den nächsten Posts aufgelöst ;).

ps hat zahlreiche Optionen:

-a      Display information about other users' processes as well as your
own.
-A      Display information about other users' processes including those
without controlling terminals.
-c      Change the ``command'' column output to just contain the exe-
cutable name, rather than the full command line.
-C      Change the way the cpu percentage is calculated by using a
``raw'' cpu calculation that ignores ``resident'' time (this normally has no effect).
-e      Display the environment as well.
-h      Repeat the information header as often as necessary to guarantee
one header per page of information.
-j      Print information associated with the following keywords: user,
pid, ppid, pgid, sess, jobc, state, tt, time and command.
-L      List the set of available keywords.
-l      Display information associated with the following keywords: uid,
pid, ppid, cpu, pri, nice, vsz, rss, wchan, state, tt, time and
command.
-M      Print the threads corresponding to each task.
-m      Sort by memory usage, instead of by process ID.
-O      Add the information associated with the space or comma separated
list of keywords specified, after the process ID, in the default
information display.  Keywords may be appended with an equals
(``='') sign and a string.  This causes the printed header to use
the specified string instead of the standard header.
-o      Display information associated with the space or comma separated
list of keywords specified.  Keywords may be appended with an
equals (``='') sign and a string.  This causes the printed header
to use the specified string instead of the standard header.
-p      Display information associated with the specified process ID.
-r      Sort by current cpu usage, instead of by process ID.
-S      Change the way the process time is calculated by summing all
exited children to their parent process.
-T      Display information about processes attached to the device asso-
ciated with the standard input.
-t      Display information about processes attached to the specified
terminal device.
-U      Display the processes belonging to the specified username.
-u      Display information associated with the following keywords: user,
pid, %cpu, %mem, vsz, rss, tt, state, start, time and command.
The -u option implies the -r option.
-v      Display information associated with the following keywords: pid,
state, time, sl, re, pagein, vsz, rss, lim, tsiz, %cpu, %mem and
command.  The -v option implies the -m option.
-w      Use 132 columns to display information, instead of the default
which is your window size.  If the -w option is specified more
than once, ps will use as many columns as necessary without
regard for your window size.
-x      Display information about processes without controlling termi-
nals.

Wer ist eingeloggt?

Wer wissen möchte, wer denn auf seinem Unix-basierten OS eingeloggt ist, kann im Terminal w ausführen. Und so sieht dass aus:

apfelschwein:~ andy$ w
11:15 up 5 days, 11:50, 2 users, load averages: 0.34 0.28 0.19
USER TTY FROM LOGIN@ IDLE WHAT
andy console - Sun23 5days -
andy p1 - 11:15 - w

Wie lange läuft dein Mac schon?

Das Uptime eines Unix-basierten OS dient immer wieder zu Schwanz-Vergleichen unter den Besitzern. Eine hohe Uptime heisst aber unter Umständen auch, dass das System nicht mehr auf dem neuesten Softwarestand ist und deshalb Sicherheitslücken enthält. Lieber eine kleinere Uptime als ein gehacktes System. Der Ärger wäre definitiv grösser.

Deine Uptime (resp. diejenige deines Öpfels, Linux, etc.) findest du heraus in dem du im Terminal den Befehl uptime eintippst. Dann sieht dass dann so aus:

apfelschwein:~ andy$ uptime
11:00 up 5 days, 11:36, 2 users, load averages: 0.27 0.20 0.12

Wie lange läuft dein Mac schon?

Befehle abkürzen

Einige Befehle haben wir nun mittlerweile kennengelernt und sollten damit eigentlich schon recht gut zurecht kommen. Mit dem Befehl alias kann man Befehle/Abkürzungen definieren.

Statt immer ls -la eingeben zu müssen, können wir auf manchen Systemen nur l eingeben und der gleiche Output erscheint. Definiert wird l mit alias:

alias l="ls -la"

Und schon kann man l benutzen.

Damit man diesen Befehl nicht immer eingeben muss, bevor sich dieser Alias verwenden lässt, trägt man unter Mac OS X

alias l="ls -la"

in die Datei .profile, die im Home-Verzeichnis liegt, ein. Unter Linux (mit Bash als Shell) ist es meistens .bashrc oder .bash_profile, die ebenfalls im Home-Verzeichnis liegen.

Eigentümer einer Datei ändern

Den Eigentümer einer Datei kann man wie folgt über das Terminal ändern:

chown username datei

chown username:group datei

chown :group datei

chgrp group datei

chown steht für “change owner” und chgrp steht für “change group”. Ziemlich einleuchtend, nicht?

Um einen Ordner mitsamt allen Unterordnern und Dateien anzupassen, wird folgender Befehl verwendet:

chown -R username:group datei

Dateiberechtigungen ändern

Da wir nun verstehen, wie Datei-Berechtigungen unter Unix funktionieren, setzen wir das ganze in die Praxis um.

Mit dem Befehl chmod (change mode) können wir die Dateiberechtigungen anpassen. Dies ist auf mehrere Arten möglich und wird am Besten mit mehreren Beispielen erläutert:

andy@thinkpink:/tmp/test$ l
total 8
drwxr-xr-x 2 andy andy 4096 2007-07-01 16:47 dir1
drwxr-xr-x 2 andy andy 4096 2007-07-01 16:47 dir2
-rw-r--r-- 1 andy andy 0 2007-07-01 16:47 file1
-rw-r--r-- 1 andy andy 0 2007-07-01 16:47 file2
-rw-r--r-- 1 andy andy 0 2007-07-01 16:47 file3


andy@thinkpink:/tmp/test$ chmod 600 file1

Dieser Befehl hat die Berechtigung wie folgt geändert:

-rw------- 1 andy andy 0 2007-07-01 16:47 file1

Was hat es mit den seltsamen Zahlen auf sich? Das ist ganz einfach und wird an einem weiteren Beispiel erläutert:

Jedes Dreiergrüppchen “rwx” ist einem Zahlenwert von 0 bis 7 zugeordnet. Die erste Ziffer dieses Dreiergrüppchen, das “r”, hat den Wert 4. Die zweite Ziffer “w” hat den Wert 2 und die dritte Ziffer “x” den Wert 1.

Eigentümer:

r--
-w-
--x

Wenn man jetzt diese Werte zusammenzählt, bekommt man 7.

Gruppe:

r--
---
--x

Und diese Werte geben 5.

Everyone/Rest/World:

---
---
---

Resultat ergibt 0, da kein r, w oder x gesetzt ist.

Alles klar?

Und da wir jetzt eben 3 Dreiergrüppchen haben, werden diese 3 Ergebnisse einfach hintereinander gehängt:

750

Wenn wir jetzt ein

chmod 750 file2

machen, passiert das:

-rwxr-x--- 1 andy andy 0 2007-07-01 16:47 file2

Beim Eigentümer sind die Flags r, w und x gesetzt. Die Gruppe hat das r und x Flag und der Rest hat keinen Zugriff.

Mit chmod kann man auch anders arbeiten:

chmod u+rwx file3

file3 hat nun zusätzlich das x Flag gesetzt.

chmod o-rwx file3

Die World-Berechtigungen von file3 wurden komplett entfernt.

chmod g+w file3

Der Gruppe wird Schreibberechtigung auf file3 erteilt.

chmod o-rwx dir2

Dem Rest wird die Berechtigung auf das Verzeichnis dir2 entzogen.

chmod o=x dir1
drwxr-x--x 2 andy andy 4096 2007-07-01 16:47 dir1

Für Everyone ist nur noch das x-Flag gesetzt.

Unix Berechtigungen erklärt

Unix Berechtigungen mögen für den Anfänger auf den ersten Blick etwas kompliziert erscheinen, sind aber mit etwas Hintergrundwissen unglaublich einfach.

andy@apfelschwein:~$ ls -la test
-rw-r--r-- 1 andy andy 995 2007-07-03 20:30 test

Bei dieser Datei sehen wir 10 Stellen, die hier mit “-”, “r” und “w” gefüllt sind.

Die erste Stelle sagt etwas über den Typ des Objekts aus. Ein “-” ist eine normale Datei, ein “d” ist ein Verzeichnis und ein Link erkennt man am Buchstaben “l”. Es gibt noch weitere spezielle Files:

  • Block Devices: “b”
  • Character Devices: “c”
  • Unbuffered Character Devices: “u”
  • FIFO: “p”

Die übrigen neun Stellen sind die eigentlichen Berechtigungen. Man spricht hierbei vom MODE.

Die 9 Ziffern ergeben sich jeweils aus 3 Dreiergrüppchen:

rwxrwxrwx

Die ersten 3 Ziffern stehen für den Owner des Objekts. Die zweiten 3 Ziffern für die Gruppe und die letzten 3 Ziffern für den Rest (World oder Everyone).

Beispiele:

-rw-r-----

Der Eigentümer der Datei kann die Datei lesen und bearbeiten. Mitglieder der gleichen Gruppe dürfen die Datei nur lesen und der Rest hat keinen Zugriff auf die Datei.

-rwx--x--x

Wieder hat der Eigentümer der Datei Lese- und Schreibrechte. Zusätzlich kann er die Datei ausführen (es handelt sich vielleicht um ein Shellscript). Der Rest (inklusive Gruppe) darf die Datei weder lesen noch bearbeiten, kann sie aber ausführen. Solche Berechtigungen sieht man öfters bei CGI Scripts.

drwxrwx---

Hier handelt es sich um ein Verzeichnis. Sowohl der Eigentümer als auch die Gruppe darf alles damit machen. Dem Rest ist der Zugriff darauf verwehrt.

andy@apfelschwein:~$ ls -la test
-rw-r--r-- 1 andy andy 995 2007-07-03 20:30 test

Weitere Informationen sind der Eigentümer und die Gruppe (beide jeweils andy), die Dateigrösse, das Datum der letzten Änderung und der Dateiname (hier test).

Löschen mit der Shell

Nun wirds gefährlich :)

In diesem Post zeige ich, wie man Dateien mit der Shell löscht. Beim Löschen ist man meistens massiv schneller als wenn zuerst das ganze via Finder in den Papierkorb geschoben werden muss und schlussendlich der Papierkorb geleert werden muss. Der angenehme Nebeneffekt beim Löschen auf die grafische Art, ist zweifellos das Sicherheitsnetz (Papierkorb) zwischen dem Seiltänzer (Du) und dem Boden (Datenverlust, etc).

Aber lassen wir das beiseite und kommen zum Punkt. Noch eine letzte Warnung: Mit diesem Befehl ist Datenverlust ohne weiteres möglich. Pass also auf, was du tust.

Der Befehl, den wir brauchen, heisst rm. rm steht für remove.

Einige Beispiele:

Die Dateien datei1 und datei2 löschen und vorher mit Sicherheitsabfrage bestätigen:

rm -i datei1 datei2

Das ganze ohne Sicherheitsabfrage:

rm datei1 datei2

Nun lösche ich ein leeres Verzeichnis mit rmdir:

rmdir leeresverzeichnis/

Wenn das Verzeichnis verzeichnismitinhalt aber nicht leer ist, kommt eine Fehlermeldung:

rmdir verzeichnismitinhalt/
rmdir: `verzeichnismitinhalt/’: Directory not empty

Nun könnte man mühsam alle Dateien in diesem Verzeichnis löschen und es nochmals probieren oder man löscht rekursiv:

rm -r verzeichnismitinhalt/

Somit wird der Ordner mitsamt allen Dateien und Unterverzeichnissen gelöscht. Rekursives Löschen ist gefährlich und der Benutzer sollte schon wissen was er macht.

Achtung: Ab hier gehts kaputt! Bitte nicht ausprobieren…
Hier sind noch einige Fehler (man kann sie auch bewusst machen :), um das System zu plätten:

rm -rf /

oder etwas subtiler:

touch “/datei mit abständen1″
touch “/datei mit abständen2″

cd /

rm -rf /datei mit *

oder noch etwas fieser:

touch /*
rm /*

oder vielleicht eben auch so:

rm -r /*

ja… so oder so: you’re fucked now :)

Powered by WordPress. Theme: Motion by 85ideas.