如何使用户主目录中的文件对该用户不可编辑,但保留主目录可编辑?

如何使用户主目录中的文件对该用户不可编辑,但保留主目录可编辑?

我已经尝试了很多 chmod 和 chown 以及它们的组合。

我仍然希望该用户的主目录中的文件对该用户可读,但不可写或可执行。但是,我仍然希望用户的主文件夹可由该用户写入,因此用户可以将文件添加到该文件夹​​,但不能删除文件夹内已运行这些命令的文件。

更多数据:

  1. 该主目录已加密
  2. 我真的不在乎我要求的解决方案是否是多行,只要我可以将其放入 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 «包含目录»

您无法阻止执行。您无法设置执行位,但如果用户可以读取该文件,那么他们就可以复制它。如果他们可以复制它,那么他们就可以使其可执行。

相关内容