¿Cómo montar automáticamente desde la línea de comandos?

25

¿Cómo puedo activar un montaje automático desde la línea de comandos? Por "montaje automático" no me refiero al montaje totalmente automático, sino a obtener una lista de dispositivos disponibles y luego seleccionar uno y hacer que termine como /media/{user}/{diskid}. Nautilus o Thunar proporcionan esta funcionalidad, por ejemplo, pero parece que no puedo encontrar una herramienta de línea de comandos para activar este tipo de montaje semiautomático.

pmountes lo más cercano que he encontrado, pero parece funcionar con una mecánica completamente diferente debajo y hace que los dispositivos aparezcan como /media/sdfalgo similar.

Grumbel
fuente

Respuestas:

29

Puedes usar:

udisksctl mount -b nombre_dispositivo

¿Dóndedevice_name está el nombre de un dispositivo de almacenamiento y debería ser algo así /dev/sdb1?

Usando lsblko sudo fdisk -lcomando puede encontrar todos los dispositivos de almacenamiento conectados a su sistema.

Radu Rădeanu
fuente
2
Intenté eso, eso sin embargo conduce a /media/{disk}, diferente de lo que Thunar o Nautilus darían. El udisksctlcomando proporcionado por udisks2sin embargo parece hacer lo que quiera.
Grumbel
1
udisksctl statusle dará una lista adecuada de dispositivos y funcionará como usuario. fdisk -lno solo requiere root, también fallará con las unidades GPT. cat /proc/partitionssería una mejor manera de bajo nivel para tener una idea de las particiones disponibles.
Grumbel
udiskctl¡también es extremadamente útil para montar archivos de disco de imagen en dispositivos de bucle sin privilegios de root!
Parece que udiskestuvo disponible hasta el 14.04.
Pablo A
13

gio mount

gvfs ahora aparece como obsoleto (2018) y se recomienda usar 'gio', que es Gnome In Out y parte de Glib. Ver Wikipedia .

Por ejemplo, para montar automáticamente una segunda partición de unidad; cree un script bash con permiso ejecutable para ejecutar al inicio con el siguiente comando:

gio mount -d /dev/sda2

Si es propietario de la partición (consulte chown ) no necesitarás sudo.

Para montar un archivo ISO ubicado, por ejemplo, en ~/ISOs:

gio mount "archive://file%3A%2F%2F%2Fhome%2Fpablo%2FISOs%2Fubuntu-18.04-desktop-amd64.iso"

Podría codificar la ruta URL con Python 3 y realpath(para concatenar a archive://:

python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\"))" "file://$(realpath ubuntu-18.04-desktop-amd64.iso)"

Esto se montará /run/user/$(id -u)/gvfs/.

Como alternativa gnome-disk-image-mounterse montará /media/$USER/.

Para desmontar el uso gio mount -u /run/user/$(id -u)/gvfs/archive*(o /media/$USER/, dependiendo de la forma en que montó).

udisksctl

Listado de dispositivos disponibles:

udisksctl status

El montaje se realiza a través de:

udisksctl mount -b /dev/sdf

o

udisksctl mount -p block_devices/sdf

El desmontaje se realiza a través de:

udisksctl unmount -b /dev/sdf

o

udisksctl unmount -p block_devices/sdf

El object-pathse puede encontrar haciendo:

udisksctl dump

El objeto de tipo org.freedesktop.UDisks2.Blockparece ser válido ya que object-patchel /org/freedesktop/UDisks2/prefijo debe cortarse de la ruta para que udisksctl los acepte.

gvfs-mount

La lista de dispositivos disponibles se puede hacer con:

gvfs-mount --list

Su montaje se puede hacer con:

gvfs-mount -d /dev/sdf

El desmontaje es posible mediante:

gvfs-mount --unmount /media/user/01234567890

Un problema pendiente es que no tengo idea de cómo usar la gvfs-mount --listsalida en un comando de montaje, ya --listque no mostrará los nombres de los dispositivos de bloque e intentar usar los nombres de dispositivos que imprime en un montaje dará como resultado:

Error mounting location: volume doesn't implement mount

Conclusión

Si bien ambos gvfs-mounty udisksctlfuncionarán para las tareas, su interfaz no es práctica ya que no proporcionan un estado legible por humanos de los discos disponibles, solo un volcado de información excesivamente detallado.

Grumbel
fuente
1
¿Podría extender su respuesta, incluyendo cómo montar una iso con gio mount? El 18.04 con Archive Mounter gio mount -lregresó Type: GDaemonMountpero no pude montarlo a través de CLI (¿tal vez un problema ?).
Pablo A
6

Una solución simple que funciona según sea necesario (se monta en / media / {user} / {diskid}), excepto que no puede enumerar dispositivos, pero debe recibir la etiqueta de volumen exacta, sensible a mayúsculas y minúsculas como argumento $ 1

Para montar :

DEVICE=$(findfs LABEL=$1) && udisksctl mount -b $DEVICE

Para desmontar :

DEVICE=$(findfs LABEL=$1) && udisksctl unmount -b $DEVICE
zvuk
fuente
Agradable. O, simplemente:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust
1

Simplemente me encontré con el problema y encontré la siguiente solución:

udisksctl mount -b /dev/disk/by-labels/$LABEL

Le pedirá la contraseña de usuario, incluso si es usted y ya ha iniciado sesión.

komuta
fuente
0

Escribí este script de Bash para solucionar este problema, pero ten en cuenta que soy un novato en scripts. Todas las sugerencias son bienvenidas! El uso y la descripción siguen debajo del guión.

#!/bin/bash
# umanage.sh
# 2014-05-05

BASEPATH="/media/$(whoami)/"
RESULTS=$(udisksctl dump | grep IdLabel | grep -c -i "$1")

case "$RESULTS" in

0 )     echo "Nothing found."
        ;;

1 )     DEVICELABEL=$(udisksctl dump | grep IdLabel | grep -i "$1" | cut -d ":" -f 2 | sed 's/^[ \t]*//')
        DEVICE=$(udisksctl dump | grep -i "IdLabel: \+$DEVICELABEL" -B 12 | grep " Device:" | cut -d ":" -f 2 | sed 's/^[ \t]*//')
        DEVICEPATH="$BASEPATH""$DEVICELABEL"

        if [[ -z $(mount | grep "$DEVICE") ]]
        then
                echo "Found unmounted $DEVICE partition."
                echo "Do you want to mount it in $DEVICEPATH?"
                select yn in "Mount" "Ignore"
                do
                        case $yn in
                        Mount )         udisksctl mount -b "$DEVICE"
                                        break
                                        ;;
                        Ignore )        exit
                                        ;;
                        esac
                done
        else
                echo "Found $DEVICE partition, currently mounted in $DEVICEPATH."
                echo "Do you want to unmount it?"
                select yn in "Unmount" "Ignore"
                do
                        case $yn in
                        Unmount )       udisksctl unmount -b "$DEVICE"
                                        break
                                        ;;
                        Ignore )        exit
                                        ;;
                        esac
                done
        fi
        ;;

* )     if [ $# -eq 0 ]
        then
                echo "No argument supplied"
        else
                echo "$RESULTS possible results. You may be looking for:"
                echo
                udisksctl dump | grep IdLabel | grep -i "$1" | cut -d ":" -f 2 | sed 's/^[ \t]*//' | sed '/^$/d'
                echo
                echo "Please refine your search."
        fi
        ;;

esac

Uso:

  • guarde el script como umanage.sh
  • hacerlo ejecutable: chmod + x umanage.sh
  • ejecútelo: ./umanage.sh YourDeviceLabel

El script acepta como argumento la etiqueta de la partición que desea montar y busca en el volcado udisksctl las entradas correspondientes.

Si se encuentra una partición y no está montada, se muestran el nombre y la ruta del dispositivo y se le ofrece montar la partición. El script también busca etiquetas parciales, y no le importará la mayúscula o minúscula (útil cuando no recuerda la etiqueta exacta).

./umanage.sh PASSPORT
Found unmounted /dev/sdf1 partition.
Do you want to mount it in /media/pixel/My Passport?
1) Mount
2) Ignore
#? 

Si se encuentra una partición y ya está montada, se le ofrece desmontarla:

./umanage.sh passp
Found /dev/sdf1 partition, currently mounted in /media/open/My Passport.
Do you want to unmount it?
1) Unmount
2) Ignore
#?

Si su argumento coincide con más de un resultado, el script le muestra las etiquetas de partición coincidentes y le pide que refine la búsqueda:

./umanage.sh SS
2 possible results. You may be looking for:

SSD-9GB
My Passport

Please refine your search.
píxel
fuente
0

Script para montar la unidad - mount-menu.sh

El mount-menu.shscript le permite seleccionar unidades / particiones desmontadas para el montaje. Para llamar a la utilización de la escritura: sudo mount-menu.sh. Esta pantalla aparece adaptada a su entorno de máquina único:

mount-menu 1.png

  • Use las teclas de flecha para seleccionar la partición y presione Enter

El menú se borra y deja esta información en su terminal:

=====================================================================
Mount Device:  /dev/nvme0n1p10
Mount Name:    /mnt/mount-menu.FPRAW
File System:   ext4
ID:            Ubuntu
RELEASE:       18.04
CODENAME:      bionic
DESCRIPTION:   Ubuntu 18.04.1 LTS
 Size  Used Avail Use%
  27G  7.9G   18G  32%

Ahora puede usar: cd /mnt/mount-menu.FPRAWpara acceder a la partición de su unidad externa.

Entonces puedes usar cd home/YOUR_NAMEser consciente para no poner un /frente home. Si lo usa cd /home, lo llevaría a su unidad de arranque y fuera de la unidad externa.

mount-menu.sh contenido del guion

Para crear el script, abra la terminal y escriba:

sudo -H gedit /usr/local/bin/mount-menu.sh

Luego copie el código a continuación y péguelo gedit. Guarde el archivo y salga gedit.

Ahora marque el archivo como ejecutable usando:

sudo chmod a+x /usr/local/bin/mount-menu.sh

Aquí está el guión para copiar:

#!/bin/bash

# NAME: mount-menu.sh
# PATH: /usr/local/bin
# DESC: Select unmounted partition for mounting
# DATE: May 9, 2018. Modified May 11, 2018.

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical \ 
                "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

# Must run as root
if [[ $(id -u) -ne 0 ]] ; then echo "Usage: sudo $0" ; exit 1 ; fi

#
# Create unqique temporary file names
#

tmpMenu=$(mktemp /tmp/mount-menu.XXXXX)     # Menu list
tmpInfo=$(mktemp /tmp/mount-menu.XXXXX)     # Mount Parition Info
tmpWork=$(mktemp /tmp/mount-menu.XXXXX)     # Work file
MountName=$(mktemp -d /mnt/mount-menu.XXXXX)  # Mount directory name

#
# Function Cleanup () Removes temporary files
#

CleanUp () {
    [[ -f $tmpMenu ]] && rm -f $tmpMenu     # If temporary files created
    [[ -f $tmpInfo ]] && rm -f $tmpInfo     #  at various program stages
    [[ -f $tmpWork ]] && rm -f $tmpWork     #  remove them before exiting.
}


#
# Mainline
#

lsblk -o NAME,FSTYPE,LABEL,SIZE,MOUNTPOINT > $tmpMenu

i=0
SPACES='                                                                     '
DoHeading=true
AllPartsArr=()      # All partitions.

# Build whiptail menu tags ($i) and text ($Line) into array

while read -r Line; do
    if [[ $DoHeading == true ]] ; then
        DoHeading=false                     # First line is the heading.
        MenuText="$Line"                    # Heading for whiptail.
        FSTYPE_col="${Line%%FSTYPE*}"           
        FSTYPE_col="${#FSTYPE_col}"         # FS Type, ie `ext4`, `ntfs`, etc.
        MOUNTPOINT_col="${Line%%MOUNTPOINT*}"
        MOUNTPOINT_col="${#MOUNTPOINT_col}" # Required to ensure not mounted.
        continue
    fi

    Line="$Line$SPACES"                     # Pad extra white space.
    Line=${Line:0:74}                       # Truncate to 74 chars for menu.

    AllPartsArr+=($i "$Line")               # Menu array entry = Tag# + Text.
    (( i++ ))

done < $tmpMenu                             # Read next "lsblk" line.

#
# Display whiptail menu in while loop until no errors, or escape,
# or valid partion selection .
#

DefaultItem=0

while true ; do

    # Call whiptail in loop to paint menu and get user selection
    Choice=$(whiptail \
        --title "Use arrow, page, home & end keys. Tab toggle option" \
        --backtitle "Mount Partition" \
        --ok-button "Select unmounted partition" \
        --cancel-button "Exit" \
        --notags \
        --default-item "$DefaultItem" \
        --menu "$MenuText" 24 80 16 \
        "${AllPartsArr[@]}" \
        2>&1 >/dev/tty)

    clear                                   # Clear screen.
    if [[ $Choice == "" ]]; then            # Escape or dialog "Exit".
        CleanUp
        exit 1;
     fi

    DefaultItem=$Choice                     # whiptail start option.
    ArrNdx=$(( $Choice * 2 + 1))            # Calculate array offset.
    Line="${AllPartsArr[$ArrNdx]}"          # Array entry into $Line.

    # Validation - Don't wipe out Windows or Ubuntu 16.04:
    # - Partition must be ext4 and cannot be mounted.

    if [[ "${Line:MOUNTPOINT_col:4}" != "    " ]] ; then
        echo "Partition is already mounted."
        read -p "Press <Enter> to continue"
        continue
    fi

    # Build "/dev/Xxxxx" FS name from "├─Xxxxx" menu line
    MountDev="${Line%% *}"
    MountDev=/dev/"${MountDev:2:999}"

    # Build File System Type
    MountType="${Line:FSTYPE_col:999}"
    MountType="${MountType%% *}"

    break                                   # Validated: Break menu loop.

done                                        # Loop while errors.

#
# Mount partition
#

echo ""
echo "====================================================================="
mount -t auto $MountDev $MountName


# Display partition information.
echo "Mount Device=$MountDev" > $tmpInfo
echo "Mount Name=$MountName" >> $tmpInfo
echo "File System=$MountType" >> $tmpInfo

# Build Mount information (the partition selected for cloning to)
LineCnt=$(ls $MountName | wc -l)
if (( LineCnt > 2 )) ; then 
    # More than /Lost+Found exist so it's not an empty partition.
    if [[ -f $MountName/etc/lsb-release ]] ; then
        cat $MountName/etc/lsb-release >> $tmpInfo
    else
        echo "No LSB-Release file on Partition." >> $tmpInfo
    fi
else
    echo "Partition appears empty" >> $tmpInfo
    echo "/Lost+Found normal in empty partition" >> $tmpInfo
    echo "First two files/directories below:" >> $tmpInfo
    ls $MountName | head -n2 >> $tmpInfo
fi

sed -i 's/DISTRIB_//g' $tmpInfo      # Remove DISTRIB_ prefix.
sed -i 's/=/:=/g' $tmpInfo           # Change "=" to ":="
sed -i 's/"//g' $tmpInfo             # Remove " around "Ubuntu 16.04...".

# Align columns from "Xxxx:=Yyyy" to "Xxxx:      Yyyy"
cat $tmpInfo | column -t -s '=' > $tmpWork
cat $tmpWork > $tmpInfo

# Mount device free bytes
df -h --output=size,used,avail,pcent "$MountDev" >> $tmpInfo

# Display partition information.
cat $tmpInfo

CleanUp                             # Remove temporary files

exit 0

umount-menu.sh desmontar unidades / particiones

Repita el proceso de creación / ejecución de marcado de bits para el script umount-menu.sh. Este script solo desmonta unidades / particiones que fueron montadas por mount-menu.sh. Tiene el mismo menú de selección y se completa con el mensaje:

=====================================================================

/dev/nvme0n1p10 mounted on /mnt/mount-menu.FPRAW unmounted.

Para llamar al script use: sudo umount-menu.sh

umount-menu.sh script bash:

!/bin/bash

# NAME: umount-menu.sh
# PATH: /usr/local/bin
# DESC: Select mounted partition for unmounting
# DATE: May 10, 2018. Modified May 11, 2018.

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical \ 
                "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

# Must run as root
if [[ $(id -u) -ne 0 ]] ; then echo "Usage: sudo $0" ; exit 1 ; fi

#
# Create unqique temporary file names
#

tmpMenu=$(mktemp /mnt/mount-menu.XXXXX)   # Menu list

#
# Function Cleanup () Removes temporary files
#

CleanUp () {
    [[ -f "$tmpMenu" ]] && rm -f "$tmpMenu" #  at various program stages
}


#
# Mainline
#

lsblk -o NAME,FSTYPE,LABEL,SIZE,MOUNTPOINT > "$tmpMenu"

i=0
SPACES='                                                                     '
DoHeading=true
AllPartsArr=()      # All partitions.

# Build whiptail menu tags ($i) and text ($Line) into array

while read -r Line; do
    if [[ $DoHeading == true ]] ; then
        DoHeading=false                     # First line is the heading.
        MenuText="$Line"                    # Heading for whiptail.
        MOUNTPOINT_col="${Line%%MOUNTPOINT*}"
        MOUNTPOINT_col="${#MOUNTPOINT_col}" # Required to ensure mounted.
        continue
    fi

    Line="$Line$SPACES"                     # Pad extra white space.
    Line=${Line:0:74}                       # Truncate to 74 chars for menu.

    AllPartsArr+=($i "$Line")               # Menu array entry = Tag# + Text.
    (( i++ ))

done < "$tmpMenu"                           # Read next "lsblk" line.

#
# Display whiptail menu in while loop until no errors, or escape,
# or valid partion selection .
#

DefaultItem=0

while true ; do

    # Call whiptail in loop to paint menu and get user selection
    Choice=$(whiptail \
        --title "Use arrow, page, home & end keys. Tab toggle option" \
        --backtitle "Mount Partition" \
        --ok-button "Select unmounted partition" \
        --cancel-button "Exit" \
        --notags \
        --default-item "$DefaultItem" \
        --menu "$MenuText" 24 80 16 \
        "${AllPartsArr[@]}" \
        2>&1 >/dev/tty)

    clear                                   # Clear screen.

    if [[ $Choice == "" ]]; then            # Escape or dialog "Exit".
        CleanUp
        exit 1;
     fi

    DefaultItem=$Choice                     # whiptail start option.
    ArrNdx=$(( $Choice * 2 + 1))            # Calculate array offset.
    Line="${AllPartsArr[$ArrNdx]}"          # Array entry into $Line.

    if [[ "${Line:MOUNTPOINT_col:15}" != "/mnt/mount-menu" ]] ; then
        echo "Only Partitions mounted by mount-menu.sh can be unounted."
        read -p "Press <Enter> to continue"
        continue
    fi

    # Build "/dev/Xxxxx" FS name from "├─Xxxxx" menu line
    MountDev="${Line%% *}"
    MountDev=/dev/"${MountDev:2:999}"

    # Build Mount Name
    MountName="${Line:MOUNTPOINT_col:999}"
    MountName="${MountName%% *}"

    break                                   # Validated: Break menu loop.

done                                        # Loop while errors.

#
# Unmount partition
#

echo ""
echo "====================================================================="
umount "$MountName" -l                      # Unmount the clone
rm  -d "$MountName"                         # Remove clone directory

echo $(tput bold)                           # Set to bold text
echo $MountDev mounted on $MountName unmounted.
echo $(tput sgr0)                           # Reset to normal text

CleanUp                                     # Remove temporary files

exit 0
WinEunuuchs2Unix
fuente