群权限被拒绝 bash

5 permissions bash 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"
Run Code Online (Sandbox Code Playgroud)

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

/var/run/test.lock: Permission denied
Run Code Online (Sandbox Code Playgroud)

任何想法?

亲切的问候,安德烈亚斯

ric*_*ici 5

在评论中,您提到

其他用户在同一组中。文件权限是-rw-r--r--

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

但是,您的脚本会:

exec 200>$lock
Run Code Online (Sandbox Code Playgroud)

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

打开文件进行写入的优点是,如果文件不存在,写入也不会失败,但这也意味着,如果您的脚本由多个脚本同时运行,您将无法轻松预测该文件的所有者是谁。比一个用户。[1]

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

OLD_UMASK=$(umask)
umask 002
exec 200>"$lock"
umask $OLD_UMASK
Run Code Online (Sandbox Code Playgroud)

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

touch "$lock" 2>/dev/null # Don't care if it fails.
exec 200<"$lock"          # Note: < instead of >
Run Code Online (Sandbox Code Playgroud)

笔记:

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

[2]:flock不关心文件以什么模式打开。请参阅 参考资料 获取man 1 flock更多信息。


Avi*_*Raj 0

运行整个脚本而sudo /path/script.sh不是仅/path/script.sh