{"id":8842,"date":"2013-11-29T20:29:38","date_gmt":"2013-11-29T19:29:38","guid":{"rendered":"http:\/\/tuxproject.de\/blog\/?p=8842"},"modified":"2019-05-23T11:35:07","modified_gmt":"2019-05-23T09:35:07","slug":"mkdir-wundern-sprengen","status":"publish","type":"post","link":"https:\/\/tuxproject.de\/blog\/2013\/11\/mkdir-wundern-sprengen\/","title":{"rendered":"mkdir * ; wundern ; sprengen"},"content":{"rendered":"<p>Ich bin seit ein\u00ader Weile in ein\u00ader dieser <em>start-up<\/em>-Fir\u00admen t\u00e4tig, die <em>irgend\u00adwas mit mobilen Anwen\u00addun\u00adgen<\/em> machen. Urspr\u00fcnglich sollte ich dort die Back\u00adenden\u00adtwick\u00adlung \u00fcbernehmen; bl\u00f6der\u00adweise hat\u00adte ich in mein\u00ader Bewer\u00adbung angegeben, dass ich auch schon mal einen Serv\u00ader gewartet habe, was dazu f\u00fchrte, dass man mir au\u00dfer\u00addem die Instal\u00adla\u00adtion und Wartung eines Servers (in Form eines aus\u00adrang\u00adierten Mini-Tow\u00aders) auftrug. Kein Prob\u00adlem, dachte ich, macht ja dur\u00adchaus Spa\u00df. (Dass die Fir\u00adma aus\u00adnahm\u00ads\u00adlos auf eine Mac-OS-X-Umge\u00adbung set\u00adzt, h\u00e4tte mich schon stutzig machen sollen.)<\/p>\n<p>Nach eini\u00adgen Stun\u00adden war der aus\u00adrang\u00adierte Mini-Tow\u00ader zu einem voll funk\u00adtion\u00adst\u00fcchti\u00adgen FreeB\u00adSD-PHP-Entwick\u00adlungsserv\u00ader heran\u00adgereift, der genau das tat, was er sollte, regelm\u00e4\u00dfige Daten\u00adbank- und Web\u00adserv\u00ader-Back\u00adups per <tt>rsync<\/tt> (also auf ein beliebiges Net\u00adzlaufw\u00aderk) inklu\u00adsive. Dieser Serv\u00ader ver\u00adrichtete anstand\u00ads\u00adlos seinen Dienst und \u00fcber\u00adstand auch gr\u00f6\u00dfere <em>updates<\/em> ohne Prob\u00adleme, wie man es eben von FreeB\u00adSD so ken\u00adnt.<\/p>\n<p>Trotz all\u00addem gab es seit\u00adens der Entschei\u00adder (zwar keine \u201cSchlip\u00adsis\u201d, aber doch sehr \u00f6konomisch denk\u00adend) vier Punk\u00adte an der Instal\u00adla\u00adtion zu kri\u00adtisieren: FreeB\u00adSD lasse sich nicht ohne Han\u00addar\u00adbeit in die sowieso herum\u00adste\u00adhende \u201cTime Machine\u201d (so ein appleeigenes Back\u00adup\u00adsys\u00adtem) ein\u00adbinden, was immens wichtig sei, falls mal die Fest\u00adplat\u00adte \u201cabrauche\u201d (ein <tt>rsync<\/tt>-Back\u00adup erfordere ja manuelles Zur\u00fcck\u00adspie\u00adlen der Dateien, das sei <em>viel zu umst\u00e4ndlich<\/em>); es sei eher bl\u00f6d, wenn ich als Einziger im Haus wisse, wie man den Serv\u00ader wieder zum Laufen bekomme, wenn er mal streiken sollte (ich war bis dahin ern\u00adsthaft der Mei\u00adn\u00adung, genau daf\u00fcr seien Admin\u00adis\u00adtra\u00adtoren ja da); man k\u00f6nne auf FreeB\u00adSD (ich hat\u00adte kein GUI instal\u00adliert) nicht so ein\u00adfach neue virtuelle Hosts anle\u00adgen wie unter Mac OS X, wo ein einziger Klick gen\u00fcge; im \u00dcbri\u00adgen passe der Mini\u00adtow\u00ader nicht in den \u201cServer\u00adschrank\u201d (die Anf\u00fchrungsze\u00adichen sind ernst gemeint; in diesem \u201cServer\u00adschrank\u201d ste\u00adhen vor allem Mac min\u00adis herum), son\u00addern m\u00fcsse danebengestellt wer\u00adden, was nat\u00fcr\u00adlich unzu\u00admut\u00adbar sei.<\/p>\n<p>Die \u201cL\u00f6sung\u201d f\u00fcr diese Her\u00adaus\u00adforderun\u00adgen: Ein weit\u00ader\u00ader Mac mini wurde angeschafft und dem Zust\u00e4ndi\u00adgen (mir) kurz erk\u00adl\u00e4rt, wie das Teil denn funk\u00adtion\u00adiert, wie man also per Klick neue Web\u00adseit\u00aden hinzuf\u00fcgt (was offen\u00adbar nichts anderes ist als ein GUI zur Ver\u00adwal\u00adtung von virtuellen Hosts im mit\u00adgeliefer\u00adten Apache), sog\u00adar mit \u201ch\u00fcb\u00adsch\u00ader\u201d blauer <em>check\u00adbox<\/em> zum An- und Abschal\u00adten von PHP (nat\u00fcr\u00adlich in ein\u00ader Uraltver\u00adsion; wer will schon aktuelle Soft\u00adware auf \u2019nem Serv\u00ader nutzen? Mac-OS-Nutzer jeden\u00adfalls nicht). \u201cDann mal viel Spa\u00df!\u201d<\/p>\n<p>Was ich per Ver\u00adsuch und Irrtum schnell her\u00adaus\u00adfand: Das GUI f\u00fcr die Server\u00adwartung in Mac OS X scheint tat\u00ads\u00e4ch\u00adlich einen gewis\u00adsen Zweck zu erf\u00fcllen. Eine <tt>httpd.conf<\/tt> existiert zwar dort, wo man sie erwarten w\u00fcrde (es gibt tat\u00ads\u00e4ch\u00adlich ein Kon\u00adfig\u00adu\u00adra\u00adtionsverze\u00adich\u00adnis namens <tt>apache2<\/tt>), aber sie scheint f\u00fcr irgend\u00adwas anderes benutzt zu wer\u00adden. Das (mit\u00adtels <a href=\"http:\/\/brew.sh\/index_de.html\">home\u00adbrew<\/a>; ein passender Name, denn die Benutzung macht Lust auf ein Bier) h\u00e4ndisch nachin\u00adstal\u00adlierte PHP 5.5 lie\u00df sich \u00fcber sie jeden\u00adfalls nicht aktivieren. \u201cMein\u201d Pro\u00adjekt set\u00adzt im \u00dcbri\u00adgen auf Mari\u00adaDB (also MySQL-Syn\u00adtax) auf, Mac OS X bringt <em>nat\u00fcr\u00adlich<\/em> nur Post\u00adgreSQL mit (<em>selb\u00adstver\u00adst\u00e4ndlich<\/em> ohne GUI, das w\u00e4re ver\u00admut\u00adlich zu ein\u00adfach); auch hier war also Han\u00addar\u00adbeit n\u00f6tig. Ob das eben\u00adfalls per <tt>brew<\/tt> ein\u00adgerichtete Mari\u00adaDB kor\u00adrekt mit dem Web\u00adserv\u00ader zusam\u00adme\u00adnar\u00adbeit\u00adet, ist mehr oder weniger ein Rate\u00adspiel, da ich noch nicht her\u00adaus\u00adge\u00adfun\u00adden habe, wie ich an \u201cmeine\u201d PHP-Instal\u00adla\u00adtion komme. Das \u201cPHP\u201d-H\u00e4kchen schal\u00adtet ja nur die wo auch immer ver\u00adsteck\u00adte <tt>httpd.conf<\/tt> um, nicht die, die dort liegt, wo sie liegen sollte. Toll, so\u2019n Mac. (Es sieht aber gut aus: Die Instal\u00adla\u00adtion von <a href=\"http:\/\/adminer.org\">Admin\u00ader<\/a> im Ord\u00adner der Web\u00adsite \u201cDefault\u201d lie\u00df mich zumin\u00add\u00adest auf die Daten\u00adbank zugreifen, <tt>mysqlad\u00admin<\/tt> ver\u00adrichtet auf der Kon\u00adsole auch anstand\u00ads\u00adlos seinen Dienst. Gl\u00fcck gehabt!)<\/p>\n<p>Die Soft\u00adware war zumin\u00add\u00adest the\u00ado\u00adretisch erst mal instal\u00adliert. Jet\u00adzt galt es das beste\u00adhende PHP-Pro\u00adjekt vom \u201calten\u201d auf den \u201cneuen\u201d Serv\u00ader zu migri\u00aderen. Die Benutzung von <tt>scp<\/tt> bot sich an. <em>Nat\u00fcr\u00adlich<\/em> liegen Mac-OS-X-Web\u00adsites nicht in <tt>\/var\/www<\/tt> oder irgend\u00adwo inner\u00adhalb von <tt>\/usr<\/tt> oder <tt>\/etc<\/tt>, son\u00addern in einem merk\u00adw\u00fcrdi\u00adgen Son\u00adderord\u00adner namens <tt>\/Library<\/tt> (und auch nicht unter <tt>\/Library\/WebServer<\/tt>, was eben\u00adfalls existiert, son\u00addern unter <tt>\/Library\/Server<\/tt>), man will es Nicht-Mac-Nutzern ja nicht zu leicht machen, von BSD auf Mac OS X zu wech\u00adseln. Da k\u00f6n\u00adnte ja jed\u00ader kom\u00admen! Insofern ist es nur kon\u00adse\u00adquent, dass Mac OS X nicht die <tt>tcsh<\/tt>, son\u00addern die <tt>bash<\/tt> als Stan\u00addard\u00adshell ver\u00adwen\u00addet. Die <tt>bash<\/tt> ver\u00adh\u00e4lt sich aber gele\u00adgentlich so, wie man es am Wenig\u00adsten erwarten w\u00fcrde (was ein\u00ader der Gr\u00fcnde sein k\u00f6n\u00adnte, warum sie unter Lin\u00adux so beliebt ist).<\/p>\n<p>Ein Beispiel: Was, denkt ihr, tut fol\u00adgen\u00adder Befehl in ein\u00ader Mac-OS-X-Shell?<\/p>\n<pre lang=\"bash\">scp -r root@bsdserver:\/var\/www\/projekt\/* .\/*<\/pre>\n<p>Der <em>gesunde Men\u00adschen\u00adver\u00adstand<\/em> sieht, dass <tt>.\/*<\/tt> <em>eigentlich<\/em> redun\u00addant ist und <tt>.<\/tt> gen\u00fc\u00adgen sollte, hat aber anson\u00adsten keine weit\u00aderen Ein\u00adw\u00e4nde. Die <tt>bash<\/tt> sieht das mit dem <a href=\"http:\/\/www.proftpd.de\/HowTo-Globbing.41.0.html\">Glob\u00adbing<\/a> aber anders als der gesunde Men\u00adschen\u00adver\u00adstand. Obiger Befehl kopiert also rekur\u00adsiv (<tt>-r<\/tt>) den Inhalt von <tt>\/var\/www\/projekt<\/tt> auf dem BSD-Serv\u00ader in das aktuelle Verze\u00adich\u00adnis \u2014 und zwar in einen Unterord\u00adner namens <tt>*<\/tt>, den er hier\u00adf\u00fcr extra anlegt.<\/p>\n<p>Oh, jet\u00adzt habe ich vor Schreck die Beto\u00adnung vergessen: In einen <b>Unterord\u00adner namens <tt>*<\/tt><\/b>! (F\u00fcr die weniger Tech\u00adnikver\u00adsierten: Das ist, als w\u00fcrde man sein Kind \u201cLeerze\u00adichen\u201d nen\u00adnen. Oder \u201cJed\u00ader\u201d.)<\/p>\n<p>Wie beseit\u00adigt man dieses Mal\u00adheur? Erst mal alles einen Ord\u00adner h\u00f6her kopieren, dann den Ord\u00adner namens <tt>*<\/tt> ent\u00adfer\u00adnen:<\/p>\n<pre lang=\"bash\">cd \"*\"; cp -R * ..; cd ..; rm -rf \"*\"<\/pre>\n<p>Fiese Falle: <tt>rm \u2011rf *<\/tt> w\u00fcrde auch funk\u00adtion\u00adieren, aber anders als gew\u00fcn\u00adscht.<\/p>\n<p>Mac OS X \u00fcber\u00adrascht mich immer wieder. <a href=\"http:\/\/geeknizer.com\/apples-adjectives-are-amazing-awesome-incredible-beautiful-unbelievable-easy-really-nice\/\">Incred\u00adi\u00adble!<\/a><\/p>\n<p>Zum Gl\u00fcck ist Woch\u00adenende.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich bin seit ein\u00ader Weile in ein\u00ader dieser start-up-Fir\u00ad\u00admen t\u00e4tig, die irgend\u00adwas mit mobilen Anwen\u00addun\u00adgen machen. Urspr\u00fcnglich sollte ich dort die Back\u00adenden\u00adtwick\u00adlung \u00fcbernehmen; bl\u00f6der\u00adweise hat\u00adte ich in mein\u00ader Bewer\u00adbung angegeben, dass ich auch schon mal einen Serv\u00ader gewartet habe, was dazu f\u00fchrte, dass man mir au\u00dfer\u00addem die Instal\u00adla\u00adtion und Wartung eines Servers (in Form eines \u2026<\/p>\n<p><a href=\"https:\/\/tuxproject.de\/blog\/2013\/11\/mkdir-wundern-sprengen\/\" class=\"more-link\">\u2018mkdir * ; wun\u00addern ; spren\u00adgen\u2019 weit\u00ader\u00adlesen \u00bb<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wp_typography_post_enhancements_disabled":false,"footnotes":""},"categories":[1,19],"tags":[],"series":[],"class_list":["post-8842","post","type-post","status-publish","format-standard","hentry","category-persoenliches","category-nerdkrams"],"share_on_mastodon":{"url":"","error":""},"wp-worthy-pixel":{"ignored":false,"public":null,"server":null,"url":null},"wp-worthy-type":"normal","_links":{"self":[{"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/posts\/8842","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/comments?post=8842"}],"version-history":[{"count":0,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/posts\/8842\/revisions"}],"wp:attachment":[{"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/media?parent=8842"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/categories?post=8842"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/tags?post=8842"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/series?post=8842"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}