Launchd führt keinen bindfs-Befehl aus

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

Ich sollte damit beginnen, dass es funktioniert - wenn ich das Bash-Skript so ändere, dass es ausgeführt wird

mkdir /Users/Me/Desktop/itworks

dann erstellt es erfolgreich das Verzeichnis "itworks", sowohl beim Anmelden als auch beim Ausführen

sudo launchctl load /Library/launchAgents/loginsftpjailmount.plist

Und 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 mit sudo ausführe, funktioniert der bindfs-Befehl.

Um es zusammenzufassen - ich weiß, dass das Skript funktioniert. Ich weiß, dass die Plist funktioniert. Ich weiß, dass sie mit launchd zusammenarbeiten. Aber der bindfs-Befehl wird nicht ausgeführt! Ich habe das Systemprotokoll mit überprüft

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

und es sagt, dass es mit Fehler 127 beendet wird (com.user ist Teil des Labels für meine plist). Ich habe online gesucht und keine der Lösungen für Fehler 127 funktioniert für mich. Als Referenz sind zwei Listen, die ich verwendet habe:

<?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. Indem ich einfach mein Shell-Skript so ändere, dass es den vollständigen Pfad ausführt, wird es ausgeführt. Mein Shell-Skript ist jetzt wie "/opt/local/bin/bindfs Verzeichnis1 Verzeichnis2" anstatt einfach "bindfs Verzeichnis1 Verzeichnis2". Aber ich habe ein neues Problem - es läuft, wenn ich Sudo manuell lade, aber nicht bei der Anmeldung.

Antworten (1)

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!) die plist, verschiebe die plist nach /Library/LaunchDaemons/ und lade sie mit neu sudo launchctl load ....

Eine richtig benannte und zusammengesetzte org.user.bindfs.sftpjail.plist würde so 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 oft benötigt (in meinem Fall), um Timing-Probleme zu vermeiden. Sie können die Schlüssel StandardErrorPath/StandardOutPath und ihre Zeichenfolgen entfernen, nachdem Sie sichergestellt haben, dass alles ordnungsgemäß funktioniert.