Bagaimana cara me-mount dari baris perintah?


25

Bagaimana saya bisa memicu automount dari baris perintah? Dengan "automount" yang saya maksud bukan pemasangan otomatis sepenuhnya, tetapi mendapatkan daftar perangkat yang tersedia dan kemudian memilih satu dan menjadikannya sebagai /media/{user}/{diskid}. Fungsionalitas ini disediakan oleh Nautilus atau Thunar misalnya, tetapi sepertinya saya tidak dapat menemukan alat baris perintah untuk memicu jenis pemasangan semi otomatis ini.

pmountadalah yang terdekat yang saya temukan, tetapi tampaknya bekerja dengan mekanik yang sama sekali berbeda di bawahnya dan membuat perangkat muncul sebagai /media/sdfatau sesuatu di sepanjang garis.

Jawaban:


29

Anda dapat gunakan:

udisksctl mount -b device_name

di manadevice_name nama perangkat penyimpanan dan harus terlihat seperti /dev/sdb1.

Menggunakan lsblkatau sudo fdisk -lmemerintahkan Anda dapat mengetahui semua perangkat penyimpanan yang terpasang pada sistem Anda.


2
Mencoba itu, yang bagaimanapun mengarah /media/{disk}, berbeda dari apa yang akan diberikan Thunar atau Nautilus. Namun, udisksctlperintah yang diberikan udisks2tampaknya melakukan apa yang saya inginkan.
Grumbel

1
udisksctl statusakan memberikan daftar perangkat yang tepat dan berfungsi sebagai pengguna. fdisk -ltidak hanya membutuhkan root, itu juga akan gagal dengan drive GPT. cat /proc/partitionsakan menjadi cara tingkat rendah yang lebih baik untuk mendapatkan gagasan tentang partisi yang tersedia.
Grumbel

udiskctljuga sangat berguna untuk memasang file disk gambar ke perangkat loop tanpa hak root!

Tampaknya udisktersedia hingga 14,04.
Pablo A

13

gio mount

gvfs sekarang terdaftar sebagai usang (2018) dan Anda disarankan untuk menggunakan 'gio' yang merupakan Gnome In Out dan bagian dari Glib. Lihat Wikipedia .

Misalnya, untuk memasang otomatis partisi drive kedua; buat skrip bash dengan izin yang dapat dieksekusi untuk dijalankan saat start-up dengan perintah berikut:

gio mount -d /dev/sda2

Jika Anda adalah pemilik partisi (lihat chown), Anda tidak perlu sudo.

Untuk memasang file ISO yang berlokasi misalnya pada ~/ISOs:

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

Anda bisa URL menyandikan lintasan dengan Python 3 dan realpath(untuk menyambung ke 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)"

Ini akan dipasang /run/user/$(id -u)/gvfs/.

Sebagai alternatif, gnome-disk-image-mountermoount on /media/$USER/.

Untuk menghapus penggunaan gio mount -u /run/user/$(id -u)/gvfs/archive*(atau /media/$USER/, tergantung cara Anda memasang).

udisksctl

Daftar perangkat yang tersedia:

udisksctl status

Pemasangan dilakukan melalui:

udisksctl mount -b /dev/sdf

atau

udisksctl mount -p block_devices/sdf

Penghapusan dilakukan melalui:

udisksctl unmount -b /dev/sdf

atau

udisksctl unmount -p block_devices/sdf

The object-pathdapat ditemukan dengan melakukan:

udisksctl dump

Objek tipe org.freedesktop.UDisks2.Blocktampaknya valid karena object-patch, /org/freedesktop/UDisks2/awalan harus dipotong dari jalur agar udisksctl menerimanya.

gvfs-mount

Daftar perangkat yang tersedia dapat dilakukan dengan:

gvfs-mount --list

Pemasangan mereka dapat dilakukan dengan:

gvfs-mount -d /dev/sdf

Melepas akun dimungkinkan melalui:

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

Satu masalah yang tersisa adalah bahwa saya tidak tahu bagaimana menggunakan gvfs-mount --listoutput dalam perintah mount, karena --listtidak akan menampilkan nama perangkat blok dan mencoba menggunakan nama perangkat yang dicetaknya di mount akan menghasilkan:

Error mounting location: volume doesn't implement mount

Kesimpulan

Walaupun keduanya gvfs-mountdan udisksctlakan bekerja untuk tugas-tugas tersebut, antarmuka mereka tidak praktis karena tidak memberikan status yang dapat dibaca manusia dari disk yang tersedia, hanya info dump yang terlalu banyak.


1
Bisakah Anda memperluas jawaban Anda termasuk cara memasang iso gio mount? Pada 18.04 dengan Archive Mounter gio mount -lkembali Type: GDaemonMounttetapi saya tidak bisa me-mount melalui CLI (mungkin masalah ?).
Pablo A

6

Sebuah solusi sederhana yang berfungsi seperti yang diminta (mounts ke / media / {user} / {diskid}) kecuali ia tidak dapat mencantumkan perangkat tetapi perlu diberi label volume yang tepat, peka huruf besar kecil, sebagai argumen $ 1

Untuk memasang :

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

Untuk melepas :

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

Bagus. Atau, cukup:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust

1

Hanya mengalami masalah sendiri, dan menemukan solusi berikut:

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

Itu akan meminta kata sandi pengguna, bahkan jika itu Anda dan Anda sudah masuk.


0

Saya menulis skrip Bash ini untuk mengatasi masalah ini, tetapi ketahuilah bahwa saya seorang pemula skrip. Semua saran diterima! Penggunaan dan deskripsi ikuti di bawah ini skrip.

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

Pemakaian:

  • simpan skrip sebagai umanage.sh
  • membuatnya dapat dieksekusi: chmod + x umanage.sh
  • jalankan: ./umanage.sh YourDeviceLabel Anda

Skrip menerima sebagai argumen label partisi yang ingin Anda mount dan terlihat di dump udisksctl untuk entri yang sesuai.

Jika partisi ditemukan dan tidak dipasang, nama dan jalur perangkat ditampilkan dan Anda ditawari untuk memasang partisi. Script mencari label parsial juga, dan tidak akan peduli dengan huruf besar atau kecil (berguna ketika Anda tidak ingat label yang tepat).

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

Jika sebuah partisi ditemukan dan sudah di-mount, Anda ditawarkan untuk meng-unmount-nya:

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

Jika argumen Anda cocok dengan lebih dari hasil, skrip menunjukkan label partisi yang cocok dan meminta Anda untuk mempersempit pencarian:

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

SSD-9GB
My Passport

Please refine your search.

0

Script untuk memasang drive - mount-menu.sh

The mount-menu.shScript memungkinkan Anda untuk memilih unmount drive / partisi untuk pemasangan. Untuk memanggil penggunaan skrip: sudo mount-menu.sh. Layar ini muncul disesuaikan dengan lingkungan mesin unik Anda:

mount-menu 1.png

  • Gunakan tombol panah untuk memilih partisi dan tekan Enter

Menu ini membersihkan dan meninggalkan informasi ini di terminal Anda:

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

Sekarang Anda dapat menggunakan: cd /mnt/mount-menu.FPRAWuntuk mengakses partisi drive eksternal Anda.

Maka Anda dapat menggunakan cd home/YOUR_NAMEkesadaran untuk tidak menempatkan /di depan home. Jika Anda menggunakannya cd /homeakan membawa Anda ke drive boot dan keluar dari drive eksternal.

mount-menu.sh isi skrip

Untuk membuat skrip, buka terminal dan ketik:

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

Kemudian salin kode di bawah ini dan tempel ke gedit. Simpan file dan keluar gedit.

Sekarang tandai file tersebut sebagai executable menggunakan:

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

Berikut skrip yang akan disalin:

#!/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 untuk Melepas Drive / Partisi

Ulangi pembuatan file / eksekusi proses penandaan bit untuk skrip umount-menu.sh. Script ini hanya meng-unmount drive / partisi yang dipasang olehmount-menu.sh . Ini memiliki menu pilihan yang sama dan dilengkapi dengan pesan:

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

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

Untuk memanggil skrip gunakan: sudo umount-menu.sh

umount-menu.sh skrip 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.