Comment monter automatiquement à partir de la ligne de commande?


25

Comment puis-je déclencher un montage automatique à partir de la ligne de commande? Par «montage automatique», je ne veux pas dire un montage entièrement automatique, mais obtenir une liste des périphériques disponibles, puis en sélectionner un et le faire finir comme /media/{user}/{diskid}. Cette fonctionnalité est fournie par Nautilus ou Thunar par exemple, mais je n'arrive pas à trouver un outil en ligne de commande pour déclencher ce type de montage semi-automatique.

pmountest le plus proche que j'ai trouvé, mais semble fonctionner avec des mécanismes complètement différents en dessous et fait apparaître les appareils comme /media/sdfou quelque chose le long des lignes.

Réponses:


29

Vous pouvez utiliser:

udisksctl mount -b nom_unité

device_name est le nom d'un périphérique de stockage et devrait ressembler à quelque chose /dev/sdb1.

En utilisant la commande lsblkou, sudo fdisk -lvous pouvez découvrir tous les périphériques de stockage connectés à votre système.


2
Essayé que, cela mène cependant à /media/{disk}, différent de ce que donnerait Thunar ou Nautilus. La udisksctlcommande fournie par udisks2semble cependant faire ce que je veux.
Grumbel

1
udisksctl statusdonnera une liste appropriée des appareils et fonctionnera en tant qu'utilisateur. fdisk -lnon seulement nécessite root, mais il échouera également avec les lecteurs GPT. cat /proc/partitionsserait un meilleur moyen de bas niveau pour se faire une idée des partitions disponibles.
Grumbel

udiskctlest extrêmement utile pour monter des fichiers de disque d'image dans des périphériques de boucle sans privilèges root, aussi!

Semble udiskétait disponible jusqu'au 14.04.
Pablo A

13

gio mount

gvfs est maintenant répertorié comme obsolète (2018) et il est conseillé d'utiliser `` gio '' qui est Gnome In Out et fait partie de Glib. Voir Wikipedia .

Par exemple, pour monter automatiquement une deuxième partition de lecteur; créer un script bash avec la permission exécutable à exécuter au démarrage avec la commande suivante:

gio mount -d /dev/sda2

Si vous êtes propriétaire de la partition (voir chown), vous n'aurez pas besoin de sudo.

Pour monter un fichier ISO situé par exemple sur ~/ISOs:

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

Vous pouvez coder l' URL du chemin avec Python 3 et realpath(pour concaténer 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)"

Cela va continuer /run/user/$(id -u)/gvfs/.

Comme alternative, vous gnome-disk-image-mounterpourrez monter /media/$USER/.

Pour démonter l'utilisation gio mount -u /run/user/$(id -u)/gvfs/archive*(ou /media/$USER/, selon la façon dont vous l'avez monté).

udisksctl

Liste des appareils disponibles:

udisksctl status

Le montage se fait via:

udisksctl mount -b /dev/sdf

ou

udisksctl mount -p block_devices/sdf

Le démontage se fait via:

udisksctl unmount -b /dev/sdf

ou

udisksctl unmount -p block_devices/sdf

Le object-pathpeut être découvert en faisant:

udisksctl dump

L'objet de type org.freedesktop.UDisks2.Blocksemble être valide car object-patch, le /org/freedesktop/UDisks2/préfixe doit être coupé du chemin pour que udisksctl les accepte.

gvfs-mount

La liste des appareils disponibles peut être effectuée avec:

gvfs-mount --list

Leur montage peut se faire avec:

gvfs-mount -d /dev/sdf

Le démontage est possible via:

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

Un problème restant est que je n'ai aucune idée de comment utiliser la gvfs-mount --listsortie dans une commande de montage, car --listne montrera pas les noms de périphériques de bloc et essayer d'utiliser les noms de périphériques qu'il imprime dans un montage entraînera:

Error mounting location: volume doesn't implement mount

Conclusion

Bien que les deux gvfs-mountet udisksctltravaillera pour les tâches, leur interface est peu pratique car ils ne fournissent pas le statut lisible des disques disponibles, juste un trop bavard décharge d'information.


1
Pourriez-vous étendre votre réponse, y compris comment monter une iso avec gio mount? Le 18.04 avec le gio mount -lretour d'Archive Mounter Type: GDaemonMountmais je n'ai pas pu le monter via CLI (peut-être un problème ?).
Pablo A

6

Une solution simple qui fonctionne selon les besoins (se monte sur / media / {user} / {diskid}) sauf qu'elle ne peut pas lister les périphériques mais doit recevoir l'étiquette de volume exacte, sensible à la casse, comme argument $ 1

Pour monter :

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

Pour démonter :

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

Agréable. Ou, juste:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust

1

Je suis moi-même tombé sur le problème et j'ai trouvé la solution suivante:

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

Il vous demandera le mot de passe de l'utilisateur, même si c'est vous et que vous êtes déjà connecté.


0

J'ai écrit ce script Bash pour contourner ce problème, mais sachez que je suis un novice en matière de script. Toutes les suggestions sont les bienvenues! L'utilisation et la description suivent ci-dessous le 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

Usage:

  • enregistrez le script sous umanage.sh
  • rendez-le exécutable: chmod + x umanage.sh
  • exécutez-le: ./umanage.sh YourDeviceLabel

Le script accepte comme argument l'étiquette de la partition que vous souhaitez monter et recherche dans le vidage udisksctl les entrées correspondantes.

Si une partition est trouvée et qu'elle n'est pas montée, le nom et le chemin de l'appareil sont affichés et vous êtes proposé de monter la partition. Le script recherche également les étiquettes partielles, et il ne se souciera pas des majuscules ou des minuscules (utile lorsque vous ne vous souvenez pas de l'étiquette exacte).

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

Si une partition est trouvée et qu'elle est déjà montée, vous êtes invité à la démonter:

./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 votre argument correspond à plus d'un résultat, le script vous montre les étiquettes de partition correspondantes et vous demande d'affiner la recherche:

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

SSD-9GB
My Passport

Please refine your search.

0

Script pour monter le lecteur - mount-menu.sh

Le mount-menu.shscript vous permet de sélectionner des disques / partitions non montés pour le montage. Pour appeler l'utilisation du script: sudo mount-menu.sh. Cet écran apparaît adapté à votre environnement de machine unique:

menu de montage 1.png

  • Utilisez les touches fléchées pour sélectionner la partition et appuyez sur Enter

Le menu efface et laisse ces informations dans votre 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%

Vous pouvez maintenant utiliser: cd /mnt/mount-menu.FPRAWpour accéder à la partition de votre lecteur externe.

Ensuite, vous pouvez cd home/YOUR_NAMEêtre attentif à ne pas mettre un /devant home. Si vous l'utilisez, cd /homecela vous amènera à votre lecteur de démarrage et hors du lecteur externe.

mount-menu.sh contenu du script

Pour créer le script, ouvrez le terminal et tapez:

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

Copiez ensuite le code ci-dessous et collez-le dans gedit. Enregistrez le fichier et quittez gedit.

Marquez maintenant le fichier comme exécutable en utilisant:

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

Voici le script à copier:

#!/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 pour démonter des lecteurs / partitions

Répétez le processus de création / exécution de marquage de bits pour le script umount-menu.sh. Ce script démonte uniquement les lecteurs / partitions qui ont été montés par mount-menu.sh. Il a le même menu de sélection et se termine par le message:

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

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

Pour appeler le script, utilisez: 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.