在 Linux 中实现 Shell 文件保护


概述

本文将向您展示如何使用 Linux 文件系统权限保护您的文件免受未经授权的访问,以及如何使用 chmod 命令为特定用户或用户组设置权限。

除了帮助我们保护文件免受误用的 Linux 文件权限机制之外,大多数 Linux shell 都有内置的安全措施来防止意外覆盖文件。我们将在本文中介绍其中的一些。

使用 noclobber 保护文件

所有 POSIX shell 实现都支持 noclobber 选项。如果您使用的是 shell 脚本,这意味着如果您尝试覆盖现有目录,shell 将会报错。

默认情况下,由于传统原因,noclobber 选项默认处于禁用状态。要为 bash 或 ksh 启用它,请运行以下命令:

set -o noclobber

要在运行脚本时使用 csh 或 tcsh,我们首先需要设置一个名为“csh”的环境变量

set noclobber

如果我们设置了 noclobber 选项,那么当我们尝试覆盖文件时,Bash 将会报错:“文件已存在”。

set -o noclobber
touch temp.txt          # Create temp.txt file
echo "Hello" > temp.txt # Try to overwrite file contents
-bash: temp.txt: cannot overwrite existing file

使用 cshell(或 tcsh)时,错误消息会稍微复杂一些:

set noclobber
touch temp.txt # Create temp.txt file
echo "Hello" > temp.txt # Try to overwrite file contents
temp.txt: File exists

我们应该注意,我们没有通过重定向来防止文件覆盖。如果您使用命令行工具 rm 删除文件,使用 shell 运算符“>>”将其输出重定向到另一个文件,或从应用程序内部写入文件,那么一切都会正常。

覆盖保护

我们可以通过禁用 shell 选项或临时覆盖 shell 选项来禁用 noclobber 限制,从而恢复到默认行为。例如,如果我们想为当前会话禁用 noclobber 限制,我们可以运行以下命令:

set +o noclobber

“在 tcsh/csh 中”,这意味着:

unset noclobber

要临时覆盖 noclobber 行为,我们的 shell 进程提供了特殊的重定向运算符:“>!” 和“>|”。让我们使用 bash 展示我们最初的示例:

set -o noclobber
touch temp.txt # Create temp.txt file
echo "Hello" > temp.txt # Try to overwrite file contents
-bash: temp.txt: cannot overwrite existing file
echo "Hello" >| temp.txt # Overwrite file contents using override operator

使用 tcsh 时,我们只需将“>|”替换为“>!”:

set noclobber
touch temp.txt # Create temp.txt file
echo "Hello" > temp.txt # Try to overwrite file contents
temp.txt: File exists
echo "Hello" >! temp.txt # Overwrite file contents using override operator

示例:截断日志文件

我们可能希望使用此功能的一个示例是截断日志文件。因此,日志往往会被保持其内容的服务打开。因此,我们通常无法删除它们,因为操作系统会跟踪打开的文件句柄。要截断日志,我们将 /dev/* 重定向到文件:

/dev/null >| my_logfile.log

此解决方案还有一个额外的好处:当内容保持不变时,它不会更新修改日期。因此,如果您在 cron 中运行重定向并且内容保持为空,则修改日期将显示脚本最后一次更改。

如果您想使用命令行重定向方法,但不想使用 -s 标志,另一个选择是使用 truncate。下一个示例将与前一个示例具有相同的结果,它将文件大小调整为零。

truncate -s 0 my_logfile.log

truncate (truncate) 函数还有一个优势,因为它允许我们将日志文件调整到任何大小。下一个示例将我们的日志文件缩小到 50 MB:

truncate -s 50M my_logfile.log

结论

在这里,我们讨论了 noclobber 命令以及如何实现 shell 文件保护。我们还介绍了使用 truncate 作为文件大小调整的可选工具。

更新于:2022-12-23

204 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告