对话 UNIX,第 4 部分: UNIX 所有权和权限管理

从大约 50 年前电子时代的开始直到 1977 年出现了 Apple 计算机,完成计算工作的硬件设备一直很缺乏,并且购买和运行它们也非常的昂贵 。当时,这些(相对)原始的系统非常珍贵,仅仅用来处理那些最复杂的问题 。不同的项目之间必须竞争才能获得机时,而最早的信息技术 (IT) 管理人员的任务是保持系统每天 24 小时、每个星期 7 天不间断地进行工作 。毕竟,每一秒的闲置都等于浪费金钱 。
在理想的情况下,可以根据需要将这些浪费掉的 时间自动地分配给任何处于就绪状态等待进行计算的任务 。实际上,这正是分时 (time-sharing) 的基本思想(由 Robert Berner 在 1957 年提出) 。在 Multics、RSTS/E 和后来的 Unix?及其最新的变种中,都实现了分时或多任务,对计算机资源(CPU、输入和输出、以及内存)进行划分,分配给多个等待执行的作业,使得看起来每个作业都独占了计算机 。可以在多任务大型机中附加一些虚拟终端,这样每个终端都可以看作一台个人计算机 。
现在,您很可能拥有自己的 UNIX 计算机,或者与其他用户共享功能更强大的多处理器系统 。但无论是您的便携式计算机、或者公共机房中的 UNIX 庞然大物,都可能需要进行同时访问 。UNIX 提供了健壮的工具和基础结构,以便帮助您保护和共享信息 。
本文介绍了用户权限,特别是研究了如何对文件权限进行操作,以便对其他用户限制或共享您的目录和文件 。如果您希望流畅地与 UNIX 进行对话,那么了解相关的权限是至关重要的 。
ID 和 UID
在开始之前,让我们来看看您使用的究竟是哪个用户 。在命令提示符处,输入 whoami:
$ whoami
strike
我的计算机回答 strike,这是我的用户名(即登录时所使用的名称) 。您的 whoami 应该返回您的登录名称 。
当然,您的用户名是用户 ID (UID) 的假名(pseudonym) 。要查看您的 UID,可以输入 id -u:
$ id -u
501
在本示例中,我的 UID 为 501 。
通常,尽可能地使用用户名而不是 UID,因为用户名易于阅读和记忆 。例如,如果您运行 ps uxf 命令以查看您的运行进程的列表,那么 ps 将显示您的用户名作为您的进程的所有者 。
$ ps uxf
USERPID %CPU %MEMVSZ RSS TTY STAT STARTTIME COMMAND
strike32346 0.0 0.1 6496 1832 ?S19:390:00 sshd: strike@pts/0
strike32347 0.0 0.1 2592 1476 pts/0Ss19:390:00 _ -bash
strike32358 0.0 0.0 2476 820 pts/0R19:390:00 _ ps uxf
输出结果中显示了 3 个进程,分别是:一个 ssh 登录进程,它产生了一个 bash Shell,而后者启动了 ps 命令 。类似地,如果您在自己的 home 目录中运行 ls -alFG 以查看您的文件的所有者,那么将显示您的用户名而不是您的 UID 。
通常,只有您可以中断自己的任务 。(当然,超级用户 root 可以控制和操作所有的任务 。)例如,joe(共享相同系统的另一个用户)不能终止我正在运行的 Shell,即上面列表中的进程 32347:
$ whoami
joe
$ kill -INT 32347
-bash: kill: (32347) - Operation not permitted
其中,32347 是我的 Shell 的进程 ID,joe 可以通过运行 ps auxf 找到该信息 。然而,因为该进程由我所拥有,所以 joe 不能终止它 。与此相反,我当然可以结束自己的任何任务,如清单 1 所示 。
清单 1. 结束自己的进程
$ ps uxf
...
strike32347 0.0 0.1 2592 1488 pts/0Ss19:390:00 _ -bash
strike32733 39.5 0.0 1480 356 pts/0R19:500:01 _ yes
$ kill -INT 32733
$ ps uxf
...
strike32347 0.0 0.1 2592 1488 pts/0Ss19:390:00 _ -bash
在运行了 kill -INT 32733 之后,终止了进程 32733(yes 命令) 。

推荐阅读