我有可以从同一台计算机上的不同用户运行的脚本。该脚本应在每次运行时将日志写入同一文件。
脚本的最小版本:
#!/usr/bin/env bash
# 2
touch /var/tmp/lll.log # 3
chmod 666 /var/tmp/lll.log # 4 (You can comment this line, but this will change nothing)
echo ghghhghg >> /var/tmp/lll.log # 5
从 root 启动然后从其他用户启动时没有问题,但顺序相反时会抛出错误。
./savetmp.sh: line 5: /var/tmp/lll.log: Permission denied
ls -ld /var/tmp /var/tmp/lll.log 的输出:
.rw------- 9 armoken 1 May 10:52 /var/tmp/lll.log
drwxrwxrwt - root 1 May 10:52 /var/tmp
猫 /proc/sys/fs/protected_regular:
1
如何解决这个问题?
当您以用户身份运行此文件时,
armoken
将根据您当前的权限设置创建文件,您可以读/写该文件,但其他人不能:因此,当其他用户尝试写入此文件时,他们无权这样做。
但是,它比这更复杂,因为您在系统内核中启用了受保护的常规文件
cat /proc/sys/fs/protected_regular
安全功能(返回非零)。这意味着,无论这些权限如何,除了所有者之外,没有人可以写入粘性目录中的文件,例如/var/tmp
- 甚至不能root
- 除非该文件由目录本身的所有者拥有。因此,如果您希望每个人都能够读取/写入此目录中的此文件,您需要对其进行设置,以便
root
拥有它并且任何人都可以写入它。但请记住,这意味着其他人也可以删除或更改文件中的内容。但这不是防御性编码,因为任何人仍然可以创建该文件并阻止其他人使用它。
更好的解决方案可能是使用记录器。例如,这将写入通过
journalctl
(和/或/var/log/user.log
以其他方式)管理的文件