如何像 Nautilus 那样从命令行挂载? [关闭]

Posted

技术标签:

【中文标题】如何像 Nautilus 那样从命令行挂载? [关闭]【英文标题】:How to mount from command line like the Nautilus does? [closed] 【发布时间】:2010-10-03 18:20:54 【问题描述】:

在我的 Ubuntu linux 机器上,我可以通过单击桌面上的设备图标轻松安装 USB 连接的驱动器或 CDROM。

例如,如果我单击 USB 连接驱动器图标,则会发生以下情况:

会自动创建 /media/LABEL 目录(其中 LABEL 是磁盘的标签,可能因磁盘而异) 设备上的文件系统安装在 /media/LABEL 上

此过程与使用mount 命令进行挂载有很大不同。特别是:

你不需要是root(或者你不需要修改/etc/fstab来允许普通用户挂载设备) 自动创建 /media/LABEL 目录 目录名称根据卷标而变化。

有一个命令行命令的行为类似于 Gnome GUI 安装工具吗?

【问题讨论】:

我决定在启动时使用/etc/fstab 来挂载我的磁盘,这可能不是您想要的,但是当 SO 线程被锁定并且所有选项似乎都不起作用时,它可以可靠地工作。 【参考方案1】:

有关使用信息,请参阅pmount 命令

【讨论】:

pmount 没有 nautilus 的几个功能。 1) nautilus 列出可用的驱动器。当我按下制表符时,pmount 没有列出我的 Windows 分区。如果可以,我怀疑它会将其列为“Windows7_OS”,但这并不重要。 2)当我安装某些东西时,我必须为安装点创建一个目录。鹦鹉螺会自动完成。 nautilus好像有自己的挂载数据库,有没有办法访问呢? pmount 使用 HAL,它正在折旧,所以我建议查看下面@mwx 的帖子 @kirill_igum "当我按下 tab 时 pmount 没有列出我的 windows 分区" 微笑你是一个有趣的人。是的,我想你可以通过编写自己的 bash-expand 规则函数 来做到这一点。我猜你想要的是udisks,请看下面的另一个答案。 pmount 不适用于不可移动设备 :(【参考方案2】:

我不相信 Gnome 本身会处理安装 - 它是 HAL。因此,如果 HAL 正在运行,您应该能够自动挂载。我假设pmount 以某种方式与 HAL 对话,这将是处理卸载的方法。我希望这至少能让你开始。

【讨论】:

这里有 gnome nautilus 坐骑 /run/user/1000/gvfs/smb-share/path-to-mount/ 对于现有的安装,如下run/user/1000/gvfs/smb-share:server=192.168.1.100,share=share-name/path-to-folder/【参考方案3】:

是的,有。它被称为 ivman 并处理所有 HAL 事件。我在运行ion3 时启动它。我只是将ivman 作为守护进程启动,但已将该程序添加到我的 sudoers 文件中:

cat /etc/sudoers
[...]
ivman hostname=(root) NOPASSWD: /sbin/init, /usr/sbin/hibernate
[...]

这样它也可以管理电源设置。

【讨论】:

【参考方案4】:

您也可以使用 gnome-mount 从命令行挂载/卸载。

【讨论】:

【参考方案5】:

我插入我的 USB 设备,输入“gnome-volume-manager”,这似乎符合您的要求。

【讨论】:

【参考方案6】:

那将是“devkit-disks --mount /dev/sdxx”,其中xx 是要挂载的分区的字母和编号...

【讨论】:

【参考方案7】:

您正在寻找的是gio mount(它最近替换了gvfs-mount,它替换了gnome-mount)。

有一个man page here 或者您可以输入gio help mount 了解详细信息

基本用法是:

gio mount --list --detail 获取已挂载和可挂载卷的列表

gio mount [-u] <volume> [un] 挂载它,例如gio mount smb://server/sharegio mount WINDOWS

遗憾的是,似乎存在一个错误,导致尝试按卷名安装时出现“错误安装位置:卷未实现安装”消息,但 gvfs-mount -d /dev/<devicename> 可能有效。

【讨论】:

在 Oneiric 和 Natty gvfs-mount smb://server/share 上似乎开箱即用。您可能需要确保已安装 gvfs-fuse。 gvfs-mount also requires DBus. 我是如何安装相机的:gio mount --list --detail 有一条类似activation_root=gphoto2://Name_of_Company_Model_Name_SomeNumbers 的行,然后我做了gio mount gphoto2://Name_of_Company_Model_Name_SomeNumbers。现在我可以在"/run/home/$UID/gvfs/gphoto2:host=Name_of_Company_Model_Name_SomeNumbers/DCIM" 中看到我的相机文件(由于ghoto2:host= 需要引号),其中$UID 可能是1000【参考方案8】:

在现代发行版中,不再使用 HAL。 pmount 仍然存在,但已弃用。使用:

udisks --mount /dev/sdXN

答案更新:

udisksctl 命令被用作udisks 命令的替代。这可以同样的方式使用,-b 只是被附加来定义块设备。

udisksctl mount -b /dev/sdXN

【讨论】:

我还发现 udisksctl(同一系统的一部分)快速有效。即:udisksctl mount -b /dev/sdb 附注我在这里用 udisks 制作了一个 python 脚本:***.com/a/22454071/493272 你现在是男人了,狗! 我什至不记得我要找多久了...谢谢!【参考方案9】:

我有一个脚本可以做你想做的事。

#!/bin/bash
#====================================================================
# udmount.sh - mounts partitons by volume label.
#  usage: udmount.sh <label> [rw|ro|u]
#   rw - mount read-only (default) 
#   rw - mount read-write 
#   u  - unmount
# 
# Mounts on /media/<label>. Tested on Mint 13 and Fedora 19.
# Use and/or modify at your own risk. Your mileage may vary.
# Caveats:
#   * No spaces in volume label. Won't work.
#   * If the mount point (/media/<label>) already exists,
#     (usually from an unclean shutdown), udmount will mount
#     the volume on /media/<label>_  
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You can view the GNU General Public License for this program at
# http://www.gnu.org/licenses/gpl.txt
# Copyright 2013 maxdev137@sbcglobal.net
#====================================================================

BEEP=$'\a'
VLABEL="$1"     # volume label
MPOINT="/media" # default mount point for gnome-mount/udisks
YN=""           # yes/no string

c_red()  echo -n $(tput setaf 1)$1$(tput sgr0) ; 
c_grn()  echo -n $(tput setaf 2)$1$(tput sgr0) ; 
c_yel()  echo -n $(tput setaf 3)$1$(tput sgr0) ; 
c_blu()  echo -n $(tput setaf 4)$1$(tput sgr0) ; 
c_pur()  echo -n $(tput setaf 5)$1$(tput sgr0) ; 
c_aqu()  echo -n $(tput setaf 6)$1$(tput sgr0) ; 
c_wht()  echo -n $(tput setaf 7)$1$(tput sgr0) ; 

Y="YEP " ; Y_c=$(c_grn "$Y")
N="NOPE" ; N_c=$(c_red "$N")
SNAME=`echo "$0" | sed -e 's|.*/\(.*\)$|\1|'`

#--------------------------------------------------
AMV_LABEL=""    # already mounted volume label
MMSG=""         # "is mounted on" msg
AMF=0           # already mounted flag
AMV=""          # already mounted volume (from "mount -l")
AMV_DETAILS=""  # already mounted volume details
AMV_HELPER=""   # "uhelper" subsystem for mount/unmount ("hal" or "udisks")
COPT="$2"       # command line option
MOPT="ro"       # user input for mount option
UOPT="ro"       # udisk mount options

#--------------------------------------------------
_usage ()       echo "usage: $SNAME LABEL [rw|ro|u]" ; 
_error()        echo "!!! Error: $1. !!!" >&2 ; echo -n "$BEEP"; _usage ; exit 1 ; 
_error_parm()   _error "$2 Parameter Missing [$1]" ; 
_error_parm2()  _error "Command is wrong (only \"rw, ro, or u\") is alowed, not \"$1\"" ; 

_unmount () 
  ### unmount ###
  if [ "$COPT" = "u" ] ; then
    MPOINT=`echo "$AMV" | grep "\[$VLABEL\]" |sed -e 's|^.* \(/.*\) type.*$|\1|'`
    #echo "unmount MPOINT = [$MPOINT]"
    if [ -z "$MPOINT" ] ; then
      echo "$N_c - $VLABEL not mounted."
    else
      _MSG=`umount "$MPOINT" 2>&1`
      _STATUS=$?
      if [ "$_STATUS" -eq 0 ] ; then
        echo "$Y_c - \"$MPOINT\" is now unmounted"
      else echo "$N_c - unmount \"$MPOINT\" failed ($_MSG)"
      fi
    fi
  fi


#--------------------------------------------------
[ -n "$VLABEL" ]  || _error_parm "$VLABEL" "Volume Label"

### command line option checck
case "$COPT" in
  "ro" ) ;;
  "rw" ) ;;
  "u"  ) ;;
     * ) _error_parm2 "$COPT" ;;
esac

### is VLABEL already mounted?
AMV=$(mount -l | grep "\[$VLABEL\]")
AMF=$?

### VLABEL is mounted somewhere
if  [ $AMF -eq 0 ] ; then
  AMV_LABEL=$(echo "$AMV" | sed 's/^.* \[\(.*\)\]$/\1/')
  AMV_DETAILS=$(echo $AMV | sed 's|^.*on \(.*\) \[.*$|on \"\1\"|')
  AMV_UHELPER=$(echo $AMV | grep uhelper | sed 's/^.*uhelper=\(.*\)).*$/\1/')
  #echo "AMV = [$AMV]"
  #echo "AMV_LABEL = [$AMV_LABEL]"
  #echo "AMV_DETAILS = [$AMV_DETAILS]"
  #echo "AMV_UHELPER = [$AMV_UHELPER]"

  ### unmount ###
  [ "$COPT" = "u" ] && _unmount && exit $?

  ### mounted on MPOINT (usually /media)
  if [ -d "$MPOINT/$VLABEL" ] ; then
    MOPT="ro" ; YN="$N_c"
    [ -w "$MPOINT/$VLABEL" ] && MOPT="rw"
    [ "$MOPT" = "$COPT" ]     && YN="$Y_c"
  ### mounted somewhere else
  else
    MOPT=$(echo "$AMV_DETAILS" | sed 's/^.*(\(.*\)).*$/\1/')
  fi
  echo "$N_c - $VLABEL is already mounted \"$MOPT\" $AMV_DETAILS"

### $VLABEL is not mounted anywhere, decide on "rw" or "ro"
else
  if [ "$COPT" = "u" ] ; then
    echo "$N_c - \"$VLABEL\" is not mounted"
  else
    MOPT="ro"
    [ "$COPT" = "rw" ] && MOPT="rw"
    echo "udisks --mount /dev/disk/by-label/$VLABEL $UOPT"
    udisks --mount /dev/disk/by-label/"$VLABEL" --mount-options "$MOPT"
    _STATUS=$?
    [ $_STATUS -eq 0 ] && echo "$Y_c - $MPOINT/$VLABEL mounted ($MOPT)"
    [ $_STATUS -ne 0 ] && echo "$N_c - \"$VLABEL\""
  fi
fi
#====================================================================

【讨论】:

以上是关于如何像 Nautilus 那样从命令行挂载? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu下怎样显示已经git了的文件呢,像windows有打勾那样的

fedora 中从命令行中直接打开资源管理器

新手怎么用ubuntu终端打开文件夹

为啥在 C++ 方法中使用 system("some.exe") 不像命令行那样工作?

如何在 Pig 中使用 MapReduce Native 传递命令行参数

linux 垃圾箱是哪个文件??