2012-09-16 34 views
3

我正在編寫一個bash腳本來更新某些文件/目錄,我想在腳本中運行umask以設置腳本創建的文件/目錄的默認權限。我知道我可以爲umask設置文件和目錄的權限,但是我需要權限對於文件和文件夾不同。爲文件和文件夾設置不同的Umask

I want files to be: -rw----r-- (0604) 
I want folders to be: drwx-----x (0701) 

我可以使用umask來做到這一點嗎?如果是這樣,我該如何去做呢?如果不是什麼是實現它的最好方法?先謝謝你。

+0

你確定要在目錄(其他)上使用-x嗎?這意味着其他人只有在知道文件名時才能讀取目錄中的文件。如果你可以接受目錄上的rwx --- r-x,umask 072將會適用。 –

回答

7

有趣的需求。目前(至少在bash),umask是一個全局設置,不能根據對象類型進行設置。浮現在腦海

一個解決辦法是到umask設置爲文件變體,然後攔截來電mkdir(如與用戶創建的mkdir早些時候在路徑腳本)做:

umask 0701 ; /path/to/real/mkdir $1 ; umask 0604 

這樣,假設您的所有目錄創建都使用mkdir完成,則可以確保它們使用不同的umask設置。

請注意,該腳本可能應該更健壯一些,如恢復以前的umask,而不是強制它到0604,並添加一些更好的錯誤檢查和可能的處理多個參數的能力。

但這就是所有細節,上面的框架應該足以讓你開始。

+0

@Nick,不,tar會自己創建目錄,沒有機會使用這種攔截方法。實際上,您可以_may_查找tar,而不管umask如何使用內部權限。嘗試改變權限會導致訪問權限可能出錯。您可以通過解壓縮到單獨的受保護目錄中,然後更改權限,然後在保留權限的情況下移動文件來解決此問題。 – paxdiablo

4

umask不是文件的進程屬性 - 這是UNIX體系結構的一部分,與Bash或任何其他shell程序無關。

真正的問題是您正在使用的程序不允許在創建時更改權限。例如,在C中,mkdir具有第二參數模式

雖然您不需要編寫C語言,但Python和Perl允許您使用低級接口。權限將由進程umask修改,因此,如果您不想進行任何修改,請將unmask設置爲零。

/home/user1> umask 000 
/home/user1> python -c 'import os;os.mkdir("mydir",0701)' 
/home/user1> ls -ld mydir 
drwx-----x 2 user1 QAPLADV 4096 Sep 16 10:28 mydir 

/home/user1> python -c 'import os;os.open("myfile",os.O_CREAT,0604)' 
/home/user1> ls -l myfile 
-rw----r-- 1 user1 QAPLADV 0 Sep 16 10:32 myfile 

不要忘了,umask仍是000在這一點上,你可能想將其設置回其以前的值,如果你在做任何其他工作在同一個進程。

這裏是一個Perl的版本,如果你喜歡:

perl -e "mkdir mydir,0701" 
perl -MFcntl -e 'sysopen(my $h,"myfile",O_EXCL|O_CREAT,0604)' 

當然,如果你有大量的文件,你就可能要經常跑這一點,那麼你會好得多寫Perl或Python程序來完成這項工作 - 爲每個文件調用perl或python是低效的。

+1

你必須知道unix util mkdir a接受apermission參數,即'mkdir -m 750 umaskTest'完全相同,但沒有所有額外的'-c ....'東西?好的前兩段。祝你們好運。 – shellter

+0

@shellter本應該是|答案 – xenoid

0

將以下放在用戶的。bashrc中:

的umask 0222

別名MKDIR = '的mkdir -mu = RX,G = RX,O ='

該文件將具有的umask 0222被創建,而MKDIR將使用的umask 0227.