Permissions

將文件複製到我是目錄組成員的目錄中

  • February 10, 2022

我正在嘗試將文件複製到我的使用者帳戶不是目錄所有者但屬於目錄組所有者的組的目錄中。這些是我採取的步驟:

創建一個組並將我添加到該組
stephen@pi:~ $ sudo groupadd test-group
stephen@pi:~ $ sudo usermod -a -G test-group stephen
stephen@pi:~ $ grep 'test-group' /etc/group
test-group:x:1002:stephen
創建文件並列出權限
stephen@pi:~ $ touch example.txt
stephen@pi:~ $ ls -l example.txt
-rw-r--r-- 1 stephen stephen 0 Feb  9 10:46 example.txt
創建目錄,將組屬主修改為新組並更改目錄權限以授予組寫入權限
stephen@pi:~ $ sudo mkdir /var/www/testdir
stephen@pi:~ $ sudo chown :test-group /var/www/testdir/
stephen@pi:~ $ sudo chmod 664 /var/www/testdir/
stephen@pi:~ $ sudo ls -l /var/www
total 8
drwxr-xr-x 2 root    root       4096 Oct 31 12:17 html
drw-rw-r-- 2 root    test-group 4096 Feb  9 10:48 testdir
將新創建的文件複製到此目錄
stephen@pi:~ $ cp example.txt /var/www/testdir/straight-copy.txt
cp: failed to access '/var/www/testdir/straight-copy.txt': Permission denied

對我來說,這應該是成功的;我是擁有此目錄所有權的組的成員,並且組權限設置為 rw。最終,我希望復製到此目錄的任何文件都繼承父目錄(/var/www/testdir)的權限。

我可以用 複製sudo,但這不會從父目錄繼承所有者或權限,也不會保留原始所有權(可能是因為我被提升為 root 進行複制):

複製sudo並列出文件的所有權/權限
stephen@pi:~ $ sudo cp example.txt /var/www/testdir/straight-copy.txt
stephen@pi:~ $ sudo ls -l /var/www/testdir/
total 0
-rw-r--r-- 1 root root 0 Feb  9 11:06 straight-copy.txt

請問有人可以向我解釋發生了什麼嗎?

當你這樣做時:

sudo usermod -a -G test-group stephen

僅修改了組數據庫(/etc/group在您的情況下為內容)。相應的 gid 不會自動添加到執行 shell 的程序的補充 gid 列表中(或任何以stephen’ uid 作為其有效或真實 uid 的程序)。

如果您執行id -Gn(啟動一個新程序(繼承 uids/gids)並id在其中執行),或者ps -o user,group,supgrp -p "$$"(如果您的支持ps)列出 shell 程序的那些,您會看到test-group不在列表中。

您需要註銷並再次登錄以使用更新的組列表(login(或其他登錄應用程序)呼叫啟動新程序,該呼叫initgroups()查看passwdgroup數據庫以設置登錄的祖先程序的 gid 列表會議)。

如果你這樣做sudo -u stephen id -Gn了,你會發現它test-group也在那裡,sudo也使用initgroups()或等效於為目標使用者設置 gid 列表。與sudo zsh -c 'USERNAME=stephen; id -Gn'

此外,如單獨提到的,您需要對目錄具有搜尋( x) 權限才能訪問(包括創建)其任何條目。

因此,在這裡,無需註銷並重新登錄,您仍然可以執行以下操作:

# add search permissions for `a`ll:
sudo chmod a+x /var/www/testdir

# copy as the new you:
sudo -u stephen cp example.txt /var/www/testdir/

您還可以使用它newgrp test-group來啟動一個新的 shell 程序,test-group並將其作為其真實有效的 gid,並將其添加到補充 gid 列表中。

newgrp將允許它,因為您已被授予組數據庫中該組的成員資格。在這種情況下不需要管理員權限。

或者sg test-group -c 'some command'執行shell以外的東西。這樣做sg test-group -c 'newgrp stephen'的效果是在恢復原始 (e)gid 的同時僅添加test-group到您的補充 gid。

還可以使用該install實用程序製作文件副本並同時指定所有者、組和權限:

sudo install -o stephen -g test-group -m a=r,ug+w example.txt /var/www/testdir/

要複製example.txt,使其歸 擁有stephen,具有組test-grouprw-rw-r--權限。

除了內容之外,要複製時間戳、所有權和權限,您還可以使用cp -p. GNUcp還必須cp -a盡可能多地複制元數據(簡稱--recursive --no-dereference --preserve=all)。

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