`
wengshanjin
  • 浏览: 22750 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

见证超级用户的超级权限

阅读更多

    今天,某同事向我反应,我写的程序有问题。出问题的大致功能是这样的,我需要在不修改原文件的情况下,备份一个新的文件出来(新文件最后一小部分内容还保存在内存)。实现方法的方法很简单,读取旧文件,然后将内容写到新文件,读取完旧文件后,再将内存部分内容写到新文件。现在问题出来了,备份的新文件比旧文件小很多,只看到一小部分内容(我猜是原先保存在内存的那部分)。在同事的电脑上测试,每次都可以重现,但我在我的电脑上测试总是无法重现。没办法,只能在单元测试工具上添加一个unit test case来跟踪测试。重现了,可以重现了,仔细跟踪,原因是这样的...
    首先,为了不让其他线程修改新文件,我以mode为0的模式打开新文件(假设名叫file1,如果文件不存在,就创建一个),然后往里面写内容,直到写完内容(还有一小部分保存在内存)。当需要备份file2文件打开file1时,打开文件失败(因为mode为0,无可读不可写),导致无法备份file1文件里的内容,只保存了内存部分。那为什么同事电脑上每次都可以重现,而我的电脑上却不能重现呢。这就是超级用户的超级权限,我的电脑上使用的是root用户测试,而同事使用的是普通用户。看个例子就知道了(使用普通用户和root用户分别创建一个文件,改mode为0,再读取该文件,结果root可以读,而普通用户不可以读)
//测试普通用户

[welkin@dev91 ~]$ cd /tmp/
[welkin@dev91 /tmp]$ touch welkin
[welkin@dev91 /tmp]$ chmod 000 welkin
[welkin@dev91 /tmp]$ cat welkin 
cat: welkin: 权限不够
[welkin@dev91 /tmp]$ 

 

//测试root用户

[root@dev91 tmp]# touch root
[root@dev91 tmp]# chmod 000 root
[root@dev91 tmp]# cat root 
[root@dev91 tmp]# 

 
看两个文件的mode全部是0

[welkin@dev91 /tmp]$ ll root welkin 
----------  1 root   root   0  4月 22 19:03 root
----------  1 welkin welkin 0  4月 22 19:02 welkin
[welkin@dev91 /tmp]$ 

 

这就是超级用户的超级权限,通过这个例子看出,即使改mode为0,当用root运行程序,其他线程也可以读的。如果不想让其他线程读,应该对文件加个线程锁,而不是把mode改为0。
总之,把文件的mode改为0是不安全的,可能会出现想让其他进程读的却读不了,而不想让其他线程读的,却可以读取到了

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics