首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux乃是这个范儿之融于心而表于行(2)

2013-10-15 
linux就是这个范儿之融于心而表于行(2)原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作

linux就是这个范儿之融于心而表于行(2)

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责

2.2 用户的身份

既然Linux从诞生的那一天起就是多用户的,足可见多用户管理是Linux一项多么重要的功能构成。那么它都管理什么呢?简单来说就是管理用户的等级和用户对文件的访问权利。

Linux下的用户等级实际上是非常简单的,就两个等级——root和非root。root用户在Linux下是拥有至高无上的权利的,也就是说它可以胡作非为。但是比较幸运的是,只有一个用户是root,它的用户名就是root。而非root用户的权利是严格受限的,只能访问由root规定的文件。为了比较形象的说明Linux用户的管理模式,我们提出了这样一个模型……

2.2.1 澡堂子模型

我们把Linux的用户管理方式比喻成一个澡堂子模型,因为这个非常形象。对于所有非root用户,都只是这个澡堂子的顾客;root用户则是这个澡堂子的服务生;Linux系统就是这个大澡堂子了。

去过澡堂子的人都知道,一进门就会有服务生接待你,让你登记并发给你一个带有号牌的钥匙。这个过程跟root用户给其他用户分配账号是一个道理。登记是向系统中添加新用户,发给你钥匙是给你登录系统的密码,而号牌上的号码就是你的用户名。

当你获得钥匙之后,就可以进入更衣室了。女性更衣室什么样我不太清楚,但是男性的更衣室一般都会有几组大柜子。每个大柜子又由n多的小柜子组成,其中有一个小柜子是属于你的。怎么找到属于你的柜子呢?看柜子上面的号码!这个号码与你钥匙号牌上的号码是一致的。你肯定能用这把钥匙打开它,至于能不能打开别人的柜子我没试过。

这个过程跟我们登录Linux系统的过程十分相似。正确登录后,我们就会拥有一个自己的文件目录,这个目录一般是/home/[username],后面的[username]与你的用户名相同。一般称这个目录为home目录。更衣室的箱子就是你的home目录,里面可以放入一些你的私人物品,可以保证别人偷不走。

当你一切准备就绪,就可以开始沐浴了。但是一般都是一个很大的池子,放屁撒尿的都有。如果你嫌脏,可以要一个单间,不过需要的花费也是不菲的。这与我们正常使用Linux系统的道理差不多。只要离开你的home目录,就进入了公共区间。一般都是只读的,但有少数的位置是能够写入数据的,比如/tmp目录。对于这些可写的地方就需要素质了,无论你是放屁还是撒尿,别人即便看到了也没办法。但是如果你实在忍受不了别人这样,你可以自己单独使用一台Linux系统,但是花费也的确是不小的。

即便是在这种轻松的地方,也总是会有倒霉蛋的。我就见过有人把更衣室的那把钥匙弄丢的。一般这个很麻烦,因为衣物什么的都是锁在你专有的箱子里的,如果不想让别人偷走,那你在你没有钥匙的时候,也应该无法打开(用蛮力,而且别人不会叫警察除外)。当然,如果你就此竟自离开,我也无言以对;但如果你一筹莫展,我就告诉你有人能救你。那就是先前给你钥匙的那个服务生。因为他有一把特别的钥匙,能够打开柜子的后门。这时候你会发现,每一组柜子有一个大后门,只是服务生是不会当着你面前这么做的。他们会问你都有什么东西,在哪个柜子里。你只要如实描述,一般都会把东西还给你的。这种情况跟普通用户在使用Linux的过程忘记了自己的密码有些类似。只要向root用户申请,就能够变更新的密码。

Linux的用户管理跟这个基本上就是差不多的,只是粒度更加细腻一些。如果你能够理解这个澡堂子模型,那么接下来的内容就很容易理解了,只不过是它们看起来更加专业一点罢了。

2.2.2 用户角色

由于Linux是一个地道的多用户操作系统,所以能在Linux系统中添加n多的用户一点都不要感到奇怪。至于能添加多少,答案是232-1个。只要你硬盘足够大,你真想将这么多人名填进你的电脑也没人反对,前提是你真有那么大的耐心并且还能搞到名册。但是如果你的朋友或同事想使用你的计算机,而又不想让他/她们在不经意间窥探到你的小秘密还是很方便的,键盘敲敲打打就能添加一个新用户给他/她。随便他/她折腾,你几乎不用担心有“艳照门”发生在你身上。

当然,对用户这个概念的理解还不能仅限于字面含义。在Linux系统中还有一些用户是用来完成特定任务的,比如nobody、admin、ftp等。需要注意,在Linux中不管用户名有多么NB,只要不是root,它就一定是普通用户,权利大小都是相同的。很多资料上说的所谓用户角色的那些概念,尤其是说角色不同权限不同的观点不是十分精准的,很容易造成Linux用户有权限大小的印象。其实所谓的权限,则是不同的用户所能访问的文件不同而产生的一种假象。而这种假象这又不是单独一个用户的概念能够决定的,还要用到用户组的概念。

什么是用户组呢?可以把它理解为用户的职业。澡堂子里除了客人之外,还有搓澡的、推背的、柔脚的、烧水的、扫地的……等好多的职业。客人也有职业,但是没人会问,也没人敢问,所以干脆就都叫客人了。Linux中也是这种情况,比如nobody、admin、ftp也会有相应的职业,也就是用户组。只是比较巧合的是用户名和组名相同了。一个人是可以身兼多职,这个特点放在Linux用户身上也是允许的,即一个用户可以属于多个用户组。而且还要注意,一个用户至少应该属于一个用户组。

由于用户组能够在更高的层面来抽象用户所能够访问文件的数量,所以结合不同的用户,就能够给每个用户构建出独一无二的文件访问列表,而且不同的用户之间还能做到交错纵横,有条不紊。在用户之间的协作上和隐私的保护上达到了一个良好的平衡。这才是用户角色存在的真实目的所在。

虽然用户角色不能跟权限靠上关系,不同角色的有些时候还是有待遇差别的。所谓的待遇就是是否拥有密码、home目录以及shell(后面的章节会详细介绍)这些资源。有些用户的主要任务就是运行某些服务程序以确保安全性的,比如nobody用户就可以用于Nginx[1]的工作进程。对于这类的用户一般是不分配密码和shell[2]的,甚至home目录也没有。为什么这样做呢?

首先,可能会有很多服务程序默认使用这个用户,如果设置了密码,程序就无法自动使用了;其次,因为不会有人使用这个用户登录系统,也就没有必要分配一个shell给它,私密的home目录也有些多余。

不设置shell和home目录好理解,但是不设置密码不会引发安全问题吗?答案是否定的。

首先,我们一开始就强调,除了root之外,其他用户的权限都一样且非常小;其次,不同的用户所能访问到的文件是有限制的,而且再加上用户组的限制,这类用户能够访问的文件进一步受限(具体的内容我们后面在文件管理部分会有更详细的介绍)。所以,即便不提供密码,使用这类用户登录了系统,也不会对系统的安全造成严重的威胁。

前面列举的nobody、admin、ftp等都是比较常见的。还有一些差不多这样的用户或组根本就不是拿来用的,完全是用来占坑的,主要目的是为了兼容。你的系统中拥有哪些用户和组可以通过查看/etc/passwd和/etc/group文件看到,你会发现真正在用的没几个。

2.2.3 /etc/passwd文件

从这个文件名上看,应该是跟密码有关。的确是这样,只是那已经成为历史了。现在保存密码的文件是/etc/shadow,也就是传说中的影子文件,在后面我们还要要详细介绍它。现在我们只需要关心/etc/passwd文件,它是用来存放用户基本信息的。

这个文件的部分内容如下:

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

……

pulse:x:497:494:PulseAudio SystemDaemon:/var/run/pulse:/sbin/nologin

gdm:x:42:42::/var/lib/gdm:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

jagen:x:500:500:jagen Zhao:/home/jagen:/bin/bash

文件的每一个行都代表一个用户。换句话说,这个文件有几行你的系统中就拥有几个用户。每一行由冒号“:”分割成7个字段,其结构如下所示:


用户名:密码:UID:GID:用户全名:home目录:shell


前面所述的那些用户的“待遇”已经全都包含了。比较搞笑的是“密码”字段,虽然是这么叫的,但是真的没有密码放在这里,有的只是一个字母“x”。

这个文件中比较重要的是UID(User ID)和GID(Group ID),无论是用户还是用户组,Linux只靠它们来识别。没有人敢说电脑是不识数的,其实它是只认数不认人的,所以UID和GID都只是一个数字。为了区别不同的用户或用户组,需要保持它们自身在系统中的唯一性。UID和GID是可以相同的,因为它们代表的是不同的概念。都为0的UID和GID是Linux系统中比较特殊的,它们分配给root用户和root用户组。UID和GID是可以通过程序获取的,所以可以通过这个特殊的值来判断是否能够胡作非为。

虽然系统只区别0和非零的UID或GID,但是在使用习惯上还是进行了一些分段的。0自然不用说,就是给root的;1~499是属于系统用户的,比如前面提到的那些待遇比较差的和一些甚至是占坑的就属于这类;500~4294967295是分配给普通用户的。所以你会发现,你系统中第一个被添加的用户的UID和GID都是500。

2.2.4 /etc/group文件

跟用户组有关的文件就是/etc/group文件了,也就是/etc/passwd中GID的来源了。这个文件的部分内容如下所示:

root:x:0:root

bin:x:1:root,bin,daemon

daemon:x:2:root,bin,daemon

sys:x:3:root,bin,adm

adm:x:4:root,adm,daemon

tty:x:5:

disk:x:6:root

lp:x:7:daemon,lp

mem:x:8:

kmem:x:9:

wheel:x:10:root

mail:x:12:mail,postfix

uucp:x:14:uucp

man:x:15:

games:x:20:

gopher:x:30:

……

fuse:x:490:

gdm:x:42:

sshd:x:74:

tcpdump:x:72:

slocate:x:21:

jagen:x:500:

与/etc/passwd类似,同样是每行代表一个用户组,只是这个文件比较简单,被冒号“:”分割成了四个字段。行结构如下所示:


组名:用户组密码:GID:用户组内的用户名


从/etc/group文件的结构可以看出,不但用户有密码,用户组也是有密码的。那么用户组密码是做什么用的呢?答案是给用户组管理员的。不过目前很少有这个机会要配置用户组管理员,所以本书也不会介绍这方面的内容。与/etc/passwd一样,组密码是存储在/etc/gshadow文件中。那么这个字段也就是纯粹的“歪歪”了,它永远都是“x”。

比较怪异的是“用户组内的用户名”这个字段,因为从上述文件中会发现,有很多组是没有使用这个字段的。而使用这个字段的,则会使用逗号“,”来分割每个用户名。那么这个字段到底是什么含义呢?前面我们就说过,一个用户是可以身兼数职的(多个用户组)。那么,只要用户兼职了这个用户组,它的名字就会出现在这个字段里。那么那些没有使用这个字段的组呢?很显然,就是没有人兼职呗。但是没有人兼职,并不代表没有人专职。在/etc/passwd文件中,某个用户的GID字段所代表的就是专职用户组。按照Linux中的术语,这叫“初始用户组”;那些兼职的用户组,就被叫做“支持用户组”。对于专职的用户来讲,是可以不出现在“用户组内的用户名”的这个字段的。使用groups命令可以查看所有的“支持用户组”,而且在“支持用户组”的列表中第一个出现的那个组还有一个称呼,叫“有效用户组”。至于什么是“有效用户组”,我们将在后面的有关文件和目录的部分再继续介绍。

2.2.5 管理用户和组

在澡堂子里,服务员很重要的一项工作就给顾客提供服务,而在Linux中,作为root用户,很重要的一个工作就是管理用户和组。所以在很多时候搓澡的和管系统的是“同行”。

Linux系统为用户和组的增、删、改提供了一些基本的命令。这些命令的作用机制就是对/etc/passwd和/etc/group这两个文件进行增、删、改来完成的。外加一个/etc/shadow文件专门用来管理密码。

Linux中添加一个新的用户,可以使用adduser或useradd命令。在一个系统中拥有两个长得很像且功能类似但又有少许不同的命令时,肯定会是十分很蛋疼的一件事,因为你会经常把他们弄混。如果你认同这一点,那么adduser和useradd这两个命令就不仅是蛋疼了,还有点菊花痒痒。为什么呢?因为它们在不同的发行版下还有差别。比如,在Ubuntu中adduser是一个脚本,而useradd是一个二进制程序,前者对后者进行了封装,更加智能。但是在Cent OS中adduser和useradd完全相同,前者只是一个符号连接(后面会讲述符号连接的概念)罢了。本来adduser和useradd长得就很像,在不同的发行版中还有那么微小的差别,这是多么坑爹的设计啊!幸好这两个命令不是很常用而且也足够简单,还不至于太坑。

useradd在任何Linux发行版都是一样的,所以我们最好牢记的是它,这样我们实用的经验累积起来会相对容易一些,本书也以它为例。那么,添加一个新用户最简单的方法,可以用这样的命令(注意,需要root权限):

# useradd jagen

这样名为jagen的用户就添加到系统中了。可能你会问,就这么简单吗?就这么简单。因为系统已经帮我们设定好了很多的默认值了。这包括:创建一个唯一的UID;添加一个与用户名相同的用户组和一个唯一的GID,并将用户设置为该组;在/home目录下创建一个与用户同名的目录;设置shell为/bin/bash。唯一还没有设置的就是密码了,使用passwd命令可以做到这一点。

当你在命令行下输入passwd命令之后,系统马上就会提示你输入当前的密码。只有录入了正确的密码之后,才能进行到下一步。这个过程是看不到有回显的,也就是说你在录入密码的时候光标是不会有任何反映的,不会有类似图形界面的“***”什么的出现。在文本状态下,所有有关密码的操作都是这样,包括使用文本界面登录的时候。虽然这种方式不允许我们在输入密码是被打断,但是安全性更好。

当输入正确的密码之后,就会立即提示输入新的密码,然后还要求再次确认一遍。只有两次输入的密码一致,新的密码才能被接受。那么下次在使用这个用户登录的时候,就应该使用新的密码了。

刚才的操作只是能够修改自己的密码,如果是root用户,按照我们的澡堂子模型,是可以给其他用户修改密码的。只要给passwd命令传递要修改的用户名即可,而且是不需要提示输入当前密码的,直接就能录入新的密码。录入新密码的过程也需要两次,这是为了保证录入正确性的。如果你不是root用户,也可以尝试这种操作,得到的结果就是被系统拒绝。你虽然可以挑战Linux的底线,但是Linux绝对不会给你挑战成功的机会。更复杂的,比如修改密码的时效性等更高级的内容,还有chage命令。

正所谓:“人有失手,马有乱蹄”,人要是不犯错误他/她就不是人。所以,很难保证root在添加新用户的时候不犯点错误,比如名字给弄错了。这个时候能有修正错误的方法将会是很可爱的事情。正好usermod命令就能干这事儿。实际上usermod并不是为了弥补错误而提供的,因为修正用户的某些细微的配置参数实际上是更为常见的操作,比如希望使用一个与众不同的shell。

要删除某个用户,可以使用userdel命令。这个命令相当的简单,希望删掉谁就把谁的用户名写在它后面就行。如果你是root,userdel的命令基本上就是那的判官笔了,“写谁”谁就消失了。此外,它还有一个“-r”命令选项,把用户的home目录一同删掉。所以这个命令不但会“杀人”,还会“抄家”。root一定要慎用。为了避免不必要的误伤,这也是不要随便使用root用户的理由之一。

至于用户组的管理实际上是跟用户很像的,也拥有差不多相同的命令,差别就是将“user”这个前缀换成“group”,即groupadd、groupmod和groupdel。此外还有一个用于管理用户组密码的gpasswd,只是它相当的不常用。

如果你对前面介绍的这些命令还有什么疑问,那就千万不要忘记我们在第一章中介绍的那个“男人”(man),它能够帮助你了解到全部。后面的内容中所出现的命令我们也不会太多的去讲述具体用法,我们希望你能养成一个好习惯。

2.2.6 夺面双雄

尼古拉斯凯奇是我十分喜爱的一位演员。他主演过一部非常著名的电影《夺面双雄》。影片讲述了,FBI高级探员为了得到杀害自己儿子的凶手口中的重大机密,不惜和凶手做换脸手术,一切尽在计划中却不料发生了意外,当探员变成魔鬼,而凶手变成天使的时候,以二者遭遇的特殊身份展开的故事。

Linux的用户在执行某些操作的时候,就需要做个“换脸手术”。只是这个过程不大会出现什么意外,也不可能有电影情节的那般惊心动魄,更不可能出现什么天使与魔鬼的转变。但是借用一下身份的事情还是要发生的。借用谁的身份呢?答案是root的,也就是以root身份来执行某些操作。

很早我们就说过,Linux的用户除了root就是普通用户,而且普通用户的权限非常低,就连向系统中安装软件的权利都没有。很多时候系统管理员为了能让普通用户具备一点root的特权,省得用户经常来麻烦他们,就可能赋给用户被称为sudo的特权。

比如/etc/shadow文件,由于其特殊性,普通用户是不被允许查看其内容的。但是拥有sudo特权的用户,可以执行以下命令,查看到这个文件的内容:

$ sudo cat /etc/shadow

普通用户一旦拥有sudo的特权,几乎就可以胡作非为了,但是需要付出一点代价。是什么样的代价呢?也不是很大的代价,就是需要在将要执行的命令前冠上sudo这个前缀(别忘了空格分割),同时被系统提示要求输入密码。这其实对于我们大多数用户来说,是不算什么麻烦的。可是对某些不怀好意的一小撮人来说,这个小麻烦或许就会让他们一事无成或彻底打消念头。比如某些流氓软件,想悄悄的进入你的系统,只要你不使用root用户,它就几乎没有办法,即便你拥有sudo特权,难道系统莫名其妙的让你输入密码你就不会产生怀疑吗?

但是,你现在可能不能立即验证这个功能,因为你现在所使用的这个用户(非root)未必具备sudo特权。对于桌面版的Linux发行版,比如Ubuntu、Fedora等,它们的设计理念是个人日常应用,比较偏向赋予普通用户相对较为宽泛的权利,所以在系统的配置中,有会一类基于普通用户的管理员角色,这类角色的用户会被赋予sudo特权。所以,如果你选择的是这类发行版,那你在系统安装阶段所添加的用户,基本都是具备sudo权限的。而对于本书所推荐的CentOS这类企业级发行版,它们的设计理念是企业应用,强调安全可靠,所以在系统的配置中,除非root用户指定,否则不会有用户具备sudo特权。

虽然使用sudo之后就可以查看到/etc/shadow文件里面的内容了。但是你不要打歪主意,密码是不会明文保存的:)

既然选择了Cent OS的人现在无法验证刚才的命令,那么利用root用户让某个普通用户具备sudo特权,不就可以验证了吗?那我们就开始吧。

给某个用户赋予sudo特权,实际上就是更改/etc/sudoers文件中的内容。这个文件比较重要的内容如下所示:

……

## Allow root to run any commands anywhere

root ALL=(ALL) ALL

……

## Allows people in group wheel to run all commands

# %wheel ALL=(ALL) ALL

## Same thing without a password

# %wheel ALL=(ALL) NOPASSWD: ALL

## Allows members of the users group to mount and unmount the

## cdrom as root

# %users ALL=/sbin/mount/mnt/cdrom, /sbin/umount /mnt/cdrom

……

在这个文件中,所有以“#”开头的行都是注释内容。所以这个文件里的内容绝大多数都是废话,因为只有一行没有以“#”开头。那一行的内容就是:

root ALL=(ALL) ALL

它的含义是说root用户可以使用sudo特权以root权限执行任何命令。显然又是一句废话,root用户有必要运用它的sudo特权吗?但是学着它的样子,自己添加一行,比如:

jagen ALL=(ALL) ALL

那么jagen用户就可以使用sudo特权以root权限执行任何命令了。

如果需要赋予sudo特权的用户只有少数那么几个,这样单独授权的方式没有什么问题。但是Linux还支持另外一种授权方法,那就是下面这行:

%wheel ALL=(ALL) ALL

这一行的作用是让wheel用户组的所有用户默认拥有sudo特权。那么当需要给某个用户授权时,只要将他/她加入到wheel用户组即可。这样就省去了频繁修改/etc/sudoer文件的麻烦了,管理起来更加方便。默认的时候,这样是被注视掉的,如果希望开启这个功能,那么就去掉前面“#”吧。

sudo还有另外一个更为霸气的功能,就是在下面这一行中:

%wheel ALL=(ALL) NOPASSWD: ALL

同样是给wheel用户组授权,但是关键的这个NOPASSWD,可以使得不需要输入密码即可拥有root权限。这个NOPASSWD并不仅仅作用于用户组,对于我们前面所说的针对单个用户授权的方法也是有效的。我总感觉这个功能有点危险,所以我是不建议使用的,元方你怎么看?

上面所介绍的这些修改,会让拥有sudo特权的用户能够以root权限执行任何命令,很多时候会觉得这个权限给的太过宽松,显然会威胁到管理员的地位。所以做必要的限制还是合理的。下面的代码能够满足这一需求:

%users ALL=/sbin/mount/mnt/cdrom, /sbin/umount /mnt/cdrom

这一行主要描述了users用户组,可以执行:

$sudo mount /mnt/cdrom

$sudo unmount /mnt/cdrom

这两个命令,其它的都将被Linux系统拒绝。需要注意,这里一定要写明命令的完全路径,两个命令之间使用逗号“,”分割。显然一个命令一个命令的写是非常麻烦的,只允许执行这几个命令也是有悖赋予sudo特权的初衷的。但是别着急,sudo还有另外一种写法,可以是这样:

%users ALL=(ALL)ALL,!/usr/sbin/adduser,!/usr/sbin/useradd

这一行使得users用户组无法使用sudo特权给系统添加新的用户。关键就是在叹号“!”这里,它表示禁止使用某些命令。

有关sudo的另外一个比较重要的问题是时间间隔问题。在使用的过程中你会发现,第一次使用sudo,需要输入密码,但是在短时间内再次使用sudo是,则不被要求输入密码了。这是sudo的一种人性化设置,因为已经验明正身了就没有必要再去验证。可是不能总是不让你输入密码。因为当你离开电脑,有人趁此时机可能就会做一些什么“破坏”,那么所有的坏事可就都落在你的头上了。所以sudo会判断两次操作的间隔,如果间隔时间在5分钟内,就不提示输入密码,超过了,则需要重新验证。以便降低你的sudo特权被别人乱用的嫌疑。

即便是作为Linux系统的管理员,也是不推荐长期使用root的,所以大部分的工作是使用普通用户操作的。根据前面的讲述可以简单的推测,管理员也可以通过普通用户利用sudo特权来管理整个系统。但是使用sudo特权,必须在每个命令前冠以sudo,这会给管理员的很多工作造成不必要的麻烦。su命令可以解决这个问题。

su命令就是做临时用户切换的,默认是切换到root用户。su在做用户切换的时候也会提示输入密码,但是与sudo需要输入自己的密码不同,su要求输入目标用户密码,如果是切换到root,那么要求的是root密码。一旦切换完成,就会将当前的用户转换成目标用户。如果希望再切换回原始用户,可以使用exit命令。

如果不给su命令任何参数,它切换的用户是root用户,同时不会更改当前所在的目录。比如说你当前所在的目录是/home/jagen,那么执行完su后,依然是在这个目录。当给su命令传递一个“-”参数时,即执行“su -”,则会改变当前目录到目标用户的home目录,也就是/root目录下。

如果使用su命令成功切换到root用户下,那么就可以在不知道密码的情况下,切换到任意用户,比如执行“su jagen -”,就会立即切换到jagen用户下,同时当前目录变更为/home/jagen。如果要退回root,执行exit。继续退回到原始用户,继续执行exit。

由此可见,使用su命令,管理员可以任意切换成任何用户,这给管理员在管理上面带来了很大的方便。当然,普通用户的所谓隐私,在管理员面前就是完全公开的了。

顺便说一下,拥有sudo特权的用户,是可以通过执行:

$ sudo su -

命令,直接使用自己的密码切换成root用户的。原理就是root用户使用su命令切换到任何用户都不提示密码。这显然是不安全的。为了避免这种问题的发生,应该在/etc/sudoers文件中明确禁止su被sudo特权执行。

2.2.7 我是谁?

我是谁?英文即who am I?学过哲学的人立即会想到这是一个十分著名的哲学问题,但是我相信大多数人想到的是成龙的一部电影,因为百度也是这么想的。当你看完这本书之后,你还应该知道,这是Linux的命令。

我们需要先做一些准备,请以普通用户登录系统,比如我是jagen。然后执行命令:

$ whoami

jagen

$ who am i

jagen pts/0 2012-12-12 00:02 (:0.0)

$ who

jagen tty1 2012-12-12 00:02 (:0)

jagen pts/0 2012-12-12 00:02 (:0.0)

接着我们使用su命令切换到root用户下再试一下:

$ whoami

root

$ who am i

jagen pts/0 2012-12-12 00:02 (:0.0)

$ who

jagen tty1 2012-12-12 00:02 (:0)

jagen pts/0 2012-12-12 00:02 (:0.0)

看出区别来了吗?whoami这个命令的结果是不同的,但是who am i和who这两个指令却有相同的结果。也就是说我们执行的换脸大法,能骗得过whoami,但是骗不过who am i和who。要解释这背后的运行机制,需要引入另外两个新的概念——实际用户(UID)和有效用户(EUID),即EffectiveUID)。

所谓的实际用户是指用户登录时所使用的用户,所以在整个登录会话中,实际用户是不会发生变化的;而有效用户则是指当前执行操作的用户,这个是能够利用su或sudo命令进行任意切换的,也就是真正决权限高低的用户。一般情况下,实际用户和有效用户是相同的,只有发生用户身份切换的时候,才会出现差异。

既然有实际用户和有效用户的差别,也就会有实际用户组和有效用户组的差别,毕竟用户和用户之间所属的组有差异是一件十分正常的事情。但是,实际用户组和有效用户组产生差异并不一定是因为切换用户而导致的,具体触发条件后面再做介绍。而且实际用户和有效用户出现差别,切换用户并不是唯一的触发机制。其他的触发机制我们同样会放到后面的内容,因为这样会更容易理解。

那么我们现在再回到“我是谁”这个问题上,为什么要问这个问题?对那些经常需要切换用户的系统管理员来说,搞清楚当前使用的是什么身份的用户是一件不太容易的事情,毕竟切来切去的换做谁都有可能凌乱;对于某些shell脚本,或许需要特别的用户才能执行,那么就需要利用whoami这个命令来搞清楚执行它的用户是谁;还有一些shell脚本可能不太喜欢被人“欺骗”,一定要要求某个特别用户才能执行,即便是使用su切换的都不行,那么就需要利用who am i这个命令来确认了。总之,我是谁,从哪里来,一定得搞清楚。



[1]Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它以极强的稳定性、丰富的功能集、极低的系统资源消耗、灵活多变的配置文件而闻名。

[2]严格说还是分配shell了的,只是分配的是/sbin/nologin这个特殊的shell,从其命名上看就是阻止你登陆,实际上就是没有任何功能的shell(也可能显示几行声明文字)。


热点排行