我有一个 mono 应用程序(在 Ubuntu 上),它会跟踪 /var/log/messages 并获取 USB 插入,如果该设备位于某个端口上,则需要对其进行分区、格式化和挂载。显然,这需要 root 权限。我是 Linux 新手,我想知道实现这一点的“正确”方法是什么。
始终以 root 身份运行我的应用程序是否更好?或者,授予我的应用程序权限是否更好(或可能)卸载,分开,文件系统, 和山以及我需要的任何其他仅限 root 的进程?
背景:
安装后,一些特定客户请求的文件将加载到驱动器中。每个驱动器都是唯一的,因此克隆将不起作用,而且我每周将支持数百个驱动器,所以我需要尽可能自动化。我意识到这很危险,所以是的,我会在机器上发出警告,所有驱动器都将被格式化。我使用 mono,因为它非常适合用 C# .net 编写的大型应用程序。
答案1
实际上,您无需拥有 root 权限即可执行此操作。事实上,我强烈建议不要让任何东西以 root 身份运行。这是我建议的最安全的方法。
- 编写一行 shell 脚本,
chown
在设备节点上向运行 Mono 应用程序的用户执行操作,或者chmod
打开足够的世界或组权限,以便您的应用程序可以修改设备。 - 将脚本保存
/usr/local/bin
为 root 所有,并且用户不可写入。 - 添加一条规则
sudoers
,允许用户使用您的 Mono 应用程序运行您刚刚创建的脚本。 - 在您的应用程序检测到设备后,首先运行该脚本,
sudo
以便您的用户可以读取/写入该设备。 - 以用户身份在设备上执行所有操作!
注意:不要授予您的应用程序对、chmod
或任何其他此类管理工具的 sudo 访问权限,只授予您编写的受保护的单一用途脚本的访问权限,该脚本仅在您的一台设备上打开权限。chown
fdisk
答案2
除了 Caleb 的回答之外,对于和mount
,umount
您不需要 root 权限来执行这些操作,只要您/etc/fstab
使用“user,noauto”设置每个设备名称和挂载点(除了您需要的任何其他选项之外。user
授予普通用户挂载和卸载设备的权限,noauto
告诉启动过程不要在启动时尝试挂载所有设备……fsck
和dump
列也应为 0)。您需要为每个设备创建一个条目和目录(例如,/mnt/sda1
与一起使用/dev/sda1
)。
如果要将这些文件格式化为 FAT,您可能可以完全忽略挂载。使用mkfs.msdos
创建文件系统后,使用mtools
直接编辑文件系统。查看 mtools 文档,至少有一个临时文件(我发现.mcwd
)使得同时使用多个文件系统变得困难(每个进程都需要设置一个唯一的$MCWD
环境变量来指向此文件的不同位置或文件名),因此请务必仔细阅读文档。
使用 ext2 文件系统,又出现了新的麻烦:用户和组所有权以及文件权限。解决此问题的最简单方法是在chown
文件系统挂载后使用脚本来访问挂载点,就像 chown 设备文件的脚本一样。然后用户可以写入文件并使用 chmod 适当设置权限。这里的问题是驱动器的接收者可能没有匹配的用户,但只要您确保“其他”读/写/执行位正确,并且避免使用 suid/sgid 位,这主要是表面问题(除非他们确实有一个与您的 uid 匹配的用户,那么除非接收者立即更改权限,否则该人将能够写入驱动器)。