¿Expulsar todas las unidades de red a través de Applescript/Automator/Shell?

Uso el siguiente script para intentar expulsar todos los discos que no son internos:

tell application "Finder"
    eject (disks whose ejectable is true)
end tell

Esto tiene la ventaja de saltarse volúmenes como MobileBackupsasí como varios otros.

Desafortunadamente, no expulsa los recursos compartidos de red.

¿Hay alguna forma de obtener recursos compartidos de red conectados en applescript?

Como +1, idealmente esto también omitiría cosas como los discos ópticos.

EDITAR : Ambas respuestas hasta ahora han compartido formas de expulsar discos de red específicos . Esto, por supuesto, es fácil y sé cómo hacerlo. Lo que pido específicamente es una forma de intentar expulsar todos los discos que no sean los discos internos del sistema, independientemente de su nombre.

Curiosamente, he estado usando algo casi idéntico a esto para expulsar mis unidades externas, y ha funcionado a la perfección hasta después de la última vez que reinicié. Ahora aparece una ventana emergente que dice, The Disk "32-digit UUID" wasn't ejected because one or more programs may be using it.pero no puedo averiguar a qué corresponde ese UUID. No está en la lista, diskutil info -allpor ejemplo. Además, nada aparece en lsof. Esto está en OSX High Sierra. ¿Alguna sugerencia?
Resulta que el UUID era de Clusters (la herramienta de compresión en segundo plano). En realidad, no aparece como un disco en ninguna parte que pueda ver, pero finalmente lo encontré en lsof.

Respuestas (6)

Yo uso Automator. Inserté 'Obtener elementos de búsqueda especificados' y nombré los discos de destino que quería 'Obtener'. Solo se eligen los que se nombran, pero las unidades de red funcionan. Luego canalizo esto a 'Expulsar disco'.

Eso es todo.

ingrese la descripción de la imagen aquí

Se hace fácilmente usando la -topción del umountcomando. Desde la página de manual que puedes leer usando man umount:

-t type
             Is used to indicate the actions should only be taken on filesys-
             tems of the specified type.  More than one type may be specified
             in a comma separated list.  The list of filesystem types can be
             prefixed with ``no'' to specify the filesystem types for which
             action should not be taken.  For example, the umount command:

                   umount -a -t nfs,hfs

Entonces,

do shell script "/sbin/umount -a -t nfs,smbfs"

debe desmontar todos los recursos compartidos de NFS y Windows/Samba montados.

EDITAR: También puede usar la -fopción para forzar la acción. Lea la página man para más detalles.

EDIT2: disculpas, umount no se está comportando como se anuncia, al menos en mi Snow Leopard. Así que lo haría así recordando cambiar msdosal tipo de sistema de archivos deseado:

set mounts to {}
set mounts to paragraphs of (do shell script "mount | grep msdos | cut -d ' ' -f3")

# Umount non busy filesystems
repeat with mount in mounts
    set pid to (do shell script "fuser -c " & mount)
    if pid is equal to "" then
        # We use diskutil since classic unix umount cmd needs sudo/password 
        do shell script "diskutil umount " & mount
    end if
end repeat

HTH

¿Cómo puedo averiguar con qué tipo de sistema de archivos se montó un disco?
El mountcomando mostrará todos los sistemas de archivos montados. En la salida, la primera palabra después del corchete es el tipo de sistema de archivos.

O simplemente puede llamar al comando de shell ...

do shell script "/usr/sbin/diskutil unmount /Volumes/some_network_share"

Tenga en cuenta que esto podría fallar si tiene archivos abiertos para que pueda agregarlos forcecomo tales

do shell script "/usr/sbin/diskutil unmount force /Volumes/some_network_share"

La utilidad de línea de comandos /sbin/umountpuede ser otra solución para lo que está buscando. Mac OS mantiene un alias para cada uno de sus discos montados en una carpeta /Volumes. Puede usar esto a su favor y acumular una unidad que se enumera allí:

$ umount /Volumes/Video

Por lo tanto, es posible que desee crear un script de shell que enumere los contenidos de /Volumes e intente expulsarlos a todos, como este:

for var in `ls /Volumes` ; do
echo Ejecting /Volumes/$var
umount /Volumes/$var
done

Sin embargo, no podrá expulsar las unidades que no se pueden expulsar, como el disco de inicio actual.

Esto solo expulsará todos los volúmenes de red:

$ find /Volumes -maxdepth 1 -not -user root -print0 | xargs -0 umount

Si desea un AppleScript, adapté el script publicado en: Acceso directo para expulsar todos los discos duros externos pero no MobileBackups

a esto, y funciona muy bien. Coloqué el applet para esto en mi base para usarlo justo antes de desconectarme.

set exceptionsList to {"MobileBackups", "startup disk", "home", "net"}
tell application "Finder"
    set diskList to the disks
    repeat with mountedDisk in diskList
        if name of mountedDisk is not in exceptionsList then
            eject mountedDisk
        end if
    end repeat
end tell