如何在没有root许可的情况下挂载映像文件?


41

我可以在没有root许可的情况下挂载文件系统映像吗?通常我会这样做:

mount -o loop DISK_IMAGE FOLDER

在不使用sudo或将suid设置为的情况下mount,有什么合适的方法吗?

我知道我可以使用fusermount某些ISO映像,但这是非常有限的,即使对于ISO映像,我的某些映像也无法挂载,但mount始终有效。


1
如果您的mount二进制文件不需要SUID权限,那么您应该可以使用fakeroot而不会出现问题。
sakisk 2012年

5
@faif fakeroot不会在这里提供帮助:它假装文件所有权有所不同,但是它无法为您提供您没有的权限,例如mount(2)在您不是root用户时调用。
吉尔斯(Gilles)'所以别再邪恶了'

@faif Mount 绝对需要root权限。否则潜在的后果将是灾难性的。
沙杜尔

Answers:


25

您无法安装管理员未以某种方式授予您安装权限的任何内容。只有root可以调用mount系统调用。这样做的原因是,有许多方法可以通过挂载来升级特权,例如在系统位置上挂载某些东西,使文件看起来似乎属于另一个用户以及利用依赖于文件所有权的程序,创建setuid文件或利用bug。在文件系统驱动程序中。

mount命令是setuid root。但是它只允许您装入提到的内容fstab

fusermount命令是setuid root。它仅允许您通过FUSE驱动程序挂载东西,并限制您以这种方式为文件提供任意所有权或权限的能力(在大多数设置下,FUSE挂载上的所有文件都属于您)。

最好的选择是找到一个能够读取磁盘映像的FUSE文件系统。对于ISO 9660映像,请同时尝试fuseisoUMfuse的ISO 9660支持(在Debian下作为fuseiso9660软件包提供)。


+1解释sudo(尽管它设置了SUID位)仅允许一个人挂载fstab条目。由此可见,(a)SUID位是有意义的,因为普通用户可以装入fstab条目(并允许执行mount系统调用),并且(b)mount实用程序的限制是仅允许fstab非用户装入条目。超级用户。
大卫,

如果您使用的是软盘映像,则还可以使用mtools将数据写入映像。参见:stackoverflow.com/questions/11202706/…–
吉尔斯·巴斯盖特

@David,现在改变了吗?我仅有的条目fstab用于rootfs和启动。要安装USB驱动器我看lsblkmount相应。我这样做没有问题。
sherrellbc

16

Debian的维基表明这样做的几种方法。这是一种方法。(这需要udisks2包装。)

第一

$ udisksctl loop-setup -f $PATH_TO_IMAGE
Mapped file $PATH_TO_IMAGE as /dev/loop0.

/dev/loop0 将用于以下。

但是,如果udisksctl loop-setup命令返回了/dev/loop1,则将 /dev/loop1用于以下操作。

如果未自动安装回送设备(先前创建的),则可能需要运行:

$ udisksctl mount -b /dev/loop0
Mounted /dev/loop0 at /media/$USER/$IMAGE_NAME

您可以查看磁盘上的文件

$ ls -l /media/$USER/$IMAGE_NAME/

完成后即可卸载

$ udisksctl unmount -b /dev/loop0
Unmounted /dev/loop0.

并在必要时:

$ udisksctl loop-delete -b /dev/loop0

1
udevil是更方便的选择
Anwar

它可以在Ubuntu 16.04上运行,但是如何?似乎使用了我期望sudo只有的循环设备。setid或相关的恶作剧
Ciro Santilli新疆改造中心法轮功六四事件

1
我不确定@CiroSantilli新疆改造中心六四事件法轮功 该工具的源代码在此处。似乎使用DBus与守护程序进行对话,但是我不太了解DBus或Glib。
Nick ODell

1
请注意,OP不需要的-r选项udisksctl loop-setup表示只读,因此请将其删除以进行可写安装。
Pelle Nilsson

15

您可以使用FUSE模块guestmount挂载几种类型的磁盘映像。它是guestfs生态系统的一部分,不需要root权限。

查看手册页以获取更多详细信息。

例子

1.对于在第一个分区上具有其主文件系统的典型Windows guest虚拟机:

guestmount -a windows.img -m /dev/sda1 --ro /mnt

2.对于典型的Linux guest虚拟机,其第一个分区上具有/ boot文件系统,而逻辑卷上具有根文件系统:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt

1
烦人,运行在Ubuntu上guestmount现在需要一些root访问权限读取内核映像:bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
克莱门特

@Clément我想了解libguestfs为什么需要一个内核映像来完成工作...
Ciro Santilli新疆改造中心法轮功六四事件

1
@CiroSantilli新疆改造中心六四事件法轮功,因为libguestfs通过在qemu虚拟机内启动最小的Linux系统来避免需要root用户(任何人都可以在没有root用户的情况下启动qemu虚拟机)。要启动该机器,它需要一些内核和initrd。
josch

3

可能的方法是/etc/fstab使用“ user”参数为ISO 添加条目,例如

/test.iso /mnt/iso auto defaults,user 0 1

但是,无论如何,您通常都需要root用户访问权限才能编辑此文件,因此它不是很有帮助。


2

实际上,只要已在中创建了正确的条目,就可以轻松地或多或少地以没有root特权的普通用户身份来挂载任何内容/etc/fstab

当然,/etc/fstab需要root特权的修改。但是,单个条目可以非常灵活地用于(u)在不同的挂载点上挂载许多不同的文件,而无需对进行任何进一步的编辑/etc/fstab

这里有两个非常简短的Bash脚本(5行+注释):

用于安装

#!/bin/sh
# usage: usmount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to mount device $1 on mount point $2
# Use /etc/fstab entry :
#       /tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
mount /tmp/UFS/drive || mount /tmp/UFS/mountpoint
# The last statement should be a bit more subtle
# Trying both is generally not useful.

和拆卸

#!/bin/sh
# usage: usumount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to umount device $1 from mount point $2
# Use /etc/fstab entry :
#       /tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
umount /tmp/UFS/drive || umount /tmp/UFS/mountpoint
# One of the two umounts may fail because it is ambiguous
# Actually both could fail, with careless mounting organization :-)

/tmp/UFS/创建目录是为了隔离链接并避免冲突。但是符号链接可以位于用户空间中的任何位置,只要它们位于同一位置(相同路径)即可。该/etc/fstab条目也不会更改。

重要警告: 出于安全考虑,限制了安装。使其更加灵活可能会打开恶意软件的大门。我不是安全专家,所以我建议您打开门不超过绝对需要的数量...使用选项限制可以挂载的文件系统可以执行的操作。如果知识渊博的撰稿人可以进一步评论安全问题,则可能会很有用。

可以使用各种选项来限制使用已挂载的文件系统,例如,noexec这些选项可防止执行二进制文件或nosuid,从而有助于提高安全性。实际上,这些选项在使用user或时被添加为默认选项users,这在下面的操作中是必然的。在覆盖这些默认值之前,请三思。 http://en.wikipedia.org/wiki/Fstab

可以添加其他选项以进一步保护。例如,在选项 owner 中的 /etc/fstab 条目将让用户只处理文件或他们自己的设备。请参阅 man mount 以获取选项列表: http : //linux.die.net/man/8/mount

/etc/fstab也可以通过包含符号链接的目录(或多个目录)的user.group所有权来限制该条目的使用。

说明

在我意识到我可以简化以上两个脚本之前就写了这个说明。我之所以没有立即想到它们,部分原因是我手头有一个更为复杂的问题,如果没有一些额外的设备,它们将无法解决。因此,我的解释可能比应有的更为复杂,但是我没有勇气从头开始重写所有内容。

其基本思路是,以创建条目中/etc/fstab包含的选项userusers使用户可以要求mount做安装在该条目被赋予作为参数文件中指定要安装或(在我的经验,但不能同时)的挂载点使用。

您还需要一个正确的条目umount(这是一个稍微不同的问题-参见下文)。该选项user通常优于,users因为它将权限限制为umount安装文件系统的用户,而users将允许所有人。不幸的是,该选项user并不总是有效,可能需要采取一些其他步骤。选项“ user”的mount(而非umount)工作中对此进行了讨论。

首先,您添加/etc/fstab一个条目,例如:

/tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto, 0 0

/tmp/UFS/drive用作要挂载的任何设备或文件(例如包含ISO文件系统映像的文件)的符号链接(或符号链接)/home/johndoe/john-image-file.iso

您还可以/tmp/UFS/mountpoint将您要使用的安装点定义为符号链接,例如/mnt/iso

然后john-image-file.iso,您可以使用以下命令进行挂载:

$ mount /tmp/UFS/drive

在我的Mageia Linux上,这已经足够了,因为现在已经隐式使用了循环设备,不再需要-o loop显式使用。我不知道今天有多普遍。请参阅 安装时,何时应使用回路设备?

此安装出现在表和命令中:

$ df | tail -1
/dev/loop0       5,1G  5,1G     0 100% /mnt/iso
$ tail -1 /etc/mtab
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ mount | tail -1
/home/johndoe/john-image-file.iso on /mnt/iso type udf (ro,nosuid,nodev,noexec,relatime,utf8)
$ tail -1 /proc/mounts
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ tail -1 /proc/self/mountinfo
46 22 7:0 / /mnt/iso rw,nosuid,nodev,noexec,relatime - udf /dev/loop0 ro,utf8
$ tail -1 /proc/self/mountstats 
device /dev/loop0 mounted on /mnt/iso with fstype udf

挂载操作适用于任何文件或驱动器,只需要从/tmp/UFS/drive该文件或驱动器进行符号链接即可。当然,可以为符号链接选择其他名称和位置,只要它永不改变即可。

卸载文件的方式与正确使用符号链接相同。对于与某些硬件驱动器相对应的普通设备,只需使用相同的链接。

但是,包含文件系统映像的文件是通过一种称为循环设备的特殊设备装入的,该设备在装入文件时会自动分配。

要卸载文件,您需要引用循环设备,而不是文件。因此,您需要在/etc/fstab一个条目中匹配在/etc/mtab这里使用的环路设备/dev/loop0和这里的安装点 /mnt/iso

您无法提前创建此类条目,因为循环设备可能会因动态分配而有所不同。注意,也可以使用固定环路设备,但是在其他方面不方便。请参阅 http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/此博客实际上启发了此处的答复)。

但是,您可以/dev/loop0通过询问系统来找到循环设备的名称,就像我们在上面以几种不同方式所做的一样。然后,/etc/fstab可以使我们的标准条目通过symlink指向正确的循环设备/tmp/UFS/drive,并指向先前使用进行的安装点/tmp/UFS/mountpoint。完成此操作后,可以使用以下任何命令来卸载该文件(只要与不会产生歧义/etc/mtab,这是一个不同的问题):

$ umount /tmp/UFS/drive
$ umount /dev/loop0
$ umount /mnt/iso
$ umount /tmp/UFS/mountpoint

由于仅在发出命令时才需要两个符号链接,因此可以动态更改它们。因此,我们的单个/etc/fstab条目允许安装任何数量的文件,并以任何顺序卸载它们,而无需root特权。

其他参考:


当fstab条目指向符号链接时,是否仅通过创建符号链接就可以利用它们来装载没有root的任何内容?间接地,这不只是mount为每个普通用户提升命令吗?还有与此相关的安全性问题吗?如果我错了纠正我。
巴拉特G

而且,当最新版本的GNU / Linux发行版(例如debian jessie)在fstab中检测到无效条目时,将不会提供gui登录。如果fstab 的devicemountpoint部分未指向有效的条目,它将回退到控制台登录会话。用户必须通过控制台会话登录,然后输入startx以明确启动显示管理器。
巴拉特G

0

软件包libguestfs-tools-c具有guestmount命令,因此

mkdir dvd    
guestmount -a image.iso -r -i dvd 

df将显示image.iso已安装

df

最重要的是:

guestunmount dvd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.