34 votes

Comment faire un montage automatique à partir de la ligne de commande ?

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 l'obtention d'une liste de périphériques disponibles, puis la sélection d'un et l'obtention d'un résultat en tant que /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 genre de montage semi-automatique.

pmount est le plus proche que j'ai trouvé, mais semble fonctionner selon des mécanismes complètement différents et fait apparaître les dispositifs comme /media/sdf ou quelque chose du genre.

40voto

Radu Rădeanu Points 156862

Vous pouvez utiliser :

udisksctl mount -b _device\_name_

où _device_name_ est le nom d'un périphérique de stockage et doit ressembler à quelque chose comme /dev/sdb1 .

Utilisation de lsblk ou sudo fdisk -l vous pouvez trouver tous les périphériques de stockage attachés à votre système.

24voto

jeds Points 106

gio mount

gvfs est maintenant listé comme déprécié (2018) et il vous 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 disque, créez un bash script avec la permission d'être exécuté 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 pourriez Encodage de l'URL le chemin avec Python 3 et realpath (à 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)"

Il sera monté sur /run/user/$(id -u)/gvfs/ .

Comme alternative gnome-disk-image-mounter se montera sur /media/$USER/ .

Pour démonter, utilisez gio mount -u /run/user/$(id -u)/gvfs/archive* (ou /media/$USER/ selon le mode de montage).

udisksctl

Liste des appareils disponibles :

udisksctl status

Le montage se fait via :

udisksctl mount -b /dev/sdf

または

udisksctl mount -p block_devices/sdf

Le démontage se fait via :

udisksctl unmount -b /dev/sdf

または

udisksctl unmount -p block_devices/sdf

El object-path peut être découvert en le faisant :

udisksctl dump

Objet de type org.freedesktop.UDisks2.Block semblent être valables en tant que object-patch le /org/freedesktop/UDisks2/ doit être coupé du chemin pour que udisksctl les accepte.

gvfs-mount

L'énumération des dispositifs disponibles peut se faire avec :

gvfs-mount --list

On peut les monter avec :

gvfs-mount -d /dev/sdf

Le démontage est possible via :

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

Le problème qui subsiste est que je n'ai aucune idée de la manière d'utiliser la fonction gvfs-mount --list dans une commande de montage, comme --list n'affichera pas les noms de périphériques en bloc et essayer d'utiliser les noms de périphériques qu'il imprime dans un montage aura pour résultat :

Error mounting location: volume doesn't implement mount

結論

Alors que les deux gvfs-mount y udisksctl fonctionneront pour les tâches, leur interface n'est pas pratique car ils ne fournissent pas un statut lisible par l'homme des disques disponibles, juste un vidage d'informations trop verbeux.

7voto

user234461 Points 101

Une solution simple qui fonctionne comme prévu (montage sur /media/{user}/{diskid}) sauf qu'elle ne peut pas lister les périphériques mais doit recevoir le label exact du volume, 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

2voto

Azat Razetdinov Points 542

Je viens de rencontrer ce problème moi-mê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 s'il s'agit de vous et que vous êtes déjà connecté.

1voto

pixel Points 27

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

Utilisation :

  • sauvegarder le script comme umanage.sh
  • le rendre exécutable : chmod +x umanage.sh
  • exécutez-le : ./umanage.sh VotreÉtiquetteAppareil

Le script accepte comme argument le label de la partition que vous voulez monter et recherche dans le dump udisksctl les entrées correspondantes.

Si une partition est trouvée et qu'elle n'est pas montée, le nom et le chemin du périphérique sont affichés et il vous est proposé de monter la partition. Le script recherche également les étiquettes partielles, et il ne se soucie 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, il vous est proposé de 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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X