Come montare automaticamente dalla riga di comando?


25

Come posso attivare un automount dalla riga di comando? Per "montaggio automatico" non intendo il montaggio completamente automatico, ma ottenere un elenco di dispositivi disponibili e quindi selezionarne uno e farlo finire come /media/{user}/{diskid}. Questa funzionalità è fornita ad esempio da Nautilus o Thunar, ma non riesco a trovare uno strumento da riga di comando per attivare questo tipo di montaggio semi automatico.

pmountè il più vicino che ho trovato, ma sembra funzionare da meccanici completamente diversi sotto e fa apparire i dispositivi come /media/sdfo qualcosa del genere.

Risposte:


29

Puoi usare:

udisksctl mount -b device_name

dov'èdevice_name il nome di un dispositivo di archiviazione e dovrebbe assomigliare a qualcosa /dev/sdb1.

Usando lsblko sudo fdisk -lcomando puoi scoprire tutti i dispositivi di archiviazione collegati al tuo sistema.


2
Ho provato che, a /media/{disk}prescindere da ciò, ciò sarebbe diverso da ciò che Thunar o Nautilus avrebbero dato. Il udisksctlcomando fornito da udisks2sembra tuttavia fare quello che voglio.
Grumbel,

1
udisksctl statusfornirà un elenco adeguato di dispositivi e funzionerà come utente. fdisk -lnon richiede solo root, ma fallirà anche con le unità GPT. cat /proc/partitionssarebbe un modo migliore di basso livello per avere un'idea delle partizioni disponibili.
Grumbel,

udiskctlè estremamente utile anche per il montaggio di file di dischi immagine in dispositivi loop senza privilegi di root!

Sembra udiskdisponibile fino al 14.04.
Pablo A

13

gio mount

gvfs è ora elencato come deprecato (2018) e ti consigliamo di usare 'gio' che è Gnome In Out e parte di Glib. Vedi Wikipedia .

Ad esempio, per montare automaticamente una seconda partizione dell'unità; creare uno script bash con autorizzazione eseguibile da eseguire all'avvio con il seguente comando:

gio mount -d /dev/sda2

Se sei il proprietario della partizione (vedi chown) non avrai bisogno di sudo.

Per montare un file ISO che si trova ad esempio su ~/ISOs:

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

È possibile codificare l' URL del percorso con Python 3 e realpath(per concatenarsi 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)"

Questo monterà su /run/user/$(id -u)/gvfs/.

In alternativa gnome-disk-image-mounter, monterà /media/$USER/.

Per smontare utilizzare gio mount -u /run/user/$(id -u)/gvfs/archive*(o /media/$USER/, a seconda del modo in cui è stato montato).

udisksctl

Elenco dei dispositivi disponibili:

udisksctl status

Il montaggio avviene tramite:

udisksctl mount -b /dev/sdf

o

udisksctl mount -p block_devices/sdf

Lo smontaggio avviene tramite:

udisksctl unmount -b /dev/sdf

o

udisksctl unmount -p block_devices/sdf

Si object-pathpuò scoprire facendo:

udisksctl dump

L'oggetto di tipo org.freedesktop.UDisks2.Blocksembra essere valido poiché object-patchil /org/freedesktop/UDisks2/prefisso deve essere tagliato dal percorso affinché udisksctl li accetti.

gvfs-mount

L'elenco dei dispositivi disponibili può essere fatto con:

gvfs-mount --list

Il loro montaggio può essere fatto con:

gvfs-mount -d /dev/sdf

Lo smontaggio è possibile tramite:

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

Un altro problema è che non ho idea di come utilizzare l' gvfs-mount --listoutput in un comando mount, in quanto --listnon mostrerà i nomi dei dispositivi a blocchi e provando a usare i nomi dei dispositivi che stampa in un mount comporteranno:

Error mounting location: volume doesn't implement mount

Conclusione

Mentre entrambi gvfs-mounte udisksctlfunzioneranno per le attività, la loro interfaccia è impraticabile in quanto non forniscono uno stato leggibile dall'uomo dei dischi disponibili, ma solo un dump di informazioni eccessivamente dettagliato.


1
Potresti estendere la tua risposta, incluso come montare un iso con gio mount? Il 18.04 con Archive Mounter gio mount -lritorna Type: GDaemonMountma non riesco a montarlo tramite CLI (forse un problema ?).
Pablo A

6

Una soluzione semplice che funziona come richiesto (monta su / media / {user} / {diskid}) tranne per il fatto che non può elencare i dispositivi ma deve avere l'etichetta esatta, sensibile al maiuscolo / minuscolo, come argomento $ 1

Per montare :

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

Per smontare :

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

Bello. Oppure, solo:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust

1

Mi sono appena imbattuto nel problema e ho trovato la seguente soluzione:

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

Chiederà la password dell'utente, anche se sei tu e sei già loggato.


0

Ho scritto questo script Bash per ovviare a questo problema, ma tieni presente che sono un novizio di scripting. Tutti i suggerimenti sono benvenuti! L'uso e la descrizione seguono sotto lo script.

#!/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:

  • salva lo script come umanage.sh
  • rendilo eseguibile: chmod + x umanage.sh
  • eseguirlo: ./umanage.sh YourDeviceLabel

Lo script accetta come argomento l'etichetta della partizione che si desidera montare e cerca nel dump udisksctl le voci corrispondenti.

Se viene rilevata una partizione che non è montata, vengono visualizzati il ​​nome e il percorso del dispositivo e viene offerto di montare la partizione. Lo script cerca anche etichette parziali e non si preoccuperà di maiuscole o minuscole (utile quando non ricordi l'etichetta esatta).

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

Se viene rilevata una partizione ed è già montata, ti viene offerto di smontarla:

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

Se l'argomento corrisponde a più di un risultato, lo script mostra le etichette delle partizioni corrispondenti e ti chiede di affinare la ricerca:

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

SSD-9GB
My Passport

Please refine your search.

0

Script per montare l'unità - mount-menu.sh

Lo mount-menu.shscript consente di selezionare unità / partizioni non montate per il montaggio. Per chiamare l'uso di script: sudo mount-menu.sh. Questa schermata appare su misura per il tuo unico ambiente macchina:

mount-menu 1.png

  • Utilizzare i tasti freccia per selezionare la partizione e premere Enter

Il menu cancella e lascia queste informazioni nel tuo terminale:

=====================================================================
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%

Ora puoi usare: cd /mnt/mount-menu.FPRAWper accedere alla partizione del tuo disco esterno.

Quindi puoi usare la cd home/YOUR_NAMEconsapevolezza di non metterti /di fronte home. Se lo usi cd /home, verrai indirizzato all'unità di avvio e all'unità esterna.

mount-menu.sh contenuto della sceneggiatura

Per creare lo script aprire il terminale e digitare:

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

Quindi copia il codice qui sotto e incollalo gedit. Salva il file ed esci gedit.

Ora segna il file come eseguibile usando:

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

Ecco lo script da copiare:

#!/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 per smontare unità / partizioni

Ripetere la creazione del file / eseguire il processo di marcatura dei bit per lo script umount-menu.sh. Questo script smonta solo unità / partizioni montate da mount-menu.sh. Ha lo stesso menu di selezione e si completa con il messaggio:

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

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

Per chiamare lo script utilizzare: 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.