將文件複製到我是目錄組成員的目錄中
我正在嘗試將文件複製到我的使用者帳戶不是目錄所有者但屬於目錄組所有者的組的目錄中。這些是我採取的步驟:
創建一個組並將我添加到該組
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()
查看passwd
和group
數據庫以設置登錄的祖先程序的 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-group
和rw-rw-r--
權限。除了內容之外,要複製時間戳、所有權和權限,您還可以使用
cp -p
. GNUcp
還必須cp -a
盡可能多地複制元數據(簡稱--recursive --no-dereference --preserve=all
)。