Launchd no ejecutará un comando bindfs

3

Quiero usar launchd para ejecutar comandos bindfs al iniciar sesión, como root. Tengo una lista en /Library/LaunchAgents/loginsftpjailmount.plist (con chmod 600) y un script de shell en /usr/local/bin/loginsftpjailmount.sh.

Debería comenzar diciendo que funciona, si cambio la secuencia de comandos bash para que se ejecute

mkdir /Users/Me/Desktop/itworks

luego crea con éxito el directorio "itworks", tanto al iniciar sesión como al ejecutar

sudo launchctl load /Library/launchAgents/loginsftpjailmount.plist

Y la carpeta creada es propiedad de root y tengo que escribir mi contraseña para eliminarla. Cuando ejecuto manualmente el script bash desde el terminal usando sudo, el comando bindfs funciona.

Para resumir, sé que el guión funciona. Sé que la plist funciona. Sé que trabajan juntos con launchd. ¡Pero el comando bindfs no se ejecuta! Revisé el registro del sistema con

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

y dice que sale con el error 127 (com.user es parte de la etiqueta de mi lista). Busqué en línea y ninguna de las soluciones de error 127 funcionó para mí. Para referencia, dos plistas que he usado son:

<?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/>

y también

<?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>
    
pregunta Kyle 23.03.2017 - 00:20

1 respuesta

2

El proceso bindfs debe iniciarse con privilegios de root. Lanzarlo como agente evitaría esto.

Entonces sudo launchctl unload ... y sudo launchctl remove ... (el subcomando remove elimina el agente de la base de datos de launchd; el archivo no se eliminará!) la lista, mueva el plist a / Library / LaunchDaemons / y recárgalo con sudo launchctl load ... .

Una org.user.bindfs.sftpjail.plist debidamente nombrada y compuesta se vería así:

<?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>

La clave WatchPath a menudo se requiere (fue en mi caso) para evitar problemas de tiempo. Puede eliminar las claves StandardErrorPath / StandardOutPath y sus cadenas después de asegurarse de que todo funciona correctamente.

    
respondido por el klanomath 23.03.2017 - 02:25

Lea otras preguntas en las etiquetas