在 bash 腳本中執行 chown 會產生錯誤
我正在編寫一個腳本,該腳本下載具有
bar:bar
所有權的文件,然後將所有權更改為foo:server
. 所以我寫了一個腳本(chown_test.sh
)來實現所有權的改變chown
。一旦工作,我會將它注入主腳本,但我遇到了一個問題(如下所示),可能是由於我缺乏使用chown
.**注意:**我試圖在下麵包含所有必要的資訊,但如果您需要更多資訊,請通過評論告訴我。
目錄結構、所有權和權限:
+ drwxrwxr-x 2 foo:server chown_test # test directory ├─ -rwxrwxr-- 1 foo:server chown_test.sh # side script ├─ -rwxrwxr-- 1 bar:bar file # empty file
相關條目來自
/etc/group
:sudo:x:27:foo bar:x:33:foo foo:x:1000: server:x:1003:bar,foo
chown_test.sh
程式碼:#!/bin/bash echo "User: $USER" chown foo:server ./file
我也嘗試過
sudo chown foo:server ./file
,但這提示我輸入 sudo 密碼bar
,它沒有 sudo 密碼。執行輸出
chown_test.sh
為bar
:[16:13 foo@Opus]:~/chown_test$ **sudo -H -u bar bash -c ./chown_test.sh** User: bar chown: changing ownership of ‘./file’: Operation not permitted
執行輸出
chown_test.sh
為foo
:[16:14 foo@Opus]:~/chown_test$ **./chown_test.sh** User: foo chown: changing ownership of ‘./file’: Operation not permitted
有人可以闡明我的困境嗎?
感謝您閱讀我的問題。
更新:
在Toby Speight 的回答和評論的幫助下,我找到了一個快樂的媒介。
因為,“只有特權程序(Linux:有
CAP_CHOWN
能力的程序)可以更改文件的所有者。文件的所有者可以將文件的組更改為該所有者所屬的任何組。” ,然後我只是決定只更改組,而不是所有者。我通過將
chown
命令更改chown_test.sh
為:chown :server ./file
結果:
├─ -rwxrwxr-- 1 bar:server file
哪個適合我,但如果不適合您,請查看下面Toby Speight 的答案以獲取更多資訊。
從
chown(2)
手冊頁:只有特權程序(Linux:有
CAP_CHOWN
能力的程序)可以更改文件的所有者。文件的所有者可以將文件的組更改為該所有者所屬的任何組。特權程序(Linux:帶有CAP_CHOWN
)可以任意更改組。您的程序既沒有特權,也沒有將其擁有的文件組更改為所有者所在的組。
因此,您將需要獲得適當的特權。最簡單的兩種方法是
- 編寫一個最小的二進製程序(可能在 C 中)來設置該文件的所有權(我假設文件的路徑名可以是硬編碼的,以防止濫用)並將其 set-user-id 設置為 root,甚至更好,添加
CAP_CHOWN
功能sudo setcap cap_chown+ep <program_name>
,這不會使程序執行root
與其所有後果一樣。- 編寫一個合適的
/etc/sudoers
條目,以允許在sudo
沒有密碼的情況下執行該特定命令:編寫一行,例如bar ALL = (root) NOPASSWD: /bin/chown foo:server '/full/path/to/file'
到一個文件
/etc/sudoers.d
(並檢查是否/etc/sudoers
有相應的#includedir
指令 - 大多數 Linux 發行版都有)。確保腳本呼叫的命令完全匹配!