我已经尝试了很多 chmod 和 chown 以及它们的组合。
我仍然希望该用户的主目录中的文件对该用户可读,但不可写或可执行。但是,我仍然希望用户的主文件夹可由该用户写入,因此用户可以将文件添加到该文件夹,但不能删除文件夹内已运行这些命令的文件。
更多数据:
- 该主目录已加密
- 我真的不在乎我要求的解决方案是否是多行,只要我可以将其放入 bash 脚本中
答案1
我知道执行您要求的操作的唯一方法是使用 chattr(1) ,顾名思义,它会更改文件属性。
在属性部分您可以阅读:
“具有‘i’属性的文件无法修改:无法删除或重命名,无法创建到该文件的链接,无法修改该文件的大部分元数据,并且无法以写入模式打开该文件。只有超级用户或拥有 CAP_LINUX_IMMUTABLE 能力的进程才能设置或清除此属性。”
--实际案例:
: lsattr example.file
------------------- example.file
: ls -lh example.file
-rw------- 1 tntx tntx 15 Dec 23 20:43 example.file
: su -
Password:
root@foo: chattr +i example.file
root@foo: exit
logout
: lsattr example.file
----i-------------- example.file
: cat example.file
testing chattr
: echo "adding text" >> example.file
ksh93: example.file: cannot create [Operation not permitted]
Same with vi:
Read-only file, not written; use ! to override.
:w!
Error: example.file: Operation not permitted.
And then trying to mv:
: mv example.file example.file2
mv: cannot move 'example.file' to 'example.file2': Operation not permitted
What about cp:
: ls -lh example.file*
-rw------- 1 tntx tntx 15 Dec 23 20:43 example.file
-rw------- 1 tntx tntx 15 Dec 23 21:02 example.file2
: /usr/bin/lsattr example.file*
----i-------------- example.file
------------------- example.file2
因此它会失败,因为您可以将文件锁定为只能由用户读取,但可以自由地 cp(1) 并在新文件中进行编辑。
答案2
chmod 是不够的,因为用户可以更改模式。
首先阻止用户编辑文件:
- chmod go-w «文件名»
- chown «其他用户» «文件名»
现在用户仍然可以删除该文件,所以让我们阻止它。 (如果从包含的目录中删除文件,则该文件将被删除。我们需要停止它。)
- chown «其他用户» «包含目录»
- chmod +t «包含目录»
现在让用户可以写入包含目录
- chown «用户名» «包含目录»
- chmod g+w «包含目录»
您无法阻止执行。您无法设置执行位,但如果用户可以读取该文件,那么他们就可以复制它。如果他们可以复制它,那么他们就可以使其可执行。