簡體   English   中英

群權限被拒絕 bash

[英]flock permission denied 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"

當我與我的用戶一起運行該腳本並嘗試與另一個用戶一起運行該腳本時,我收到以下帶有鎖定文件的錯誤消息。

/var/run/test.lock: Permission denied

任何的想法?

親切的問候, 安德烈亞斯

在評論中,你提到了這一點

其他用戶屬於同一組。 文件權限是-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

通過sudo /path/script.sh而不是僅使用/path/script.sh運行整個腳本

由於更新了內核,我在 Ubuntu 20.04 中從 Ubuntu 19.10 中發現了這一點。 您必須以擁有文件的用戶身份登錄,而不是其組與文件權限匹配的用戶。 即使 sudo -u 也會顯示“權限被拒絕”或“此帳戶當前不可用”。 它會影響 fifo 文件,例如 flock 命令使用的文件。

更改的原因是由於安全漏洞。

有一種解決方法可以恢復舊行為:

使用以下內容創建/etc/sysctl.d/protect-links.conf

fs.protected_regular = 0

然后重新啟動procps:

須藤 systemctl 重啟 procps.service

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM