我通常使用 mkdir 函数来创建目录(例如 mkdir("/home/dhw/test", S_IREAD|S_IWRITE) )
但是我无法在 /usr/local/bin 中创建目录。
我猜是权限问题。
我已经知道我可以做这项工作
system("sudo mkdir /usr/local/bin/test/");
并输入root密码。但我不想让用户手动获取root权限。
我应该怎么办?
答案1
为什么不让程序具有 suid 权限?但坦率地说,不应该触碰 /home 之外的目录。但是,如果你坚持这样做,只要 100% 确保内存检查是严格的并且没有漏洞,那么使用 suid 权限就可以解决问题。
另一种方法是,让该程序成为 root 组的成员。
总而言之,这是违反 FHS 的接触目录的奇怪要求。
答案2
这个问题已经有了公认的答案,但似乎有必要对 Unix 文件层次结构进行一些阐释。每个第一次接触 Unix 文件层次结构的人都想改变它,甚至连前任首席执行官史蒂夫·乔布斯(向他致敬)。Linux 的布局已在所谓的 FHS 中编纂(文件系统层次标准),其中列出了每个典型系统目录的位置和用途。 维基百科有一个简明的列表其中一些。Linux 标准库 (LSB)进一步概述了 LSB 兼容系统上必须存在的 API,其中部分由 FHS 指定。
Unix 的方式是将 Unix 系统文件与管理员文件隔离,并将这两者与用户文件进一步隔离。通常允许用户使用其主目录(通常在 /home 目录结构中)、/tmp、/var/tmp 以及系统可能根据设计或管理员配置允许的某些特定文件。
管理员通常可以控制系统,但 FHS 为管理员保留了一些目录。具体来说,/usr/local 和 /opt(包括一些其他相关目录)由系统保留供管理员使用。这些用于安装系统不维护或不提供的软件。
Linux 系统目前由所用发行版的创建者维护和管理,它将文件系统层次结构的其余大部分保留给自己。这种职责划分有助于维护系统的安全性和稳定性。必要时,管理员或发行版的软件包系统(如果有)可以进行修改。流行的软件包系统包括 Debian 的 apt、Novell 的 zypper、RedHat 的 yum 或 Gentoo 的 portage 软件包管理器。大多数这些软件包管理器都为管理员提供了控制系统软件包的选择、配置和维护的方法。
总之,应用程序程序员应该记住,用户对系统的访问权限是有限的,这是有充分理由的。除非是为了 FHS 中概述的目的之一,否则乱改系统目录可能不是正确的方向。
如果必须进行更改,可以使用一些工具来解决这个问题,包括明智地使用 sudo,PolicyKit,ACL和文件属性(修改模式, ETC。)。
原作者没有解释他需要的目录的用途,因此很难更具体地回答。我希望这个答案有用。