bash - 羊群权限被拒绝 bash

标签 bash permissions flock

我写了一个小测试脚本来防止我的脚本与 flock 同时运行:

#!/bin/bash

scriptname=$(basename $0)
lock="/var/run/${scriptname}"
umask 0002

exec 200>$lock
flock -n 200 || exit 1

## The code:
sleep 60
echo "Hello world"

当我与我的用户一起运行脚本并尝试与另一个用户一起运行该脚本时,我收到以下带有锁定文件的错误消息。

/var/run/test.lock: Permission denied

有什么想法吗?

亲切的问候, 安德烈亚斯

最佳答案

在评论中,你提到了这一点

other user is in the same group. file permissions are -rw-r--r--

换句话说,只有第一个用户对锁定文件具有写入权限。

但是,您的脚本会:

exec 200>$lock

它试图打开锁定文件进行写入。因此出现“权限被拒绝”错误。

打开文件进行写入的好处是,如果文件不存在,它不会失败,但这也意味着如果您的脚本正在运行,您将无法轻易预测文件的所有者是谁同时由一个以上的用户。 [1]

在大多数 linux 发行版中,umask 将设置为 0022,这会导致新创建的文件具有权限 rw-r--r-- ,这意味着只有创建文件的用户才有写权限。这是明智的安全策略,但使用在两个或更多用户之间共享的锁文件会变得复杂。如果用户在同一个组中,您可以调整您的 umask,以便创建具有组写权限的新文件,记住之后将其设置回来。例如(未经测试):

OLD_UMASK=$(umask)
umask 002
exec 200>"$lock"
umask $OLD_UMASK

或者,您可以应用仅具有读取权限的锁定 [2],注意确保首先创建文件:

touch "$lock" 2>/dev/null # Don't care if it fails.
exec 200<"$lock"          # Note: < instead of >

注意事项:

[1]:exec 200>file 的另一个问题是,如果文件确实 存在,它将截断该文件,因此它仅适用于空文件。通常,除非您确定该文件不包含任何有用信息,否则您应该使用 >>>

[2]:flock 不关心文件打开的模式。有关详细信息,请参见man 1 flock

关于bash - 羊群权限被拒绝 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23469301/

相关文章:

linux - bash脚本通过循环同时Ping 1000+ ip

c# - UNC 共享目录不存在

c - 在 Linux 中以独占方式打开一个设备文件

linux - 不确定 flock 是如何工作的。需要澄清一下

linux - 符号链接(symbolic link)的绝对路径

linux - 脚本编程中的 Bash 编码

在程序退出后执行 EXIT 陷阱时 Bash 函数作用域状态!= 0 (set -e)

permissions - Mediawiki - 只有特定的用户组可以阅读/访问

linux - 为 Web 文件夹分配权限的最佳做法

python -/bin/sh : 1: Syntax error: word unexpected - Using os. system() 来自 Python