我有一个单一的应用程序(在Ubuntu上)尾巴/ var /日志/消息,并拿起USB插入,如果该设备是在一个特定的端口,需要分区,格式化,并安装它。 显然这需要root权限。 我是Linux的新手,我想知道什么是“正确”的方法是完成这个。
始终以root身份运行我的应用程序会更好吗? 还是更好(或可能)给我的应用程序权限卸载 , 分开 , mkfs ,并安装和任何其他只需要的根进程?
背景:
一旦安装,一些特定的客户要求的文件将被加载到驱动器。 每个驱动器都是独一无二的,因此克隆将无法工作,而且我将每周支持数百个驱动器,所以我需要它尽可能自动化。 我意识到这是危险的,所以是的,我会在机器上发出一个警告,所有的驱动器将被格式化。 我使用单声道,因为它适合用C#.net编写的更大的应用程序。
其实你不必有root权限来做到这一点。 如果事实我会高度推荐,不要让任何东西作为根运行。 这是我build议的最安全的方式。
chown作为您的单声道应用程序运行的用户或chmod打开足以让您的应用程序修改设备的chmod或组权限。 /usr/local/bin ,而不能由用户写入。 sudoers添加一条规则,允许用户使用您的mono应用程序运行您刚刚创build的脚本。 sudo运行该脚本,以便设备可由用户读取/写入。 注意:不要让你的应用程序sudo访问chmod , chown , fdisk或者其他任何这样的pipe理工具,只有你写的受保护的单一目的脚本只在你的一个设备上打开chown 。
添加到Caleb的回答中,对于mount和umount ,只要使用“user,noauto”设置/etc/fstab的设备名称和mount ,就不需要root权限来执行这些操作(除了任何其他选项你需要user给普通用户安装和卸载设备的权限, noauto告诉启动进程不要在启动时尝试挂载它们, fsck和dump列也应该是0。 您需要为每个设备创build一个条目和目录(例如/mnt/sda1与/dev/sda1 )。
如果这些将被格式化,您可能会完全忽略挂载。 使用mkfs.msdos创build文件系统后,使用mtools直接编辑文件系统。 通过mtools文档,至less有一个临时文件(我发现.mcwd ),使多个文件系统同时工作困难(每个进程将需要设置一个独特的$MCWD环境variables指向一个不同的位置或这个文件的文件名),所以一定要仔细阅读文档。
使用ext2文件系统,将打开一个新的蠕虫jar:用户和组的所有权和文件权限。 解决这个问题的最简单的方法是在文件系统挂载之后,使用脚本来chown挂载点,就像脚本来填充设备文件一样。 然后用户可以写入文件并使用chmod来适当地设置权限。 这里的问题是,驱动器的接收者可能没有匹配的用户,但只要你确保“其他”读/写/执行位是正确的,你避免使用suid / sgid位,这主要是整容问题(除非他们实际上有一个用户匹配你的uid,然后这个人将能够写入驱动器,除非收件人立即更改权限)。