Wie erstelle ich symbolische Links in / usr / bin auf einem Mac?

7796
user1934428

Umgebung: OSX Sierra, Darwin Kernel Version 16.3.0

Wurzelproblem: Ich möchte eine Reihe von Shell-Skripten in einem zentralen Repository verwenden, die ein #! / Usr / bin / zsh haben. Auf meinem Mac befindet sich die zsh in / bin / zsh.

Versuchte Lösung: Ich möchte einen symbolischen Link erstellen

ln -s /bin/zsh /usr/bin/zsh 

Mein Benutzerkonto hat Administratorrechte, aber ich bin nicht root und möchte den root-Benutzer auf diesem Mac nicht aktivieren. Deshalb habe ich zuerst eine

sudo su 

um eine Shell mit root-Rechten zu erhalten und dann den Befehl ln auszuführen. Ich bekomme jedoch immer noch die Fehlermeldung ln: / usr / bin / zsh: Operation nicht erlaubt .

Fragen:

  • Warum erhalte ich diese Fehlermeldung?

  • Was muss ich tun, um den Link zu erstellen?

  • Gibt es einen besseren Weg, mein ursprüngliches Ziel zu erreichen? Beachten Sie das Fixieren der #! Linien ist keine Option.

8
Warum kopieren Sie nicht einfach `/ usr / bin / zsh` nach` / bin / zsh`? Lenniey vor 7 Jahren 0
@Lenniey Auf diese Weise erstellen Sie eine lose Kopie, die nicht zusammen mit dem Original aktualisiert wird. Mario vor 7 Jahren 1
@ Mario Welpe ... natürlich hast du recht. OP: mach das nie! ;) Lenniey vor 7 Jahren 0
@Lenniey - Die Kopie muss in die andere Richtung gehen! Und wenn Sie kopieren können, können Sie verknüpfen. AFH vor 7 Jahren 1
@AFH ja mein Kommentar ist ein komplettes Durcheinander ... Lenniey vor 7 Jahren 0
Wenn das Dateisystem unter Linux unterstützt wird, starten Sie eine LiveCD (ich verwende Ubuntu), und Sie sollten in der Lage sein, den Link nach dem Einhängen des Dateisystems zu erstellen. Ubuntu Live bootet in root, also rufen Sie einfach ein Terminal auf und verwenden Sie Ihren Befehl dort. Ich bin etwas überrascht, dass `/ usr` zu den geschützten Verzeichnissen gehört (siehe Antwort von Dimitar): Auf Ubuntu installieren sich hier die meisten Anwendungen. AFH vor 7 Jahren 0
Wenn dies nicht funktioniert, besteht die einzige Möglichkeit darin, für jedes Skript ein Frontend zu erstellen. Verwenden Sie dazu "mkdir $ HOME / scripts"; "cd PathToScripts"; `für f in *; do echo -e "# / bin / zsh \ n. PathToScripts / $ f> $ HOME / scripts / $ f" und fügen Sie `export PATH = $ HOME / scripts: $ PATH` in` .bashrc` ein. Dies wird vereinfacht durch Angenommen, keines der Skripts "$ HOME" oder "$ PATH" enthält Leerzeichen oder andere Sonderzeichen "zsh". Die Lösung verwendet zwei Dinge: (1) Durch Platzieren des lokalen Skriptverzeichnisses an der Spitze von "$ PATH" Die lokalen Frontends werden immer zuerst gefunden, und (2) ignoriert der Befehl `.`` #! `als Kommentar. AFH vor 7 Jahren 0
@AFH: Das kann nicht die einzige Lösung sein! Ich meine: OSX ist im Grunde BSD Unix - ich glaube nicht, dass Apple von den Benutzern erwartet, ein separates Linux-System zu kaufen, nur um Admin-Aufgaben auf ihrem Rechner zu erledigen! Bevor ich auf diesen Weg gehe, möchte ich lieber den Benutzer * root * für mein System aktivieren. Das würde sicher funktionieren, aber ich suche einen alternativen Weg. user1934428 vor 7 Jahren 0
@AFH: Ich sehe gerade aus der Antwort von Dimitar, dass selbst das Aktivieren des Root-Benutzers in meinem Fall nicht helfen würde ... user1934428 vor 7 Jahren 0
Die meisten Linux-Distributionen sind kostenlos, so dass Sie sie nicht kaufen müssen. Ich habe diese Workrunde nur wegen des Kommentars von Dimitar vorgeschlagen "Bitte mach es nicht". Das eigentliche Problem liegt jedoch beim Script-Provider: Jede Shell sollte einen Eintrag in `/ bin /` haben, und die eigentliche Lösung besteht darin, den Script-Writer dazu zu bringen, den korrekten, kompatiblen Script-Header `#! / Bin / zsh` zu verwenden. Nur für das Protokoll, Ubuntu hat Einträge in beiden Verzeichnissen, symbolische Links zu separaten Einträgen in `/ etc /`, die auf `/ bin / zsh5` verweisen, eine binäre ausführbare Datei! Machen Sie davon was Sie wollen. AFH vor 7 Jahren 0
Natürlich muss ich das Linux-System nicht kaufen, aber dafür würde ich einen separaten PC benötigen. Ich hätte gerne symbolische Links, und so würde ich das unter Linux lösen, aber leider kann ich das nicht auf dem Mac. user1934428 vor 7 Jahren 0

1 Antwort auf die Frage

11
13dimitar

Sie erhalten diese Meldung aufgrund des Systemintegritätsschutzes von Apple . Der Systemintegritätsschutz umfasst den Schutz dieser Systemteile:

/System /usr /bin /sbin Apps that are pre-installed with OS X 

Zu den Pfaden und Apps, die Drittanbieter-Apps und -Installationsprogramme weiterhin schreiben können, gehören:

/Applications /Library /usr/local 

Das bedeutet, dass Sie einfach einen symbolischen Link erstellen können /usr/local/bin(er befindet sich noch in Ihrem $ PATH).

ABER, es scheint, dass Sie den symbolischen Link in erstellen müssen /usr/bin. Sie können dies erreichen, indem Sie den Systemintegritätsschutz deaktivieren (tun Sie dies nicht, bearbeiten Sie einfach die Skripts.). Sie können es deaktivieren durch (Ich habe es nicht selbst getestet !!!):

Click the  menu. Select Restart... Hold down command-R to boot into the Recovery System. Click the Utilities menu and select Terminal. Type csrutil disable and press return. Close the Terminal app. Click the  menu and select Restart.... 
Sie haben den Punkt verpasst: Der Fragesteller hat Skripte, die als Shell '#! / Usr / bin / zh' angeben. Die Lösung, die er sucht, besteht darin, diesen Ort mit dem Ort zu verknüpfen, an dem sich die Shell tatsächlich befindet davor geschützt. Wenn der Schutz nicht umgangen wird, scheint die einzige Lösung eine Stapelbearbeitung der Skripts zu sein. AFH vor 7 Jahren 2
Nun ja, Sie haben Recht, er muss die Skripte bearbeiten (was mit einem einzigen Befehl geschehen kann). 13dimitar vor 7 Jahren 0
@Dimitar Blick auf die Frage: Gibt es einen besseren Weg, mein ursprüngliches Ziel zu erreichen? Beachten Sie das Fixieren der #! Zeilen ist keine Option._ Lenniey vor 7 Jahren 0
Notiz genommen, ich habe meine Antwort geändert 13dimitar vor 7 Jahren 1