关于chmod权限的疑问:只写与读写权限的区别及测试困惑
关于chmod 200(只写)与600(读写)权限的疑问解析
嘿,这个问题问得挺戳点的,我来帮你把这些疑惑拆解清楚~
首先先明确两个权限的核心差异:
chmod 200 test200.txt:只有文件的所有者拥有**写入(w)**权限,完全没有读取(r)和执行(x)权限chmod 600 test600.txt:文件所有者同时拥有**读取(r)+写入(w)**权限,同样没有执行权限
接下来聊你测试里遇到的“矛盾”——其实你忽略了文本编辑器的特殊工作机制,还有权限检查的细节:
1. 写入操作真的不需要读取权限吗?
你可能误以为“要写就得先读”,但其实得分情况:
- 如果是直接覆盖或追加写入(比如用
echo "hello" > test200.txt),只要所有者有写权限,哪怕没读权限也能成功——覆盖是直接清空原内容再写,追加是往文件末尾加内容,这两种操作都不需要读取文件里已有的内容。 - 但如果是修改文件中间的已有内容(比如把某一行的文本改掉),那确实得先把内容读到内存里才能编辑,这时候就必须要有读权限了。
2. 为什么你用vim编辑200权限的文件能保存,还能读取?
这锅得甩给vim的工作方式——它根本不是直接在原文件上改内容,而是用了“临时文件替换”的套路:
- 当你打开
test200.txt时,如果文件是空的,哪怕没读权限,vim也能打开(毕竟读空文件等于没读);要是文件本来有内容,作为普通用户的你没读权限的话,vim会直接提示你没法读取内容,只能输入新内容。 - 当你点保存时,vim会在同一个目录下生成一个临时文件(比如
.test200.txt.swp这类),这个临时文件的权限是跟着系统的umask走的(一般是644或600),然后把你编辑的内容写到这个临时文件里。 - 最后,vim会用这个临时文件直接替换掉原文件(用系统的
rename调用)。这里有个细节:默认情况下vim会尽量保留原文件的权限,但有些版本的vim如果发现原文件没读权限,可能会自动加上?或者你会不会在测试时不小心改了权限?
另外还有个可能性:你是不是用root用户做的测试?root是系统的“超级管理员”,完全无视文件权限的限制,不管你设什么权限,root都能随便读写,所以自然能读取200权限的文件。
3. 给你个靠谱的测试方法
要是想真的验证只写权限的限制,你可以试试这些操作:
- 用
cat test200.txt读文件:如果是普通用户且权限确实是200,肯定会弹出Permission denied - 用
echo "new stuff" > test200.txt直接写:普通用户有写权限,会成功覆盖内容 - 找个有内容的200权限文件,用vim打开:作为普通用户,vim会直接告诉你读不了内容,只能输入新内容再保存
总结一下:只写和读写权限的核心区别就是能不能读文件内容;你测试里的异常,要么是编辑器的临时文件机制在搞鬼,要么就是root权限绕过了权限检查~
内容的提问来源于stack exchange,提问作者aaronson
相关产品推荐
相关产品推荐

