Jak automatycznie zamontować z linii poleceń?

25

Jak mogę uruchomić automount z linii poleceń? Przez „automatyczny montaż” nie mam na myśli w pełni automatycznego montażu, ale uzyskanie listy dostępnych urządzeń, a następnie wybranie jednego z nich i uzyskanie go jako /media/{user}/{diskid}. Ta funkcjonalność jest na przykład zapewniana przez Nautilusa lub Thunara, ale nie mogę znaleźć narzędzia wiersza poleceń, które wyzwalałoby tego rodzaju półautomatyczne montowanie.

pmountjest najbliższy, jaki znalazłem, ale wydaje się, że działa pod zupełnie inną mechaniką pod spodem i sprawia, że ​​urządzenia pojawiają się jako /media/sdflub coś wzdłuż linii.

Grumbel
źródło

Odpowiedzi:

29

Możesz użyć:

udisksctl mount -b nazwa_urządzenia

gdziedevice_name jest nazwa urządzenia pamięci masowej i powinna wyglądać mniej więcej tak /dev/sdb1.

Za pomocą lsblklub sudo fdisk -lpolecenia można znaleźć wszystkie urządzenia pamięci masowej podłączone do systemu.

Radu Rădeanu
źródło
2
Próbowałem, że to jednak prowadzi do /media/{disk}czegoś innego niż to, co dałby Thunar lub Nautilus. Wydane udisksctlpolecenie udisks2wydaje się jednak robić to, co chcę.
Grumbel
1
udisksctl statusda odpowiednią listę urządzeń i będzie działać jako użytkownik. fdisk -lwymaga nie tylko rootowania, ale także awarii dysków GPT. cat /proc/partitionsbyłby lepszym sposobem na uzyskanie informacji o partycjach na niskim poziomie.
Grumbel,
udiskctljest niezwykle przydatny do montowania plików dysków z obrazami w urządzeniach pętlowych bez uprawnień roota!
Wydaje się, że udiskbył dostępny do 14.04.
Pablo A
13

gio mount

gvfs jest teraz na liście przestarzałych (2018) i zaleca się używanie „gio”, które jest Gnome In Out i jest częścią Glib. Zobacz Wikipedia .

Na przykład, aby automatycznie zamontować drugą partycję dysku; utwórz skrypt bash z uprawnieniami wykonywalnymi do uruchomienia podczas uruchamiania za pomocą następującego polecenia:

gio mount -d /dev/sda2

Jeśli jesteś właścicielem partycji (zobacz chown), nie będziesz potrzebować sudo.

Aby zamontować plik ISO umieszczony na przykład na ~/ISOs:

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

Możesz URL zakodować ścieżkę w Pythonie 3 i realpath(aby połączyć z 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)"

To się zamontuje /run/user/$(id -u)/gvfs/.

Jako alternatywa gnome-disk-image-mounterzostanie zamontowany na /media/$USER/.

Aby odmontować użycie gio mount -u /run/user/$(id -u)/gvfs/archive*(lub /media/$USER/, w zależności od sposobu zamontowania).

udisksctl

Lista dostępnych urządzeń:

udisksctl status

Montaż odbywa się poprzez:

udisksctl mount -b /dev/sdf

lub

udisksctl mount -p block_devices/sdf

Odmontowywanie odbywa się poprzez:

udisksctl unmount -b /dev/sdf

lub

udisksctl unmount -p block_devices/sdf

object-pathMożna znaleźć się wykonując:

udisksctl dump

Obiekt typu org.freedesktop.UDisks2.Blockwydaje się być poprawny object-patch, ponieważ /org/freedesktop/UDisks2/prefiks musi zostać wycięty ze ścieżki, aby udisksctl mógł je zaakceptować.

gvfs-mount

Listę dostępnych urządzeń można wykonać za pomocą:

gvfs-mount --list

Montaż można wykonać za pomocą:

gvfs-mount -d /dev/sdf

Odmontowanie jest możliwe poprzez:

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

Pozostającym problemem jest to, że nie mam pojęcia, jak użyć danych gvfs-mount --listwyjściowych w poleceniu mount, ponieważ --listnie pokażę nazw urządzeń blokowych, a próba użycia nazw urządzeń drukowanych w mount spowoduje:

Error mounting location: volume doesn't implement mount

Wniosek

Choć obie gvfs-mounti udisksctlbędzie pracować dla zadań, ich interfejs jest niepraktyczne, ponieważ nie dostarczają ludzkiemu statusowi czytelną dysków dostępne tylko nadmiernie gadatliwy informacji wysypisko.

Grumbel
źródło
1
Czy możesz rozszerzyć swoją odpowiedź, w tym jak zamontować ISO gio mount? W dniu 18.04 z gio mount -lpowrotem Archive Mounter, Type: GDaemonMountale nie mogłem go zamontować przez CLI (może problem ?).
Pablo A
6

Proste rozwiązanie, które działa zgodnie z wymaganiami (montuje się w / media / {user} / {diskid}), z tym wyjątkiem, że nie może wyświetlić listy urządzeń, ale musi mieć dokładną, rozróżniającą wielkość liter, etykietę woluminu jako argument $ 1

Aby zamontować :

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

Aby odmontować :

DEVICE=$(findfs LABEL=$1) && udisksctl unmount -b $DEVICE
zvuk
źródło
Miły. Lub po prostu:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust
1

Właśnie wpadłem na problem i znalazłem następujące rozwiązanie:

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

Poprosi o hasło użytkownika, nawet jeśli to ty i jesteś już zalogowany.

komuta
źródło
0

Napisałem ten skrypt Bash, aby obejść ten problem, ale pamiętaj, że jestem początkującym skryptem. Wszystkie sugestie mile widziane! Sposób użycia i opis znajdują się poniżej skryptu.

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

Stosowanie:

  • zapisz skrypt jako umanage.sh
  • uczyń go wykonywalnym: chmod + x umanage.sh
  • uruchom: ./umanage.sh YourDeviceLabel

Skrypt przyjmuje jako argument etykietę partycji, którą chcesz zamontować, i szuka w zrzutu udisksctl odpowiednich wpisów.

Jeśli partycja zostanie znaleziona i nie jest zamontowana, wyświetlana jest nazwa urządzenia i ścieżka, a ty możesz zainstalować partycję. Skrypt wyszukuje również częściowe etykiety i nie przejmuje się dużymi lub małymi literami (przydatne, gdy nie pamiętasz dokładnej etykiety).

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

Jeśli partycja zostanie znaleziona i jest już zamontowana, możesz ją odmontować:

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

Jeśli twój argument pasuje do więcej niż wyniku, skrypt wyświetla pasujące etykiety partycji i prosi o zawężenie wyszukiwania:

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

SSD-9GB
My Passport

Please refine your search.
piksel
źródło
0

Skrypt do zamontowania dysku - mount-menu.sh

mount-menu.shSkrypt pozwala wybrać odmontowanych dysków / partycji do montażu. Aby połączyć się z wykorzystania skryptu: sudo mount-menu.sh. Ten ekran wydaje się być dostosowany do Twojego unikalnego środowiska maszynowego:

mount-menu 1.png

  • Za pomocą klawiszy strzałek wybierz partycję i naciśnij Enter

Menu usuwa i pozostawia te informacje w twoim terminalu:

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

Teraz możesz użyć: cd /mnt/mount-menu.FPRAWaby uzyskać dostęp do partycji dysku zewnętrznego.

Następnie możesz cd home/YOUR_NAMEuważać, aby nie postawić /przed sobą home. Jeśli cd /homego użyjesz , zabierze Cię na dysk rozruchowy i z dysku zewnętrznego.

mount-menu.sh zawartość skryptu

Aby utworzyć skrypt, otwórz terminal i wpisz:

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

Następnie skopiuj poniższy kod i wklej go do gedit. Zapisz plik i wyjdź gedit.

Teraz zaznacz plik jako wykonywalny, używając:

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

Oto skrypt do skopiowania:

#!/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 odmontowywać dyski / partycje

Powtórz tworzenie pliku / wykonaj proces znakowania bitów dla skryptu umount-menu.sh. Ten skrypt odmontowuje tylko dyski / partycje, które zostały zamontowane mount-menu.sh. Ma to samo menu wyboru i kończy się komunikatem:

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

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

Aby wywołać skrypt, użyj: sudo umount-menu.sh

umount-menu.sh skrypt 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
źródło