Bash

在 bash 腳本中執行 chown 會產生錯誤

  • January 15, 2016

我正在編寫一個腳本,該腳本下載具有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.shbar

[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.shfoo

[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)可以任意更改組。

您的程序既沒有特權,也沒有將其擁有的文件組更改為所有者所在的組。

因此,您將需要獲得適當的特權。最簡單的兩種方法是

  1. 編寫一個最小的二進製程序(可能在 C 中)來設置該文件的所有權(我假設文件的路徑名可以是硬編碼的,以防止濫用)並將其 set-user-id 設置為 root,甚至更好,添加CAP_CHOWN功能sudo setcap cap_chown+ep <program_name>,這不會使程序執行root與其所有後果一樣。
  2. 編寫一個合適的/etc/sudoers條目,以允許在sudo沒有密碼的情況下執行該特定命令:編寫一行,例如
bar ALL = (root) NOPASSWD: /bin/chown foo:server '/full/path/to/file'

到一個文件/etc/sudoers.d(並檢查是否/etc/sudoers有相應的#includedir指令 - 大多數 Linux 發行版都有)。確保腳本呼叫的命令完全匹配!

引用自:https://unix.stackexchange.com/questions/255408