Wie kann ich von der Kommandozeile aus automatisch einhängen?


25

Wie kann ich ein automount über die Kommandozeile auslösen? Mit "automount" meine ich nicht das vollautomatische Mounten, sondern das Abrufen einer Liste der verfügbaren Geräte und das Auswählen eines Geräts /media/{user}/{diskid}. Diese Funktionalität wird zum Beispiel von Nautilus oder Thunar bereitgestellt, aber ich kann anscheinend kein Befehlszeilentool finden, um diese Art der halbautomatischen Bereitstellung auszulösen.

pmountist die nächste, die ich gefunden habe, scheint aber von völlig anderen Mechanikern darunter zu funktionieren und lässt Geräte als /media/sdfoder etwas in der Art auftauchen .

Antworten:


29

Sie können verwenden:

udisksctl mount -b Gerätename

wodevice_name ist der Name eines Speichergeräts und sollte ungefähr so ​​aussehen /dev/sdb1.

Mit dem Befehl lsblkoder sudo fdisk -lkönnen Sie alle an Ihr System angeschlossenen Speichergeräte ermitteln.


2
Versuchte das, was aber dazu führt /media/{disk}, anders als das, was Thunar oder Nautilus geben würden. Der von udisksctlbereitgestellte Befehl udisks2scheint jedoch zu tun, was ich will.
Grumbel

1
udisksctl statuswird eine ordnungsgemäße Liste der Geräte geben und als Benutzer arbeiten. fdisk -lErfordert nicht nur root, sondern schlägt auch bei GPT-Laufwerken fehl. cat /proc/partitionswäre ein besserer Weg, um eine Vorstellung davon zu bekommen, welche Partitionen verfügbar sind.
Grumbel

udiskctlist sehr nützlich, um Image-Disk-Dateien auch ohne Root-Rechte in Loop-Geräte einzubinden!

Scheint udiskbis zum 14.04.
Pablo A

13

gio mount

gvfs ist jetzt als veraltet (2018) aufgeführt und es wird empfohlen, 'gio' zu verwenden, das ist Gnome In Out und Teil von Glib. Siehe Wikipedia .

Zum Beispiel, um eine zweite Laufwerkpartition automatisch zu mounten; Erstellen Sie ein Bash-Skript mit der ausführbaren Berechtigung, um es beim Start mit dem folgenden Befehl auszuführen:

gio mount -d /dev/sda2

Wenn Sie Eigentümer der Partition sind (siehe chown ), benötigen Sie sudo nicht.

So hängen Sie eine ISO-Datei ein, die sich beispielsweise auf befindet ~/ISOs:

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

Sie können den Pfad mit Python 3 URL-kodieren und realpath(verketten mit 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)"

Dies wird auf mounten /run/user/$(id -u)/gvfs/ .

Als Alternative gnome-disk-image-mounterwird es weitergehen/media/$USER/ .

Zum Abmelden verwenden gio mount -u /run/user/$(id -u)/gvfs/archive*(oder /media/$USER/, abhängig von der Art, wie Sie gemountet haben).

udisksctl

Liste der verfügbaren Geräte:

udisksctl status

Die Montage erfolgt über:

udisksctl mount -b /dev/sdf

oder

udisksctl mount -p block_devices/sdf

Das Abmelden erfolgt über:

udisksctl unmount -b /dev/sdf

oder

udisksctl unmount -p block_devices/sdf

Das object-pathkönnen Sie herausfinden, indem Sie Folgendes tun:

udisksctl dump

Objekt vom Typ org.freedesktop.UDisks2.Blockscheint gültig zu sein, da object-patchdas /org/freedesktop/UDisks2/Präfix aus dem Pfad entfernt werden muss, damit udisksctl sie akzeptiert.

gvfs-mount

Das Auflisten der verfügbaren Geräte kann erfolgen mit:

gvfs-mount --list

Die Montage kann erfolgen mit:

gvfs-mount -d /dev/sdf

Das Abhängen ist möglich über:

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

Ein verbleibendes Problem ist, dass ich keine Ahnung habe, wie die gvfs-mount --listAusgabe in einem Mount-Befehl verwendet werden soll, da --listBlock-Gerätenamen nicht angezeigt werden und der Versuch, die in einem Mount ausgegebenen Gerätenamen zu verwenden, zu folgenden Ergebnissen führt:

Error mounting location: volume doesn't implement mount

Fazit

Während beide gvfs-mountund udisksctlfür die Aufgaben arbeiten, ist ihre Benutzeroberfläche unpraktisch, da sie keinen für den Menschen lesbaren Status der verfügbaren Datenträger liefern, sondern lediglich einen übermäßig ausführlichen Info-Dump.


1
Könnten Sie Ihre Antwort um die Frage erweitern, wie eine ISO gemountet werden kann gio mount? Am 18.04 mit Archive Mounter gio mount -lzurück, Type: GDaemonMountaber ich konnte es nicht über CLI mounten (vielleicht ein Problem ?).
Pablo A

6

Eine einfache Lösung, die nach Bedarf funktioniert (wird in / media / {user} / {diskid} geladen), mit der Ausnahme, dass keine Geräte aufgelistet werden können, sondern die genaue Datenträgerbezeichnung mit Groß- und Kleinschreibung als Argument $ 1 angegeben werden muss

Zu montieren :

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

So hängen Sie ab :

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

Nett. Oder einfach:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust

1

Ich bin gerade auf das Problem gestoßen und habe die folgende Lösung gefunden:

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

Sie werden nach dem Benutzerpasswort gefragt, auch wenn Sie es sind und bereits angemeldet sind.


0

Ich habe dieses Bash-Skript geschrieben, um dieses Problem zu umgehen, aber ich bin mir bewusst, dass ich ein Anfänger in der Skripterstellung bin. Alle Vorschläge willkommen! Verwendung und Beschreibung folgen unterhalb des Skripts.

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

Verwendung:

  • Speichern Sie das Skript als umanage.sh
  • mach es ausführbar: chmod + x umanage.sh
  • Führen Sie es aus: ./umanage.sh YourDeviceLabel

Das Skript akzeptiert als Argument die Bezeichnung der Partition, die Sie mounten möchten, und sucht im udisksctl-Dump nach entsprechenden Einträgen.

Wenn eine Partition gefunden und nicht gemountet wird, werden der Gerätename und der Pfad angezeigt, und Sie werden aufgefordert, die Partition zu mounten. Das Skript sucht auch nach Teilbezeichnungen, und es kümmert sich nicht um Groß- oder Kleinschreibung (nützlich, wenn Sie sich nicht an die genaue Bezeichnung erinnern).

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

Wenn eine Partition gefunden und bereits gemountet wurde, können Sie sie abmelden:

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

Wenn Ihr Argument mit mehr als einem Ergebnis übereinstimmt, zeigt das Skript die entsprechenden Partitionsbezeichnungen an und fordert Sie auf, die Suche zu verfeinern:

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

SSD-9GB
My Passport

Please refine your search.

0

Skript zum Einhängen des Laufwerks - mount-menu.sh

Mit dem mount-menu.shSkript können Sie nicht gemountete Laufwerke / Partitionen zum Mounten auswählen. Um das Skript zu verwenden nennen: sudo mount-menu.sh. Dieser Bildschirm ist auf Ihre spezielle Maschinenumgebung zugeschnitten:

mount-menu 1.png

  • Verwenden Sie die Pfeiltasten, um die Partition auszuwählen, und drücken Sie Enter

Das Menü löscht und belässt diese Informationen in Ihrem 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%

Jetzt können Sie mit: cd /mnt/mount-menu.FPRAWauf die Partition Ihres externen Laufwerks zugreifen.

Dann kannst du es gebrauchen cd home/YOUR_NAME, achtsam zu sein, um nicht /davor zu stehen home. Wenn Sie cd /homees verwenden, gelangen Sie zu Ihrem Startlaufwerk und aus dem externen Laufwerk.

mount-menu.sh Skriptinhalt

Um das Skript zu erstellen, öffnen Sie das Terminal und geben Sie Folgendes ein:

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

Kopieren Sie dann den folgenden Code und fügen Sie ihn ein gedit. Speichern Sie die Datei und beenden Sie sie gedit.

Markieren Sie nun die Datei als ausführbar mit:

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

Hier ist das zu kopierende Skript:

#!/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 zum Unmounten von Laufwerken / Partitionen

Wiederholen Sie die Dateierstellung / Bitmarkierung für das Skript umount-menu.sh. Dieses Skript hebt nur Laufwerke / Partitionen auf, die von bereitgestellt wurden mount-menu.sh. Es hat das gleiche Auswahlmenü und schließt mit der Meldung ab:

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

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

Um das Skript aufzurufen, verwenden Sie: sudo umount-menu.sh

umount-menu.sh Bash-Skript:

!/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.