Làm thế nào để tự động gắn kết từ dòng lệnh?


25

Làm thế nào tôi có thể kích hoạt một automount từ dòng lệnh? Với "automount", tôi không có nghĩa là lắp hoàn toàn tự động, nhưng lấy danh sách các thiết bị có sẵn và sau đó chọn một thiết bị và kết thúc là /media/{user}/{diskid}. Chức năng này được cung cấp bởi Nautilus hoặc Thunar chẳng hạn, nhưng tôi dường như không thể tìm thấy một công cụ dòng lệnh để kích hoạt loại gắn kết bán tự động này.

pmountlà gần nhất tôi đã tìm thấy, nhưng dường như hoạt động bởi các cơ chế hoàn toàn khác nhau bên dưới và làm cho các thiết bị hiển thị như /media/sdfhoặc một cái gì đó dọc theo dòng.

Câu trả lời:


29

Bạn có thể dùng:

udisksctl gắn -b DEVICE_NAME

nơidevice_name là tên của một thiết bị lưu trữ và nên giống như thế /dev/sdb1.

Sử dụng lsblkhoặc ra sudo fdisk -llệnh bạn có thể tìm ra tất cả các thiết bị lưu trữ được gắn vào hệ thống của bạn.


2
Đã thử điều đó, tuy nhiên dẫn đến /media/{disk}, khác với những gì Thunar hoặc Nautilus sẽ cung cấp. Các udisksctllệnh được cung cấp bởi udisks2tuy nhiên dường như làm những gì tôi muốn.
Grumbel

1
udisksctl statussẽ đưa ra một danh sách thích hợp của các thiết bị và hoạt động như người dùng. fdisk -lKhông chỉ yêu cầu root, nó cũng sẽ thất bại với các ổ GPT. cat /proc/partitionssẽ là một cách cấp thấp tốt hơn để có được ý tưởng về các phân vùng có sẵn.
Grumbel

udiskctlcũng rất hữu ích để gắn các tệp đĩa hình ảnh vào các thiết bị lặp mà không có quyền root!

Có vẻ udiskcó sẵn cho đến 14.04.
Pablo A

13

gio mount

gvfs hiện được liệt kê là không dùng nữa (2018) và bạn nên sử dụng 'gio' là Gnome In Out và một phần của Glib. Xem Wikipedia .

Ví dụ, để tự động gắn phân vùng ổ đĩa thứ hai; tạo tập lệnh bash với quyền thực thi để chạy khi khởi động bằng lệnh sau:

gio mount -d /dev/sda2

Nếu bạn là chủ sở hữu của phân vùng (xem chown) bạn sẽ không cần sudo.

Để gắn một tệp ISO nằm ở ví dụ trên ~/ISOs:

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

Bạn có thể URL mã hóa đường dẫn bằng Python 3 và realpath(để nối với 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)"

Điều này sẽ gắn kết trên /run/user/$(id -u)/gvfs/.

Như một thay thế gnome-disk-image-mountersẽ moount trên /media/$USER/.

Để ngắt kết nối sử dụng gio mount -u /run/user/$(id -u)/gvfs/archive*(hoặc /media/$USER/, tùy theo cách bạn gắn).

udisksctl

Liệt kê các thiết bị có sẵn:

udisksctl status

Việc lắp đặt được thực hiện thông qua:

udisksctl mount -b /dev/sdf

hoặc là

udisksctl mount -p block_devices/sdf

Việc ngắt kết nối được thực hiện thông qua:

udisksctl unmount -b /dev/sdf

hoặc là

udisksctl unmount -p block_devices/sdf

object-paththể được tìm ra bằng cách làm:

udisksctl dump

Đối tượng của loại org.freedesktop.UDisks2.Blockdường như là hợp lệ vì object-patch, /org/freedesktop/UDisks2/tiền tố phải được cắt từ đường dẫn để udisksctl chấp nhận chúng.

gvfs-mount

Liệt kê các thiết bị có sẵn có thể được thực hiện với:

gvfs-mount --list

Gắn chúng có thể được thực hiện với:

gvfs-mount -d /dev/sdf

Có thể ngắt kết nối thông qua:

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

Một vấn đề còn lại là tôi không biết làm thế nào để sử dụng gvfs-mount --listđầu ra trong lệnh mount, vì --listsẽ không hiển thị tên thiết bị khối và cố gắng sử dụng tên thiết bị mà nó in trong mount sẽ dẫn đến:

Error mounting location: volume doesn't implement mount

Phần kết luận

Mặc dù cả hai gvfs-mountudisksctlsẽ hoạt động cho các tác vụ, giao diện của chúng không thực tế vì chúng không cung cấp trạng thái có thể đọc được của con người đối với các đĩa có sẵn, chỉ là một bãi chứa thông tin quá dài.


1
Bạn có thể mở rộng câu trả lời của mình bao gồm cả cách gắn kết iso gio mountkhông? Vào ngày 18.04 với Lưu trữ của ứng dụng Lưu trữ gio mount -ltrở lại Type: GDaemonMountnhưng tôi không thể gắn kết nó thông qua CLI (có thể là một vấn đề ?).
Pablo A

6

Một giải pháp đơn giản hoạt động theo yêu cầu (gắn kết với / media / {user} / {đĩaid}) ngoại trừ việc nó không thể liệt kê các thiết bị nhưng cần phải được cung cấp nhãn chính xác, phân biệt chữ hoa chữ thường làm đối số $ 1

Để gắn kết :

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

Để ngắt kết nối :

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

Tốt đẹp. Hoặc, chỉ:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust

1

Chỉ cần chạy vào vấn đề bản thân mình, và tìm thấy giải pháp sau đây:

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

Nó sẽ hỏi mật khẩu người dùng, ngay cả khi đó là bạn và bạn đã đăng nhập.


0

Tôi đã viết kịch bản Bash này để khắc phục vấn đề này, nhưng lưu ý rằng tôi là người mới viết kịch bản. Chào mừng tất cả các đề xuất! Cách sử dụng và mô tả theo bên dưới kịch bản.

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

Sử dụng:

  • lưu tập lệnh dưới dạng umanage.sh
  • làm cho nó có thể thực thi được: chmod + x umanage.sh
  • chạy nó: ./umanage.sh YourDeviceLabel

Kịch bản chấp nhận như là một đối số nhãn của phân vùng bạn muốn gắn kết và tìm trong kết xuất udisksctl cho các mục tương ứng.

Nếu một phân vùng được tìm thấy và nó không được gắn kết, tên và đường dẫn của thiết bị sẽ được hiển thị và bạn được cung cấp để gắn kết phân vùng. Tập lệnh cũng tìm kiếm nhãn một phần và nó sẽ không quan tâm đến chữ hoa hoặc chữ thường (hữu ích khi bạn không nhớ nhãn chính xác).

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

Nếu một phân vùng được tìm thấy và nó đã được gắn kết, bạn được cung cấp để ngắt kết nối nó:

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

Nếu đối số của bạn khớp nhiều hơn kết quả, tập lệnh sẽ hiển thị cho bạn nhãn phân vùng phù hợp và yêu cầu bạn tinh chỉnh tìm kiếm:

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

SSD-9GB
My Passport

Please refine your search.

0

Script để gắn ổ đĩa - mount-menu.sh

Các mount-menu.shkịch bản cho phép bạn chọn ổ đĩa chưa lắp ráp / phân vùng để gắn. Để gọi kịch bản sử dụng : sudo mount-menu.sh. Màn hình này xuất hiện phù hợp với môi trường máy độc đáo của bạn:

gắn kết menu 1.png

  • Sử dụng các phím mũi tên để chọn phân vùng và nhấn Enter

Menu xóa và để lại thông tin này trong thiết bị đầu cuối của bạn:

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

Bây giờ bạn có thể sử dụng: cd /mnt/mount-menu.FPRAWđể truy cập vào phân vùng ổ đĩa ngoài của bạn.

Sau đó, bạn có thể sử dụng cd home/YOUR_NAMEchánh niệm không để đặt /trước mặt home. Nếu bạn sử dụng cd /homenó sẽ đưa bạn đến ổ đĩa khởi động và ra khỏi ổ đĩa ngoài.

mount-menu.sh nội dung kịch bản

Để tạo tập lệnh, mở terminal và gõ:

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

Sau đó sao chép mã dưới đây và dán nó vào gedit. Lưu tệp và thoát gedit.

Bây giờ đánh dấu các tập tin là thực thi bằng cách sử dụng:

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

Đây là kịch bản để sao chép:

#!/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 để ngắt kết nối ổ đĩa / phân vùng

Lặp lại quá trình tạo tập tin / thực hiện đánh dấu bit cho tập lệnh umount-menu.sh. Kịch bản này chỉ ngắt kết nối ổ đĩa / phân vùng được gắn kết bởi mount-menu.sh. Nó có cùng menu chọn và hoàn thành với thông báo:

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

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

Để gọi tập lệnh, sử dụng: sudo umount-menu.sh

umount-menu.sh kịch bản 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.