कमांड लाइन से ऑटो-माउंट कैसे करें?


25

मैं कमांड लाइन से एक ऑटोमाउंट को कैसे ट्रिगर कर सकता हूं? "ऑटोमाउंट" से मेरा मतलब पूरी तरह से स्वचालित माउंटिंग से नहीं है, लेकिन उपलब्ध उपकरणों की एक सूची प्राप्त करना और फिर एक का चयन करना और इसे समाप्त करना है /media/{user}/{diskid}। यह कार्यक्षमता उदाहरण के लिए Nautilus या Thunar द्वारा प्रदान की गई है, लेकिन मुझे इस तरह के अर्ध स्वचालित माउंट को ट्रिगर करने के लिए कमांड लाइन टूल नहीं मिल सकता है।

pmountनिकटतम मैंने पाया है, लेकिन नीचे पूरी तरह से अलग यांत्रिकी द्वारा काम करने लगता है और /media/sdfलाइनों के साथ या कुछ के रूप में उपकरणों को दिखाता है ।

जवाबों:


29

आप उपयोग कर सकते हैं:

udisksctl माउंट -b device_name

जहाँdevice_name एक स्टोरेज डिवाइस का नाम है और उसे कुछ इस तरह देखना चाहिए /dev/sdb1

उपयोग lsblkया sudo fdisk -lकमांड से आप अपने सिस्टम से जुड़ी सभी स्टोरेज डिवाइस का पता लगा सकते हैं।


2
कोशिश की, कि हालांकि /media/{disk}, Thunar या Nautilus क्या देता है से अलग है। हालाँकि, जो udisksctlआदेश दिया गया udisks2है, वह मुझे लगता है कि मुझे क्या चाहिए।
ग्रंबेल सेप 6'13

1
udisksctl statusउपकरणों की एक उचित सूची देगा और उपयोगकर्ता के रूप में काम करेगा। fdisk -lन केवल रूट की आवश्यकता है, यह GPT ड्राइव के साथ भी विफल हो जाएगा। cat /proc/partitionsउपलब्ध विभाजन का एक विचार प्राप्त करने के लिए एक बेहतर निम्न-स्तरीय तरीका होगा।
गमबेल

udiskctlरूट विशेषाधिकारों के बिना लूप उपकरणों में छवि डिस्क फ़ाइलों को माउंट करने के लिए अत्यंत उपयोगी है!

udisk14.04 तक लगता था।
पाब्लो ए

13

gio mount

gvfs को अब पदावनत (2018) के रूप में सूचीबद्ध किया गया है और आपको 'gio' का उपयोग करने की सलाह दी जाती है जो Gnome In Out और Glib के भाग है। विकिपीडिया देखें ।

उदाहरण के लिए, दूसरे ड्राइव विभाजन को ऑटो-माउंट करने के लिए; निम्नलिखित कमांड के साथ स्टार्ट-अप पर चलने के लिए निष्पादन योग्य अनुमति के साथ एक बैश स्क्रिप्ट बनाएं:

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(concatenate to 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माउंट कमांड में आउटपुट का उपयोग कैसे करें , क्योंकि --listब्लॉक डिवाइस के नाम नहीं दिखाएंगे और डिवाइस के नाम का उपयोग करने की कोशिश करने से माउंट में प्रिंट होगा:

Error mounting location: volume doesn't implement mount

निष्कर्ष

दोनों जबकि gvfs-mountऔर udisksctlकार्यों के लिए काम करेंगे, उनकी इंटरफेस के रूप में वे जानकारी डंप वर्बोज़ उपलब्ध डिस्क की मानव पठनीय स्थिति प्रदान नहीं करते हैं, बस एक बेहद अव्यावहारिक है।


1
क्या आप अपने जवाब का विस्तार कर सकते हैं कि कैसे एक आइसो को माउंट करें gio mount? १ On.०४ को आर्काइव मुंडेर gio mount -lवापसी के साथ Type: GDaemonMountलेकिन मैं इसे सीएलआई (शायद एक मुद्दा ?) के माध्यम से माउंट नहीं कर सका ।
पाब्लो ए

6

एक सरल समाधान जो आवश्यकतानुसार काम करता है (mounts / to / media / {user} / {diskid}) सिवाय इसके कि यह उपकरणों को सूचीबद्ध नहीं कर सकता है लेकिन तर्क $ 1 के रूप में सटीक, मामला संवेदनशील, वॉल्यूम लेबल दिए जाने की आवश्यकता है

माउंट करने के लिए :

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

अनमाउंट करने के लिए :

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

अच्छा लगा। या, बस:udisksctl mount -b $(findfs LABEL=<label>)
ब्रेंट फ़ॉस्ट

1

बस इस मुद्दे में खुद भाग गया, और निम्नलिखित समाधान पाया:

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

यह उपयोगकर्ता पासवर्ड के लिए पूछेगा, भले ही यह आप और आप पहले से ही लॉग इन हो।


0

मैंने इस समस्या के आसपास काम करने के लिए यह बैश स्क्रिप्ट लिखी, लेकिन ध्यान रहे कि मैं एक स्क्रिप्टिंग नौसिखिया हूं। सभी सुझावों का स्वागत है! स्क्रिप्ट के नीचे उपयोग और विवरण।

#!/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:। यह स्क्रीन आपके अद्वितीय मशीन वातावरण के अनुरूप दिखाई देती है:

माउंट-मेनू 1. पीएनजी

  • विभाजन और प्रेस का चयन करने के लिए तीर कुंजियों का उपयोग करें 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। यह स्क्रिप्ट केवल उन ड्राइव / विभाजन को अनमाउंट करती है जो इसके द्वारा माउंट किए गए थे 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.