Komut satırından otomatik montaj nasıl yapılır?


25

Bir otomatik sayıyı komut satırından nasıl tetikleyebilirim? "Automount" ile tam otomatik montaj demek istemiyorum, fakat mevcut cihazların bir listesini almak ve bir tanesini seçmek ve bitmek üzere /media/{user}/{diskid}. Bu işlevsellik, örneğin Nautilus veya Thunar tarafından sağlanmıştır, ancak bu tür yarı otomatik montajı tetikleyen bir komut satırı aracı bulamıyorum.

pmountBulduğum en yakın, ancak altındaki tamamen farklı bir mekanik tarafından çalışıyor gibi görünüyor ve aygıtların /media/sdfsatır boyunca veya benzeri bir şeyle görünmesini sağlar .

Yanıtlar:


29

Kullanabilirsiniz:

-b monte udisksctl cihaz_adı

device_namedepolama aygıtının adı nerede ve buna benzer bir şey olmalıdır /dev/sdb1.

lsblkVeya sudo fdisk -lkomutunu kullanarak sisteminize bağlı tüm depolama cihazlarını öğrenebilirsiniz.


2
Bununla birlikte, bunun /media/{disk}Thunar veya Nautilus'un verdiklerinden farklı olmasına yol açtı . Bununla birlikte verilen udisksctlkomut udisks2istediğimi yapıyor gibi görünüyor.
Grumbel

1
udisksctl statusCihazların uygun bir listesini verecek ve kullanıcı olarak çalışacaktır. fdisk -lsadece root gerektirmez aynı zamanda GPT sürücülerinde de başarısız olur. cat /proc/partitionskullanılabilir bölümler hakkında bir fikir edinmek için daha düşük bir seviye olacaktır.
Grumbel

udiskctlGörüntü disk dosyalarını da kök ayrıcalıklarına sahip olmayan döngü aygıtlarına bağlamak için son derece kullanışlıdır!

Görünüşe göre udisk14.04'e kadar mevcuttu.
Pablo A

13

gio mount

gvfs artık kullanımdan kaldırılmış (2018) olarak listelenmiştir ve Gnome In Out ve Glib'in bir parçası olan 'gio' kullanmanız önerilir. Vikipedi'ye bakınız .

Örneğin, ikinci bir sürücü bölümünü otomatik olarak monte etmek için; Aşağıdaki komut ile başlangıçta çalıştırmak için çalıştırılabilir izne sahip bir bash betiği oluşturun:

gio mount -d /dev/sda2

Bölümün sahibiyseniz (bkz. chown) Sudo gerekmez.

Örneğin üzerinde bulunan bir ISO dosyasını bağlamak için ~/ISOs:

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

Sen olabilir URL kodlamak Python 3 ile yolunu ve realpath(hiç BİRLEŞTİR 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)"

Bu dayanacak /run/user/$(id -u)/gvfs/.

Bir alternatif olarak gnome-disk-image-mounterüzerinde kalacaktır /media/$USER/.

Kullanımın bağlantısını kesmek için gio mount -u /run/user/$(id -u)/gvfs/archive*(veya /media/$USER/montaj şeklinize bağlı olarak).

udisksctl

Kullanılabilir cihazları listeleme:

udisksctl status

Montaj şu şekilde yapılır:

udisksctl mount -b /dev/sdf

veya

udisksctl mount -p block_devices/sdf

Çıkarma işlemi şu şekilde yapılır:

udisksctl unmount -b /dev/sdf

veya

udisksctl unmount -p block_devices/sdf

object-pathYaparak dışarı bulunabilir:

udisksctl dump

Türün nesnesi org.freedesktop.UDisks2.Blockgeçerli gibi görünüyor object-patch, /org/freedesktop/UDisks2/önek udisksctl'nin bunları kabul etmesi için yoldan kesilmesi gerekiyor.

gvfs-mount

Mevcut cihazların listesi aşağıdakilerle yapılabilir:

gvfs-mount --list

Bunların montajı ile yapılabilir:

gvfs-mount -d /dev/sdf

Çıkarma işlemi şu şekilde yapılabilir:

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

Kalan bir sorun da, gvfs-mount --listçıktıyı mount komutunda nasıl kullanacağım hakkında hiçbir fikrim yok , çünkü --listblok cihaz adlarını göstermeyecek ve bir mount içinde yazdırdığı cihaz adlarını kullanmaya çalışacaksınız:

Error mounting location: volume doesn't implement mount

Sonuç

Her ikisi de gvfs-mountve udisksctlgörevler için çalışacak olsa da , arayüzleri mevcut disklerin insan tarafından okunabilir durumunu sağlamadığı için pratik değildir, sadece aşırı ayrıntılı bilgi dökümü.


1
Bir iso'yu nasıl monte edeceğinizi de içeren cevabınızı uzatabilir misiniz gio mount? 18.04'te Archive Mounter gio mount -lgeri döndü Type: GDaemonMountama CLI ile bağlayamadım (belki bir sorun ?).
Pablo A,

6

Gerektiği gibi çalışan basit bir çözüm (/ media / {user} / {diskid} 'e bağlanır, ancak cihazları listeleyemez ancak $ 1 argümanı olarak tam, büyük / küçük harfe duyarlı, birim etiketine verilmelidir)

Monte etmek için :

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

Çıkarmak için :

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

Güzel. Veya, sadece:udisksctl mount -b $(findfs LABEL=<label>)
Brent Faust,

1

Sadece sorunu kendim koştum ve aşağıdaki çözümü buldum:

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

Siz ve zaten oturum açtıysanız bile, kullanıcı şifresini ister.


0

Bu soruna geçici bir çözüm bulmak için bu Bash komut dosyasını yazdım, ancak komut dosyası oluşturma acemi olduğumun farkında olun. Tüm önerilerinizi bekliyoruz! Kullanım ve açıklama komut dosyası altında takip edin.

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

Kullanımı:

  • komut dosyasını umanage.sh olarak kaydedin
  • yürütülebilir hale getirin: chmod + x umanage.sh
  • çalıştırın: ./umanage.sh YourDeviceLabel

Betik, takmak istediğiniz bölümün etiketini argüman olarak kabul eder ve ilgili girişler için udisksctl dökümü dosyasına bakar.

Bir bölüm bulunursa ve monte edilmediyse, cihaz adı ve yolu gösterilir ve size bölümü monte etmeniz önerilir. Komut dosyası da kısmi etiketler arar ve büyük veya küçük harflerle ilgilenmez (tam etiketi hatırlamadığınızda kullanışlıdır).

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

Bir bölüm bulunursa ve zaten monte edilmişse, bağlantısını kesmeniz önerilir:

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

Bağımsız değişkeniniz bir sonuçtan daha fazlasıyla eşleşiyorsa, komut dosyası size eşleşen bölüm etiketlerini gösterir ve aramayı daraltmanızı ister:

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

SSD-9GB
My Passport

Please refine your search.

0

Sürücüyü monte etmek için komut dosyası - mount-menu.sh

mount-menu.shScript monte etmek için monte edilmemiş sürücüler / bölümleri seçmenize olanak sağlar. Komut kullanımını aramak için: sudo mount-menu.sh. Bu ekran benzersiz makine ortamınıza göre uyarlanmış olarak görünür:

mount-menu 1.png

  • Bölümü seçmek için ok tuşlarını kullanın ve Enter

Menü bu bilgileri temizler ve terminalinizde bırakır:

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

Artık şunları kullanabilirsiniz: cd /mnt/mount-menu.FPRAWharici sürücünüzün bölümüne erişmek için.

Sonra kullanabilirsiniz cd home/YOUR_NAMEbir koymak değil olmanın dikkatli /önünde home. Kullanmanız durumunda cd /home, önyükleme sürücünüze ve harici sürücüden çıkarmanız gerekir.

mount-menu.sh komut dosyası içeriği

Komut dosyasını oluşturmak için terminali açın ve şunu yazın:

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

Sonra aşağıdaki kodu kopyalayın ve içine yapıştırın gedit. Dosyayı kaydedin ve çıkın gedit.

Şimdi dosyayı aşağıdakileri kullanarak çalıştırılabilir olarak işaretleyin:

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

İşte kopyalanacak komut dosyası:

#!/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 Sürücüleri / Bölümleri Çıkarma

Komut dosyası için dosya oluşturma / yürütme bit işaretleme işlemini tekrarlayın umount-menu.sh. Bu betiğin yalnızca bağladığı sürücüleri / bölümleri kaldırır mount-menu.sh. Aynı seçim menüsüne sahiptir ve şu mesajla tamamlanır:

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

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

Komut dosyasını kullanmak için şunu kullanın: sudo umount-menu.sh

umount-menu.sh bash betiği:

!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.