Crear puntos de montaje mediante programación en macOS 10.12

4

Apple me ha confirmado ( enlace ) que con macOS 10.12, permisos para crear una carpeta dentro de /Volumes requiere acceso de root.

El uso del comando mount requiere que el punto de montaje exista primero, por lo que tendrá que sudo para crear esa carpeta para el punto de montaje.

Desarrollo una aplicación que presenta una lista de recursos compartidos de red al usuario y les permite montarlos de forma selectiva. Manejé esto disparando un proceso de comando en segundo plano que usa mkdir y mount para montar la unidad de red. Por supuesto, esto ahora falla, ya que no tiene permiso para crear el punto de montaje.

Una opción que estoy considerando es modificar sudoers para que todos los usuarios tengan permiso para usar mkdir .

¿Alguien más puede pensar en una manera de montar mediante programación un disco de red a través de la Terminal sin indicaciones de contraseña, o jugando con sudo?

    
pregunta mattdwen 17.08.2016 - 00:48

4 respuestas

3

Como respondí en macOS Sierra: el volumen de montaje de AppleScript sigue solicitando inicio de sesión . Creo que la forma de hacerlo ahora es crear el punto de montaje en algún lugar donde el usuario tenga acceso de escritura, como el directorio principal del usuario. :

mkdir -p ~/mnt
mount_smbfs "//my_username:my_password@my_hostname/share" ~/mnt
    
respondido por el mnewt 23.09.2016 - 06:39
3

Aquí hay buenas noticias acerca de Sierra, los crecientes desafíos: El original de Unix automountd funciona de nuevo como se supone que funciona.

Haz como root esto: Agregue en su / etc / auto_master, por ejemplo, esta línea a un mapa de montaje estático. Lo llamé "Media", pero puedes hacer lo que quieras.

/etc/auto_master:
/Volumes/Media   auto_media

luego haga un archivo / etc / auto_media con las entradas de sus puntos de montaje, estos son dos ejemplos de imágenes y música. Mi Synology NAS es totalmente compatible con el sistema de archivos de Apple, pero puede hacerlo en cualquier servidor de archivos y elegir otro sistema de archivos. Ver man auto_master.

/etc/auto_master:
Bilder  afp://yournasuser:naspw@Media/Bilder
Musik   afp://yournasuser:naspw@Media/Musik

También haga la carpeta mountpoint manualmente mkdir / Volume / Media y vuelva a cargar todo con automount -vc Si ahora hace clic como USUARIO en Finder a la carpeta / Volumes / Media, Finder mostrará automáticamente las subcarpetas Bilder y Musik. Si hace clic en uno de ellos, automountd montará automáticamente los volúmenes COMO el USUARIO que lo solicitó y NO como root. Esta es la clave de la solución !!! Verifique el estado del montaje, mostrará lo siguiente:

Type mount
...
map auto_media on /Volumes/Media (autofs, automounted, nobrowse)
//yournasuser@Media/Bilder on /Volumes/Media/Bilder (..automounted,.. mounted by yourMacUser)

Tenga en cuenta el "montado por nombre de usuario" al final de la última línea de arriba.

Me di cuenta de que mkdir / Volumes / Media es persistente en una Mac, pero todas las carpetas en / Volumes se borran en otra Mac. En este caso, debe ejecutar después de reiniciar un script que crea la carpeta y vuelve a cargar el montador automático. Algo como esto:

#!/bin/sh
mkdir /Volumes/Media
automount -vc

Espero que esto funcione para todos.

    
respondido por el Stefan Ried 21.11.2016 - 09:36
2

Para aquellos que quieren una solución realmente sofisticada, recordé de mis conceptos básicos de Unix hace 20 años, cómo funcionan los mapas de montaje automático ejecutables. Aquí, el archivo de mapas no es un mapa estático, sino un script ejecutable, que genera básicamente los parámetros para los puntos de montaje. Lo bueno de esto, es que puede arreglar otras cosas en estos scripts, como despertar un NAS con sueño o agregar enlaces adicionales a los dispositivos montados. Aquí está cómo va

/etc/auto_master
/Volumes/Media  auto_exec

cree un script en / etc y hágalo ejecutable (chmod + x / etc / auto_exec) por el daemon de montaje automático. Aquí está el mío:

#!/bin/bash
# By www.stefan-ried.de 11/2016
# Open Source
#
# Name or IP of you NAS
server="yourNASServername"
# List of share you want to mount
shares="Bilder Musik Tina GemeinsameDateien"
# NAS use name
user="yourNasUser"
# NAS PW
userpw="yourNasPW"
# local logfile 
logfile="/tmp/automounter.log"
#
# automountd calls this without an argument to show the folders 
# or with a specific folder name as argument to retrieve the mount parameter for it
# 
# Make sure this file is in /etc and executable (chmod +a), call it auto_exec
# Add to /etc/auto_master for example this line
# /Volumes/Media    auto_exec
# 
# automount will then execute this file when the folder is accessed
# Reload the changes to your auto_master and auto_exec with automount -vc
# use tail -f /tmp/automounter.log to see whats going on, when you ls into /Volume/..
# have fun
#
if [ $# = 0 ]; then # List keys
    echo 'date' "Showing Folders/Keys" $1   >> $logfile
    for mountpoint in $shares; do
        echo -e "$mountpoint"   >> $logfile
        echo -e "$mountpoint"
        # create symbolic links for legacy mount points under /Volumes
        # you can comment this out, if you don't need it
        if [ ! -L /Volumes/$mountpoint ]; then
            echo -e "Create Sym Link Volumes/$mountpoint"       >> $logfile
            ln -s /Volumes/$server/$mountpoint /Volumes/$mountpoint
        fi
    done
# fire a WOL to the NAS
    /usr/local/bin/wolcmd 0011321906C8 10.0.0.2 255.255.255.0 4343 >> $logfile
#   
else
    echo 'date' "Requesting Mountpoint" $1  >> $logfile
    for mountpoint in $shares; do
        if [ $1 = $mountpoint ]; then
            echo -e "afp://$user:$userpw@Media/$mountpoint \"      >> $logfile
            echo -e "afp://$user:$userpw@Media/$mountpoint \"
        fi
    done
fi

Entonces, ¿qué hace el script además de la solución statis, que he publicado anteriormente?

  1. Al principio, tienes todos los parámetros como variables. Por favor llénelo.

  2. Agrega a través de enlaces simbólicos los puntos de montaje heredados. Esto es muy útil, como antes, por ejemplo, mi carpeta de música se montó en / Volumes / Musik, pero aparece en / Volumes / Media / Musik. El enlace hace que también está visible en / Volumes / Musik nuevamente.

  3. Dispara y despierta en mi LAN. Descargue el wolcmd aquí, por ejemplo: enlace Gracias al autor, por compartir esto libremente. Necesitas ponerlo en cualquier lugar consistente con el script. Lo puse en / usr / local / bin

  4. Registra todas las acciones en un archivo de registro. Puede monitorearlo libremente ejecutando, por ejemplo, "tail -f /tmp/automounter.log" en una ventana de terminal. Solo estos montajes se ejecutan donde se toca la carpeta correspondiente.

respondido por el Stefan Ried 21.11.2016 - 10:00
1

En caso de que su carpeta / Volumes / mountpoint desaparezca después de reiniciar, y no encuentre en la red con la suficiente rapidez cómo ejecutar algo en el momento de inicio o inicio de sesión. Aquí lo que hice:

Coloque en la carpeta del agente de inicio del usuario: / Users / YourMacUser / Library / LaunchAgents el siguiente archivo

<?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>de.stefan-ried.mounter</string>
  <key>Program</key>
  <string>/Users/YouMacUserFolder/Library/LaunchAgents/mount-startup.sh</string>
  <key>RunAtLoad</key>
  <true/>
 </dict>
</plist>

El script my mount-startup.sh es este:

#!/bin/sh
# By www.stefan-ried.de 11/2016
# Open Source
#
# Name or IP of you NAS
server="Media"
# List of share you want to mount
shares="Bilder Musik Tina GemeinsameDateien"
# NAS use name
user="YourNasUser"
# Mac PW
userpw="your Mac user pw"
# local logfile 
logfile="/tmp/automounter.log"
#
# automountd calls this without an argument to show the folders 
# or with a specific folder name as argument to retrieve the mount parameter for it
# 
# Make sure this file is in /etc and executable (chmod +a), call it auto_exec
# Add to /etc/auto_master for example this line
# /Volumes/Media    auto_exec
# 
# automount will then execute this file when the folder is accessed
# Reload the changes to your auto_master and auto_exec with automount -vc
# use tail -f /tmp/automounter.log to see whats going on, when you ls into /Volume/..
# have fun
#
echo 'date' "Startup" $1    >> $logfile
if [ ! -e /Volumes/$server ]; then
        echo -e "Create Volumes/$server"        >> $logfile
        echo $userpw |sudo -S mkdir /Volumes/$server 
        echo $userpw |sudo -S automount -cv >> $logfile
fi
# fire a WOL to the NAS
echo $userpw |sudo -S /usr/local/bin/wolcmd 0011321906C8 10.0.0.2 255.255.255.0 4343 >> $logfile
# 
for mountpoint in $shares; do
    # create symbolic links for legacy mount points under /Volumes
    # you can comment this out, if you don't need it
    if [ ! -L /Volumes/$mountpoint ]; then
        echo -e "Create Sym Link Volumes/$mountpoint"       >> $logfile
        echo $userpw  | sudo -S ln -s /Volumes/$server/$mountpoint /Volumes/$mountpoint
    fi
done

Eso es lo que hace el script en el momento de inicio de sesión del usuario.

  1. Comprueba si el punto de montaje en / Volúmenes está allí, lo crea y vuelve a cargar el montador automático. Esta fue la tarea principal del guión. El resto es lujo.

  2. Despierta el NAS. El NAS también se reactiva con el script auto_exec si se accede a una carpeta de montaje automático. Pero las unidades NAS tardan un poco en iniciarse, y tal vez el MacUser haga algo más después de iniciar sesión. Una vez que hacen clic en la carpeta de montaje automático, el NAS ya se está ejecutando. Doble wol no duele.

  3. También cree los enlaces de montaje heredados en "Volúmenes" nuevamente. El doble no duele.

Tenga en cuenta que esta secuencia de comandos de agente está diseñada para ejecutarse con privilegios de USUARIO. Por lo general, el comando sudo pide una contraseña. He suprimido esto por el "echo $ passpw | sudo -S ..." hack. Obviamente, almacenar una contraseña explícitamente en un archivo de script no es profesional en absoluto y está bien para mi uso doméstico. Para hacerlo profesionalmente, debe cargar este script de inicio en la raíz / Biblioteca y no en la Biblioteca del usuario. Puede simplemente eliminar toda la parte "echo $ passpw | sudo -S" antes del comando real.

    
respondido por el Stefan Ried 21.11.2016 - 10:26

Lea otras preguntas en las etiquetas