2017-02-15 419 views
0

我創建了一個目錄/share並給了chmod 2770權限和chown root:stock /sharelinux文件和文件夾沒有繼承父目錄的權限

1)當我創建觸摸到內部/share一個文件,我看到該文件有rw-rw-r--,我沒有看到rwxrws---

2)當我在/share/data創建一個目錄,我看到准許,drwxrwsr-x在哪裏父目錄是drwxrws---

如何獲取父級子文件和子級目錄的固有父級權限完全相同。

+0

請參閱[setgid目錄的用途是什麼?](http://serverfault.com/questions/93894/whats-the-purpose-of-setgid-directory) –

+0

請解釋一下你正在嘗試的問題解決。你需要做什麼? –

回答

0

當你創建一個文件或目錄

  • 新的文件或目錄的所有者將是你的有效用戶ID(euid)。您可以使用su other_user命令(它會提示您輸入的密碼爲other_user)或sudo su other_user(根據/etc/sudoers*中的設置可能允許或不可以,可能要求輸入密碼)更改用戶標識。創建文件或目錄後,您可以使用sudo chown other_user file_name更改其所有者。

  • 新文件或目錄的組將是您的有效組ID。您可以預先使用newgrp other_group命令更改您的組ID。如果您的當前目錄有other_group作爲組,並且它的setgid位已設置,則您的有效組ID將爲other_group。創建文件或目錄後,可以使用chgrp other_group file_name更改其組。 newgrpchgrpsetgid將工作,如果你是other_group的成員。如果你不是,他們不會:一個組密碼機制在理論上仍然存在,但幾十年前它已被棄用,我從來沒有見過任何人使用它。當然,如果你想改變兩者,你總是可以用sudo chgrp other_group file_name,甚至可以用sudo chown other_user:other_group file_name

  • 新文件或目錄的讀取和寫入權限將取決於您的umask,這通常由您的配置文件在登錄時設置。最常用的umask值是022,其中,對於文件,將給你-rw-r--r--002哪些會給你-rw-rw-r--。命令umask將爲您提供當前值。您可以使用umask new_value來設置另一個值,它會一直有效,直到您更改它或退出您的shell。除非您在umask中有奇數值,否則目錄也將具有默認設置的所有執行權限,這會阻止相應的執行位。例如。一個umask值027將創建-rw-r-----drwxrwx---目錄的文件。請參閱文檔以獲得完整的說明。另外,如果父目錄具有setgid位,則新目錄也會有。默認情況下,無法設置setuidsticky位,也無法設置文件的setgid位。e

  • 事實上,您始終可以使用命令chmod設置所需的權限。

這就是說,沒有標準的命令會做你想要的。但是,您可以輕鬆地編寫像以下這樣的bash函數並使用它們(在需要時將它們寫入文件mycreat_functionssource mycreat_functions)。這將用於手動創建的文件和目錄。對於由程序創建的文件,shell重定向等,您仍然需要手動更正權限。

function mymkdir() { 
    local parentperms 
    for a in "[email protected]"; do 

    mkdir "$a" 

    # This copies all permissions of the parent, 
    # exactly as they are 
    parentperms="$(stat -c%a $(dirname "$a"))" 
    chmod "$parentperms" "$a" 

    # if I’m root... 
    if [ $(id -u) = 0 ]; then 
     chown "$(stat -c%u:%g "$a")" "$a" 
    fi 

    done 
} 


function mytouch() { 
    local parentperms newperms 
    for a in "[email protected]"; do 

    touch "$a" 

    # This inherits all permissions of the parent, 
    # but removes the excution and setgid bits, as is 
    # appropriate for files. 
    parentperms="$(stat -c%a $(dirname "$a"))" 
    newperms="$(printf %o $((8#$parentperms & 8#5666)))" 
    chmod "$newperms" "$a" 

    # if I’m root... 
    if [ $(id -u) = 0 ]; then 
     chown "$(stat -c%u:%g "$a")" "$a" 
    fi 

    done 
} 

注:所有者,組和權限存儲在的inode,那裏還對如何獲取該文件的內容等信息; 目錄條目將inode與文件名相關聯,並且ls -i顯示所列文件的索引節點號。當你拷貝一個文件時,你創建一個新的目錄項並分配一個新的inode,所以這裏提到的一切都適用。當您將移動到文件時,您會在新位置創建一個新的目錄條目,但指向舊的索引節點,以便實際上不會觸及擁有者,組和權限。如果您希望它們根據新目錄條目的父項進行更改,則必須沿上述mytouchmymkdir的行創建mymv函數。

+0

那麼,當在dir1上設置sgid並且我從外部複製到dir1時,我會得到與dir1相同的組,但是當我將該文件從外部移動到dir1時,那麼被移動文件的組不是dir1? – Rockshell

+0

@Rockshell我編輯了我的答案來澄清這一點。 – Dario

+0

謝謝達里奧,那麼提到...我得到了我的答案。 – Rockshell

1

setgid位上的一個目錄,使新的文件繼承group從目錄,而不是它的權限。

控制在創建文件時設置的位的標準方式是控制創建過程的umask(askubuntu),而不是文件系統。

+0

有什麼辦法可以繼承父權限嗎? – Rockshell

+0

不是來自目錄,但是如果所有文件都是由相同的進程創建的,則可以設置umask(包含在答案中的鏈接)。 –

+0

那麼,當在dir1上設置sgid,並且我從外部複製到dir1時,我會得到與dir1相同的組,但是當我將該文件從外部移動到dir1時,那麼移動的文件組不是dir1? – Rockshell