วิธีการเมาท์อัตโนมัติจากบรรทัดคำสั่ง?


25

ฉันจะทริกเกอร์ automount จากบรรทัดคำสั่งได้อย่างไร โดย "automount" ผมไม่ได้หมายถึงการติดตั้งโดยอัตโนมัติอย่างเต็มที่ /media/{user}/{diskid}แต่ได้รับรายชื่อของอุปกรณ์ที่มีอยู่แล้วการเลือกหนึ่งและมีมันจบลงเช่น ตัวอย่างเช่นฟังก์ชั่นนี้มีให้โดย Nautilus หรือ Thunar แต่ดูเหมือนว่าฉันจะไม่พบเครื่องมือบรรทัดคำสั่งเพื่อทริกเกอร์การเมาท์กึ่งอัตโนมัติชนิดนี้

pmountเป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันได้พบ แต่ดูเหมือนว่าจะทำงานโดยกลไกที่แตกต่างกันโดยสิ้นเชิงภายใต้และทำให้อุปกรณ์แสดงเป็น/media/sdfหรือบางสิ่งบางอย่างตามแนว

คำตอบ:


29

คุณสามารถใช้ได้:

udisksctl mount -b device_name

ที่device_name/dev/sdb1เป็นชื่อของอุปกรณ์จัดเก็บข้อมูลและควรมีลักษณะดังนี้

การใช้lsblkหรือsudo fdisk -lคำสั่งคุณสามารถค้นหาอุปกรณ์เก็บข้อมูลทั้งหมดที่ต่ออยู่กับระบบของคุณ


2
พยายามที่จะนำไปสู่อย่างไรก็ตาม/media/{disk}แตกต่างจากสิ่งที่ Thunar หรือ Nautilus จะให้ udisksctlคำสั่งให้โดยudisks2แต่ดูเหมือนว่าจะทำสิ่งที่ฉันต้องการ
Grumbel

1
udisksctl statusจะให้รายการอุปกรณ์ที่เหมาะสมและทำงานในฐานะผู้ใช้ fdisk -lไม่เพียง แต่ต้องการรูทเท่านั้น แต่ยังจะล้มเหลวด้วยไดรฟ์ GPT cat /proc/partitionsจะเป็นวิธีระดับต่ำที่ดีกว่าเพื่อให้ได้แนวคิดของพาร์ติชันที่พร้อมใช้งาน
Grumbel

udiskctlมีประโยชน์อย่างยิ่งสำหรับการติดตั้งไฟล์ดิสก์อิมเมจลงในอุปกรณ์ลูปโดยไม่มีสิทธิ์รูทเช่นกัน!

ดูเหมือนว่าudiskจะใช้ได้จนถึง 14.04
ปาโบล A

13

gio mount

ตอนนี้gvfsมีสถานะเป็นเลิกใช้แล้ว (2018) และคุณควรใช้ 'gio' ซึ่งเป็น Gnome In Out และเป็นส่วนหนึ่งของ Glib ดูวิกิพีเดีย

ตัวอย่างเช่นหากต้องการเมาต์พาร์ติชันไดรฟ์ตัวที่สองโดยอัตโนมัติ สร้าง bash script ด้วยสิทธิ์การใช้งานเพื่อเรียกใช้เมื่อเริ่มต้นระบบด้วยคำสั่งต่อไปนี้:

gio mount -d /dev/sda2

หากคุณเป็นเจ้าของพาร์ติชัน (ดูchown) คุณไม่จำเป็นต้องใช้ sudo

ในการเมานต์ไฟล์ ISO ที่อยู่ตัวอย่างเช่น~/ISOs:

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

คุณสามารถURL เข้ารหัสเส้นทางด้วย Python 3 และrealpath(เพื่อเชื่อมต่อกับ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)"

นี้จะเมาน/run/user/$(id -u)/gvfs/ต์

ในฐานะที่เป็นทางเลือกที่gnome-disk-image-mounterจะเพิ่ม/media/$USER/จำนวน

หากต้องการยกเลิกการต่อเชื่อมการใช้งานgio mount -u /run/user/$(id -u)/gvfs/archive*(หรือ/media/$USER/ขึ้นอยู่กับวิธีการติดตั้ง)

udisksctl

รายการอุปกรณ์ที่ใช้ได้:

udisksctl status

การติดตั้งทำได้ผ่าน:

udisksctl mount -b /dev/sdf

หรือ

udisksctl mount -p block_devices/sdf

การถอนติดตั้งเสร็จแล้วผ่าน:

udisksctl unmount -b /dev/sdf

หรือ

udisksctl unmount -p block_devices/sdf

object-pathสามารถพบได้โดยการทำ:

udisksctl dump

วัตถุประเภทorg.freedesktop.UDisks2.Blockดูเหมือนจะเป็นที่ถูกต้องเป็นobject-patchที่/org/freedesktop/UDisks2/คำนำหน้าจะต้องมีการตัดออกจากเส้นทางสำหรับ udisksctl จะยอมรับพวกเขา

gvfs-mount

รายการอุปกรณ์ที่มีอยู่สามารถทำได้ด้วย:

gvfs-mount --list

การติดตั้งสามารถทำได้ด้วย:

gvfs-mount -d /dev/sdf

การถอนติดตั้งสามารถทำได้ผ่าน:

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

ปัญหาที่เหลืออยู่อย่างหนึ่งคือฉันไม่รู้ว่าจะใช้gvfs-mount --listเอาต์พุตในคำสั่ง mount อย่างไรเนื่องจาก--listจะไม่แสดงชื่ออุปกรณ์บล็อกและพยายามใช้ชื่ออุปกรณ์ที่พิมพ์ในการเมาท์จะส่งผลให้:

Error mounting location: volume doesn't implement mount

ข้อสรุป

ในขณะที่ทั้งสองgvfs-mountและudisksctlจะทำงานให้กับงานอินเทอร์เฟซของพวกเขาจะทำไม่ได้เพราะพวกเขาไม่ได้ให้สถานะมนุษย์อ่านดิสก์ที่มีอยู่เพียงแค่การถ่ายโอนข้อมูลข้อมูล verbose มากเกินไป


1
คุณช่วยขยายคำตอบของคุณรวมถึงวิธีการติดตั้ง iso ด้วยได้gio mountไหม? ในวันที่ 18.04 ที่มีการเก็บถาวร Mounter gio mount -lกลับมาType: GDaemonMountแต่ฉันไม่สามารถเมาได้ผ่าน CLI (อาจมีปัญหาหรือไม่)
ปาโบล

6

วิธีแก้ปัญหาอย่างง่ายที่ทำงานตามที่ต้องการ (เมานต์ / สื่อ / {ผู้ใช้} / {diskid}) ยกเว้นว่าไม่สามารถแสดงรายการอุปกรณ์ได้ แต่ต้องได้รับป้ายกำกับปริมาณที่แน่นอนและตรงตามตัวพิมพ์เป็นอาร์กิวเมนต์ $ 1

วิธีเมานท์ :

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

ในการเลิกเมานท์ :

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

ดี หรือเพียง:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust

1

เพิ่งพบปัญหาด้วยตนเองและพบวิธีแก้ไขปัญหาต่อไปนี้:

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

มันจะขอรหัสผ่านผู้ใช้แม้ว่าคุณและคุณจะได้เข้าสู่ระบบแล้ว


0

ฉันเขียนสคริปต์ Bash นี้เพื่อแก้ไขปัญหานี้ แต่ระวังว่าฉันเป็นมือใหม่ที่เขียนสคริปต์ ยินดีต้อนรับคำแนะนำทั้งหมด! การใช้งานและคำอธิบายด้านล่างสคริปต์

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

การใช้งาน:

  • บันทึกสคริปต์เป็น umanage.sh
  • ทำให้สามารถเรียกทำงานได้: chmod + x umanage.sh
  • เรียกใช้มัน: ./umanage.sh YourDeviceLabel

สคริปต์ยอมรับเป็นอาร์กิวเมนต์ฉลากของพาร์ติชันที่คุณต้องการติดตั้งและดูในการถ่ายโอนข้อมูล udisksctl สำหรับรายการที่สอดคล้องกัน

หากพบพาร์ติชัน แต่ไม่ได้เมาต์ชื่ออุปกรณ์และพา ธ จะปรากฏขึ้นและคุณจะเสนอให้เมาต์พาร์ติชัน สคริปต์จะค้นหาป้ายกำกับบางส่วนด้วยและจะไม่สนใจตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก (มีประโยชน์เมื่อคุณไม่จำป้ายกำกับที่แน่นอน)

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

หากพบพาร์ติชันและติดตั้งแล้วคุณจะถูกเสนอให้ถอนติดตั้ง:

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

หากอาร์กิวเมนต์ของคุณตรงกับผลลัพธ์สคริปต์จะแสดงป้ายพาร์ติชันที่ตรงกันและขอให้คุณปรับแต่งการค้นหา:

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

SSD-9GB
My Passport

Please refine your search.

0

สคริปต์เพื่อเมานต์ไดรฟ์ - mount-menu.sh

mount-menu.shสคริปต์ช่วยให้คุณเลือกไดรฟ์เดินเท้า / พาร์ทิชันสำหรับการติดตั้ง sudo mount-menu.shเมื่อต้องการเรียกใช้สคริปต์: หน้าจอนี้ปรับให้เหมาะกับสภาพแวดล้อมของเครื่องที่ไม่ซ้ำใคร:

mount-menu 1.png

  • ใช้ปุ่มลูกศรเพื่อเลือกพาร์ติชั่นแล้วกด Enter

เมนูจะล้างและเก็บข้อมูลนี้ไว้ในเครื่องของคุณ:

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

ตอนนี้คุณสามารถใช้: cd /mnt/mount-menu.FPRAWเพื่อเข้าถึงพาร์ติชันไดรฟ์ภายนอกของคุณ

แล้วคุณสามารถใช้cd home/YOUR_NAMEมีสติไม่ได้ที่จะใส่ในด้านหน้าของ/ homeหากคุณใช้cd /homeมันจะพาคุณไปยังไดรฟ์สำหรับบูตและนอกไดรฟ์ภายนอก

mount-menu.sh เนื้อหาของสคริปต์

วิธีสร้างสคริปต์เปิดเทอร์มินัลแล้วพิมพ์:

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

geditจากนั้นคัดลอกโค้ดด้านล่างและวางมันลงไป geditบันทึกไฟล์และทางออก

ตอนนี้ทำเครื่องหมายไฟล์เป็นปฏิบัติการโดยใช้:

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

นี่คือสคริปต์ที่จะคัดลอก:

#!/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 การถอนติดตั้งไดรฟ์ / พาร์ติชั่น

ทำซ้ำการสร้างไฟล์ / umount-menu.shดำเนินการขั้นตอนการทำเครื่องหมายบิตสำหรับสคริปต์ สคริปต์นี้ unmounts ไดรฟ์ / พาร์ติชันที่เมาท์ด้วยmount-menu.shเท่านั้น มันมีเมนูการเลือกเดียวกันและเสร็จสิ้นด้วยข้อความ:

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

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

วิธีเรียกใช้สคริปต์: sudo umount-menu.sh

umount-menu.sh สคริปต์ทุบตี:

!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.