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>
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.
Kyle