コマンドラインから自動マウントをトリガーするにはどうすればよいですか? 「自動マウント」とは、完全な自動マウントを意味するものではありませんが、使用可能なデバイスのリストを取得し、1つを選択して/media/{user}/{diskid}
になります。この機能は、たとえばNautilusやThunarによって提供されますが、この種の半自動マウントをトリガーするコマンドラインツールを見つけることはできません。
pmount
は私が見つけた最も近いものですが、下の完全に異なるメカニズムで動作するようで、デバイスを/media/sdf
またはそれに沿ったものとして表示します。
gio mount
gvfsは非推奨(2018)としてリストされており、Gnome In OutおよびGlibの一部である「gio」を使用することをお勧めします。 Wikipedia を参照してください。
たとえば、2番目のドライブパーティションを自動マウントするには、次のコマンドを使用して、起動時に実行する実行許可を持つbashスクリプトを作成します。
gio mount -d /dev/sda2
パーティションの所有者である場合(chown
を参照)、Sudoは必要ありません。
たとえば~/ISOs
にあるISOファイルをマウントするには:
gio mount "archive://file%3A%2F%2F%2Fhome%2Fpablo%2FISOs%2Fubuntu-18.04-desktop-AMD64.iso"
RLエンコード 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
残っている問題の1つは、gvfs-mount --list
がブロックデバイス名を表示せず、マウントで印刷するデバイス名を使用しようとするため、マウントコマンドで--list
出力を使用する方法がわからないことです。結果:
Error mounting location: volume doesn't implement mount
gvfs-mount
とudisksctl
の両方がタスクに対して機能しますが、それらのインターフェイスは、利用可能なディスクの人間が読めるステータスを提供せず、過度に詳細な情報ダンプを提供するため実用的ではありません。
次を使用できます。
udisksctl mount -b 装置名
ここでdevice_name
はストレージデバイスの名前であり、/dev/sdb1
のようになります。
lsblk
またはSudo fdisk -l
コマンドを使用すると、システムに接続されているすべてのストレージデバイスを見つけることができます。
必要に応じて機能するシンプルなソリューション(/ media/{user}/{diskid}にマウント)。ただし、デバイスをリストすることはできませんが、引数$ 1として大文字と小文字を区別する正確なボリュームラベルを指定する必要があります。
マウントするため:
DEVICE=$(findfs LABEL=$1) && udisksctl mount -b $DEVICE
アンマウントするため:
DEVICE=$(findfs LABEL=$1) && udisksctl unmount -b $DEVICE
自分で問題に遭遇したところ、次の解決策が見つかりました。
udisksctl mount -b /dev/disk/by-labels/$LABEL
ユーザーであり、すでにログインしている場合でも、ユーザーのパスワードを要求します。
mount-menu.sh
mount-menu.sh
スクリプトを使用すると、マウントするマウントされていないドライブ/パーティションを選択できます。スクリプトを呼び出すには、Sudo mount-menu.sh
を使用します。この画面は、独自のマシン環境に合わせて表示されます。
メニューはこの情報を消去し、ターミナルに残します。
=====================================================================
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
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
この問題を回避するためにこの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
使用法:
スクリプトは、マウントするパーティションのラベルを引数として受け入れ、対応するエントリについて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.