Launchd führt keinen bindfs-Befehl aus


3

Ich möchte launchd verwenden, um bindfs-Befehle bei der Anmeldung als root auszuführen. Ich habe eine Liste in /Library/LaunchAgents/loginsftpjailmount.plist (mit chmod 600) und ein Shell-Skript in /usr/local/bin/loginsftpjailmount.sh.

Ich sollte zunächst sagen, dass es funktioniert - wenn ich das Bash-Skript so ändere, dass es ausgeführt wird

mkdir /Users/Me/Desktop/itworks

Anschließend wird das Verzeichnis "itworks" sowohl beim Anmelden als auch beim Ausführen erfolgreich erstellt

sudo launchctl load /Library/launchAgents/loginsftpjailmount.plist

Der erstellte Ordner gehört root und ich muss mein Passwort eingeben, um ihn zu löschen. Wenn ich das Bash-Skript manuell über das Terminal mithilfe von sudo ausführe, funktioniert der Befehl bindfs.

Um es zusammenzufassen: Ich weiß, dass das Skript funktioniert. Ich weiß, dass die Pliste funktioniert. Ich weiß, dass sie mit launchd zusammenarbeiten. Der Befehl bindfs wird jedoch nicht ausgeführt! Ich habe das Systemprotokoll mit überprüft

sudo grep com.user /var/log/system.log

und es heißt, es wird mit dem Fehler 127 beendet (com.user ist Teil des Etiketts für meine plist). Ich habe online gesucht und keine der Lösungen für Fehler 127 funktioniert für mich. Als Referenz habe ich zwei Plisten verwendet:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.loginitem</string>
<key>ProgramArguments</key>
<array>
    <string>bash</string>
    <string>-c</string>
    <string>bash -c "bindfs /Volumes/BRIGHTRED/ServedDocuments /sftpjail/Documents"</string>
</array>
<key>RunAtLoad</key>
<true/>

und auch

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.user.loginitem</string>
        <key>Program</key>
        <string>/usr/local/bin/loginsftpjailmount.sh</string>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

Ich habe meine eigene Antwort gefunden. Das Problem ist, dass bindfs unter / opt / local / bin installiert ist und launchd es nicht finden kann. Wenn Sie also einfach mein Shell-Skript ändern, um den vollständigen Pfad auszuführen, wird es ausgeführt. Mein Shell-Skript lautet jetzt "/ opt / local / bin / bindfs directory1 directory2" anstelle von "bindfs directory1 directory2". Ich habe jedoch ein neues Problem: Es wird ausgeführt, wenn ich sudo manuell lade, aber nicht beim Anmelden.
Kyle

Antworten:


2

Der bindfs-Prozess muss mit root-Rechten gestartet werden. Das Starten als Agent würde dies verhindern.

Also sudo launchctl unload ...und sudo launchctl remove ...(der Unterbefehl remove entfernt den Agenten aus der launchd-Datenbank - die Datei wird nicht gelöscht!) Verschieben Sie die plist nach / Library / LaunchDaemons / und laden Sie sie erneut mit sudo launchctl load ....

Eine ordnungsgemäß benannte und zusammengesetzte org.user.bindfs.sftpjail.plist würde folgendermaßen aussehen:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>org.user.bindfs.sftpjail</string>
        <key>ProgramArguments</key>
        <array>
                <string>/opt/local/bin/bindfs</string>
                <string>/Volumes/BRIGHTRED/ServedDocuments</string>
                <string>/sftpjail/Documents</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/org.user.bindfs.sftpjail.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/org.user.bindfs.sftpjail.out</string>
        <key>WatchPaths</key>
        <array>
                <string>/Volumes/BRIGHTRED</string>
        </array>
</dict>
</plist>

Der WatchPath-Schlüssel wird häufig benötigt (in meinem Fall), um Zeitprobleme zu vermeiden. Sie können die Schlüssel StandardErrorPath / StandardOutPath und die zugehörigen Zeichenfolgen entfernen, nachdem Sie sichergestellt haben, dass alles ordnungsgemäß funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.