用户权限,用户名,用户 id 的问题

作为新学者,有如下几个问题:
1、Linux 中有用户名和用户 ID,同一台机器上用户名和 ID 都不会重复,但是经我测试,不同机器上的用户名和 ID 是可以重复的,我有 4 台虚拟机,用户名都是 lzc,ID 都是 1000,都位于 users 组中。请问如何区分这些用户。
例如,如果我在第一台 Linux 上新建一个文档 test.txt,owner 是 lzc,权限如下:owner 可读可写,群组可读,others 可读。我将 test.txt 拷贝到第二台 Linux 上,用第二台 Linux 的 lzc 用户照样可以可读可写。按照我的理解,第二台机器上的 lzc 应该不同于第一台机器的 lzc,应该属于 others,但是为什么可读可写?

这说明是不是两台 Linux 如果有相同的用户名和 ID,那么他们可以互相作为对方文件的 owner????

2、当我把 test.txt 文件拷贝到 U 盘中的时候,我发现当我用 root 登录 Linux 打开 U 盘,U 盘中的 test.txt 的 owner 就变成了 root,当我用 lzc 登录的时候,U 盘中的 test.txt 的 owner 就变成了 lzc? 这是为什么?????

3、如果出现多台 Linux 上面有相同的用户名和 ID 的时候,这时候是不是很危险,很容易就跳跃过权限,拥有了 owner 的权限?

不要管文件在第一个 Linux 里面的 owner,而是看你是用哪个身份将文件从 U 盘拷到第二个系统里,这个决定了文件在第二个系统里的 owner。
也就是说,你既然你能把文件从别的地方拷到你的系统里来——那你理所应当是它的 owner——在这个系统里。

可我认为如果不是特意修改文件的 owner,文件在拷贝过程中,owner 等属性是不应该变化的。文件不是有一个属性修改时间吗。

  1. 请问你能区分你那四台虚拟机吗?你能区分它们就能区分四个 lzc。虚拟机一上的 lzc,虚拟机二上的 lzc,等等。

现实中如果是 ssh 同时登陆四台 VPS 的话,会显示 username@ip,比如 lzc@192.168.1.1。助记项依然不是名字本身。

或者我再说个更蛋疼的:你四个虚拟机全开,互相都用 NFS 或者别的什么共享访问,你会发现你一个时间点上只会用一个 lzc,它可以访问共享里的全部文件。你完全不需要区分。而你想干别的,比如用第二个虚拟机的 lzc 去访问第一个虚拟机的没有共享的东西,你会发现你也做不到。 你之所以能在第二个虚拟机上操作第一个虚拟机的文件,是因为第一个虚拟机同意你操作了,不管是哪个用户同意的 。

或者换句话说:这种问题没有意义(最简单的人类逻辑,你已经说了是同名了,那在未提供其它条件的情况下它们就是相等,一定要区分就一定要提供其它条件),同名是你设的,分不出来也是你,既然觉得分不出来为啥不改个名。你问这个就好比:我在新浪微博和 QQ 都叫一个名,怎么区分这两个名,很显然要用新浪微博和 QQ 这两个服务提供商来区分,单独拿出两个名来那它们就是相同的。

  1. 是属于 others。而且你换个名,只要能用那个名复制过来那还是可读可写。 因为不可读可写就不可复制,就这么简单 。所以其实你的这个例子是瞎编的,你 others 仅可读,那你除非用第一台虚拟机 owner 去复制到第二台虚拟机,否则你用第二台虚拟机的账户根本复制不过来。

而且你的这个例子省略了太多的现实,以至于变成了在「谈玄」。 一个硬盘分区是不可能被两台运行中的 Linux 同时挂载的,会对一个显示已被使用 。所以你这个复制来复制去未免太简单了些, 如果你说两台 Linux 都能访问一个硬盘分区,那只有一个可能,这个硬盘分区是共享的 。我能假设出的情况有二:

2.1 打开第一台虚拟机,挂载上第二台虚拟机的硬盘(这很难,不信你试试),然后用第一台虚拟机的 lzc 把文件复制到第二台虚拟机的硬盘,这没问题。关机,开第二台虚拟机,你会发现你能用之前复制过来的文件。这很简单,因为挂载实际上是映射。或者这么说, 你第一台虚拟机的权限机制,只有第一台虚拟机开着的时候才会起作用 。你第一台虚拟机没开,那它的权限设定都被映射到挂载该硬盘分区的用户身上,这就是你挂载 U 盘的例子。

2.2 你第一台虚拟机设置了共享,第二台虚拟机登陆到共享,用第二台的 lzc 复制第一台的文件,可以。过来也可以访问。 因为你复制的时候就把所有者变成了自己 。你想要用第一台的 lzc 把文件复制到第二台,抱歉,不可能,因为第二台没跟你共享。如果第二台也设置了共享,那同样,复制的时候把所有者变成了自己。两台都开共享,你会发现某一台的可以使用对方的文件,因为很简单啊,共享这个词的意思就是说让对方跟我能力一样。

  1. 不危险,因为不通过共享或挂载它们相互根本看不到。而共享或挂载的话,那它们的原理就是在你同意的情况下去 own,不管用户名是否相同。你现在直接假设彼此能看到,是不是太咫尺天涯了些。

不要纸上谈兵,动手操作一下,你会发现你用 root 复制完 owner 就变成了 root,用普通用户复制完 owner 就变成了普通用户。你用普通用户去复制 root 的文件要是 root 不让你读你不 sudo 根本复制不了。

这种说法我不能同意,并不是我故意要弄 4 个完全一样的用户名、id 在 4 台机器上,我只是假设,如果有这样一个黑客,随便新建一个用户名、id,互联网上那么多机器,肯定至少有一个用户名、id 和我的相同,那么我就可以修改他的共享文件,(假设他的共享文件权限是 owner 可读可修改,others 只有读权限),你明白吗,我就可以跳过他共享文件的权限设置,( 本来人家是想 others 只读,我肯定属于 others,但由于我和他的用户名、id 相同,结果我从 others 变成了 owner ),修改他的文件了。。。 ** 这样的黑客也太好当了吧。**

另外用 QQ 举例子是不恰当的,QQ 明显是可以重名的,但 QQ 号是不重复的。但 linux 用户不同,不仅用户名相同,连 id 都可以相同。这就像数据库中表的主键一样,QQ 号是主键,linux 用户的 id 也是主键。那么主键是不能重复的。 说白了:我可以在我的四台虚拟机上让用户不重名,但我不能保证我和互联网上某一台机器不重名

首先说,我这里例子不是瞎编的,我真有一台 16G 内存的 win7,用 virtualbox 做了 4 台虚拟机,我上述例子也都是我亲自做过的,不是我仅仅靠想像而没有经过实践的,如果不信的话我可以截图给你看。

最重要的我想说,本贴中我所说的每句话都是经过我亲自测试之后才说的。不是我凭空想像出来的

不好意思,在我看来,你这个想法恐怕是过于荒谬了。

质疑一:假设你创建了数量 = 宇宙中恒星数量的虚拟机,在每一个虚拟机中创建了数量 = 太阳系小行星数量的用户。Linux 需要为你把 id 的位数扩大到多少位?

质疑二:假如说你创建一个用户的时候,Linux 就能够查找到全世界其他所有用 Linux 的用户的 user id,并且创建出一个不同的 user id 出来,那 Linux 就是苹果,就是谷歌了,而不再是 Linux 了。这才是灾难。

质疑三:恩,你想拷他的文件,但是你怎么挂载到他的硬盘啊? 你得先把硬盘偷到手上才行啊。 不是说你现在正在用一个用户名、id 和别人电脑上用户名、id 相同的帐号浏览互联网,你就获取了别人电脑的权限。 别人的电脑根本就不知道你使用电脑的用户名、id 是什么。

你有没有挂载到互联网上其他人的硬盘啊??

我赞同女王。因为你的论述有那么一点点“民科”味道了。 确实不应该打击别人积极性。 但是如果说有个人反复发帖说自己开车,车的速度是 x,车上灯光相对车的速度是 c,所以灯光相对地面的速度是 c+x,所以相对论是错误的。 那么你会怎么回复这个人啊?

我也回敬一个大红字:

我就可以跳过他共享文件的权限设置,(本来人家是想 others 只读,我肯定属于 others,但由于我和他的用户名、id 相同,结果我从 others 变成了 owner),修改他的文件了。。。

敢问您亲自测试过这个?

疑问一和疑问二也是我的疑问,所以我才来这里发帖请教,linux 是如何做到区分不同电脑上同名的用户 +id。
至于第三点疑问很简单,我用的是虚拟机,硬盘都在宿主机上,都是我的硬盘,至于疑问三的后半段话也很好解释,这就是个概率问题,只要基数足够大,总能碰上相同的,不用到什么宇宙恒星数量级。lzc 是我本人名字的所写,想像中国人里面和我同名同姓的有多少,所以用户名相同太常见了 ; 至于 id,只要你用的是 opensuse,第一个非 root 用户,他的 id 都是 1000。

为什么需要区分?

为了让一个人换了发行版之后,原来的 home 目录权限不足吗?

对啊。你的测试是在同一台电脑上。你可以放心,你没有能力去弄互联网上其他人的文件,其他人想弄你的文件也没那么简单。

如果一个黑客专心攻击一台电脑的话。 三大系统最安全的就是 Linux 系统。 我记得几年前有个黑客大赛,一群黑客团队轮番攻击三台电脑,率先攻破一台电脑并且删除其中用户的重要文件,就能获得丰厚奖金。 Mac OS X 刚开赛,立即被攻破。 Windows 坚持了一天,仍然在第二天被攻破。 Linux 坚持到大赛结束,仍然没有任何团队将其攻破。

所以说 Linux 的安全方面,完全没必要担心。

测试过,我一会给你截个图,但是结果是另外一种情况,所以才来这里。

一个黑客,在自己的系统里创建了一个脚本文件,owner 是 lzc(在黑客的 Linux 上),然后,假设如你所说,把这个放到你的 Linux 里,那个脚本就能运行以你的 LInux 里的 lzc 身份为所欲为了是不是? 我不是反对这点,而是你这是在忽略了一个重大环节下的错觉。
那个黑客为什么能把脚本移动到你的 Linux 里?
这说明,他取得了你的 Linux 的权限! 黑客要做的还是取得目标系统的权限,没有什么变容易了……
所以说那个脚本在你的 Linux 里的 owner,是要看通过哪个用户把文件移过去,你拿虚拟机用 scp 试试就知道了,正如你前面拿 root 和 lzc 打开 U 盘会有两个不同的结果一样。
而那个 QQ 的例子里面,你说 user id 是主键,实际上用户是依托于系统的,一个文件的所属关系不只是用户,还要系统。正如不会出现 2 个一模一样的 QQ 号,Linux 世界也没有两个一样的文件。
为什么说你是错觉呢?你把第二台 Linux 用户名设置成 coffin 或者别的试试,你会发现,拿 coffin 打开 U 盘把文件传过来,owner 变成了 coffin,错觉就在于——你的两台 Linux 用户名一样。

打开帖子……感觉触目惊心啊, 到处彪红~

按照你的设想,如果你创建恒星数量级别的虚拟机,再创建 N 个用户。那么是不是用户 id 都要成千上万个数位长才能实现了?

完全不现实。

而且 Linux 也无法避免不碰到相同的 UID 和用户名。 因为 Linux 不会把用户的隐私收集到一个地方存起来。Linux 不是苹果、谷歌这样的互联网盈利公司。

第三个,你是否希望自己更换发行版之后原来的 home 目录无法访问?

第四个,动个脑筋。 root 用户,是不是所有人都是同样用户名? root 用户的 UID 重复概率很高吧? root 用户的权限之大你知道吧? 难道你自己使用 root 用户,就能轻松取得其他人的 root 权限了吗?

在一台电脑上,你有两个 Linux 系统。 使用这个 root,可以控制整个硬盘的文件。另外一个 root,也可以控制整个硬盘的文件。

但是并不代表你使用 root,就能够控制整个互联网中所有机器的文件了。 如果按照你说的,只要用户名、id 相同,黑客就随意控制互联网中他人的文件了。那么你是否只需要使用 root 操作电脑,就控制全世界了?

二者是完全不同的情况。 你远程登录一台电脑的时候,你就必须要输入对方电脑上用户的密码,才能够在对方系统中登录到这个账户,才能够获得相应权限。 而不是你自己用户名相同就自动获得权限。 加入我们两用户名、id 相同,你想获得我的文件,那么你必须登录到我的电脑上,输入我的密码,才能获得这个权限。 而不是你只需要使用你的账户访问我的 ip,就自动获得这个权限的(正如如上所言,如果如此,你只需要使用 root 登录电脑就肆无忌惮了)! 但是如果说你捡到了我的硬盘,这个时候你把我的硬盘插入到你的电脑里面,你就可以获得其中的文件了。 这个时候,你用自己的 root 密码一登录,就可以把我的硬盘里文件都删光了。

root 和 lzc 两个帐号打开 U 盘的问题。

你想一下。 加入说按照你的思路,打开 U 盘还是原来的权限。 那么我问个问题。 你还需要 U 盘吗? 拿 U 盘给其他人拷贝一个文件,因为用户不同无法访问??

关于你测试的结果不同。 你登录一台网络上的计算机。 需要使用该计算机中的用户名、密码,远程登录该计算机去获得权限。 并不是你使用一个用户名相同的账户浏览互联网,就获得了别人的权限。 你压根没登录进别人的计算机。

如果你捡到了别人的硬盘插进自己的电脑,那就是另一番景象了。

应该不难理解吧?

你自己切换一下自己 Linux 的终端看看就知道了。。

有点乱,首先感谢大家,让我学到知识了,还有我深信抬杠学能耐这句话,但我有时说话有点激动了,还请大伙原谅。我阅读了大伙的回帖,有的帖还没来得及阅读;而有的帖不是当时就能明白的,我会慢慢再思考思考,再做一些实验。然后一一把结果贴上。

我也不懂。但是你的有些提问,我感觉超出常理了。。

如果你不做服务器运行方面的工作的话。 花时间学这个,不如花时间学 awesome。 实用得多。再次,学一点 LaTeX。 再次,学点数学、物理什么的。 不吃这碗饭的,没必要了解这些。 我一直有个观点,就是 Linux 是个包容的世界。 但是现在你在互联网上搜索 “Linux 进阶”,全部都是一些权限、命令行、服务器配置的内容。 如果你不吃这碗饭,真的没这个必要。 这些东西不是 Linux 的唯一。

宝马车底盘好,不代表所有开宝马的人就一定要用宝马来飚车。 Linux 确实在这方面很好,但是不代表想学 Linux 就是学这个。 对于普通用户,我建议学点 awesome 啊一类实用的,能切实提高你现实中工作效率的东西。

我做了一个测试,就不截图了,因为咱们这个网站不能上传图片。请大家帮忙看看测试中是否有什么疏忽。

2 楼 coffin 童鞋所说的
“不要管文件在第一个 Linux 里面的 owner,而是看你是用哪个身份将文件从 U 盘拷到第二个系统里,这个决定了文件在第二个系统里的 owner。
也就是说,你既然你能把文件从别的地方拷到你的系统里来——那你理所应当是它的 owner——在这个系统里。”
—— 这个说法是错误的

我原先的理解,文件在用 U 盘拷贝来拷贝去的过程中 owner 不变。—— 这也是错误的。

我测试的结果是, 你用哪个用户打开的 U 盘,U 盘中的文件的 owner 就是哪个用户。

我测试的过程如下:我在第一台主机上用 lzc 用户新建 text 文件,然后 lzc 登出,再用 dasusr1 用户登录,并将 text 拷贝到 U 盘中(我不用 lzc 直接拷贝是因为 2 楼 coffin 说 U 盘中文件的 owner 是文件的拷贝者,所以我特地换另一个用户拷贝文件),再分别用 root、dasusr1、holdbelief 等身份登录(lzc、root、dasusr1 位于同一个虚拟机中,holdbelief 位于另一个非虚拟机 linux 机器中,总之为了避免错误,我进行了各种测试,我有很多台笔记本,也有很多虚拟机),当我用 root 登录打开 U 盘后,text 的 owner 变成了 root,同理 dasusr1 和 holdbelief 登录时 owner 分别变成了 dasusr1 和 holdbelief。

可见拷贝到 U 盘中的文件的 owner 是变化的,但不是拷贝者,而是拷贝之后用哪个身份查看 U 盘中的该文件,那个身份就是 owner。

请大家检查我这样的测试有什么疏漏的地方吗?如果没有应该可以证明我的结论。
但我不知道这和文件系统有关系吗?我的 U 盘是 fat 文件系统,如果是 ext4 结论是否相同我会再做测试。


经测试:以上结论只适用于 FAT 文件系统的 U 盘在 linux 之间拷贝文件,如果 U 盘是 Ext4 文件系统,则 U 盘中文件的 owner 是拷贝者。

大概是因为 FAT 文件系统中的权限模式和 linux 不一样,linux 只能谁打开 U 盘,谁就是 U 盘中所有文件的 owner,这样处理了。

我又测试了一下,好像 FAT32 本来就没有权限控制。这次我是在 windows 上测试的,FAT32 的 U 盘中的文件,点击右键,没有·「安全」选项卡;ntfs 文件系统 U 盘中的文件上点击右键,出现了·安全」选项卡。

结论是:

        1、如果是 linux 自身的文件系统(ext4,其他的没有做测试)的 U 盘,那么 U 盘中文件的 owner 是该文件的拷贝者。
        2、如果是 windows 的文件系统(FAT32、ntfs)的 U 盘放在 linux 上使用,那么谁打开的 U 盘,U 盘中的文件的 owner 就是谁。
        3、如果是 FAT32 文件系统的 U 盘,不论在 windows 上还是 linux 用,都没有权限(windows 上根本没有权限控制,linux 上见上一条)。

这个应该比较准确了。

如果人家打开 U 盘后完全没有进行拷贝操作,那么按照你的意思没有 owner 吗?

我之所以说你这样子只能是在「谈玄」,因为你对最原始的现象抽象得太「过」了。

比如:第二个 Linux 上同名用户访问第一个 Linux 就自动获得了第一个 Linux 上同名用户所有文件的读写权限。这其实完全不能说明「跨计算机同名用户登陆就自动对方获得文件读写权限」。因为怎么访问是个大问题,你这等于已经假设所有人的大门对你敞开,然后聊怎么偷东西(那还用聊吗?),然后下结论说人类的家太不安全了。你把 mount 或者 share 的过程完全抛开了,而之所以能够访问,能够有权限,其实完完全全是这两个中间过程做到的。