chmod

改變文件讀寫許可設置的函數

chmod是一個計算機函數,功能是改變文件的讀寫許可設置,如果改變成功返回0,否則返回-1,函數原型是int chmod( const char *filename, int pmode)。

簡介


C語言函數

函數原型

函數名稱:chmod
函數原型:int chmod( const char *filename, int pmode );
所屬庫:io.h
函數功能:改變文件的讀寫許可設置,如果改變成功返回0,否則返回-1

示例

這個例子中實現了把文件sample.txt設置為只讀文件:
備註:S_IRUSR S_IWUSR S_IXUSR均定義在sys/stat.h頭文件下
可以使用命令chmod來為文件或目錄賦予許可權。Linux/Unix檔案存取許可權分為三級 : 檔案擁有者、群組、其他。利用 chmod 可以藉以控制檔案如何被他人所存取。
使用許可權:所有使用者
格式:chmod [-cfvR] [--help] [--version] mode file...
參數說明:
mode : 許可權設定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中u 表示該檔案的擁有者,g 表示與該檔案的擁有者屬於同一個群體(group)者,o 表示其他以外的人,a 表示這三者皆是。
+ 表示增加許可權、- 表示取消許可權、= 表示唯一設定許可權。
r 表示可讀取,w 表示可寫入,x 表示可執行,X 表示只有當該檔案是個子目錄或者該檔案已經被設定過為可執行。
-s :在文件執行時把進程的屬主或組ID置為該文件的文件屬主。
-c : 若該檔案許可權確實已經更改,才顯示其更改動作
-f : 若該檔案許可權無法被更改也不要顯示錯誤訊息
-v : 顯示許可權變更的詳細資料
-R : 對目前目錄下的所有檔案與子目錄進行相同的許可權變更(即以遞迴的方式逐個變更)
--help : 顯示輔助說明
--version : 顯示版本
相關函數:fchmod, stat, open, chown
頭文件:#include #include
定義函數:int chmod(const char * path, mode_t mode);
函數說明:chmod()會依參數mode 許可權來更改參數path 指定文件的許可權。
參數 mode 有下列數種組合:
1、S_ISUID 04000 文件的 (set user-id on execution)位
2、S_ISGID 02000 文件的 (set group-id on execution)位
3、S_ISVTX 01000 文件的sticky 位
4、S_IRUSR (S_IREAD) 00400 文件所有者具可讀取許可權
5、S_IWUSR (S_IWRITE)00200 文件所有者具可寫入許可權
6、S_IXUSR (S_IEXEC) 00100 文件所有者具可執行許可權
7、S_IRGRP 00040 用戶組具可讀取許可權
8、S_IWGRP 00020 用戶組具可寫入許可權
9、S_IXGRP 00010 用戶組具可執行許可權
10、S_IROTH 00004 其他用戶具可讀取許可權
11、S_IWOTH 00002 其他用戶具可寫入許可權
12、S_IXOTH 00001 其他用戶具可執行許可權
註:只有該文件的所有者或有效用戶識別碼為0,才可以修改該文件許可權。
基於系統安全,如果欲將數據寫入一執行文件,而該執行文件具有S_ISUID 或S_ISGID 許可權,則這兩個位會被清除。如果一目錄具有S_ISUID 位許可權,表示在此目錄下只有該文件的所有者或root 可以刪除該文件。
返回值:許可權改變成功返回0, 失敗返回-1, 錯誤原因存於errno.
錯誤代碼:
1、EPERM 進程的有效用戶識別碼與欲修改許可權的文件擁有者不同, 而且也不具root 許可權.
2、EACCESS 參數path 所指定的文件無法存取.
3、EROFS 欲寫入許可權的文件存在於只讀文件系統內.
4、EFAULT 參數path 指針超出可存取內存空間.
5、EINVAL 參數mode 不正確
6、ENAMETOOLONG 參數path 太長
7、ENOENT 指定的文件不存在
8、ENOTDIR 參數path 路徑並非一目錄
9、ENOMEM 核心內存不足
10、ELOOP 參數path 有過多符號連接問題.
11、EIO I/O 存取錯誤
範例

Linux命令


命令描述

變更文件或目錄的許可權。在UNIX系統家族裡,文件或目錄許可權的控制分別以讀取,寫入,執行3種一般許可權來區分,另有3種特殊許可權可供運用,再搭配擁有者與所屬群組管理許可權範圍。您可以使用chmod指令去變更文件與目錄的許可權,設置方式採用文字或數字代號皆可。符號連接的許可權無法變更,如果您對符號連接修改許可權,其改變會作用在被連接的原始文件。許可權範圍的表示法如下:
u:User,即文件或目錄的擁有者。
g:Group,即文件或目錄的所屬群組。
o:Other,除了文件或目錄擁有者或所屬群組之外,其他用戶皆屬於這個範圍。
a:All,即全部的用戶,包含擁有者,所屬群組以及其他用戶。
有關許可權代號的部分,列表於下:
r:讀取許可權,數字代號為"4"。
w:寫入許可權,數字代號為"2"。
x:執行或切換許可權,數字代號為"1"。
-:不具任何許可權,數字代號為"0"。
s:當文件被執行時,根據who參數指定的用戶類型設置文件的setuid或者setgid許可權。

語法

chmod [-cfRv][--help][--version][<許可權範圍>+/-/=<許可權設置...>][文件或目錄...]
chmod [-cfRv][--help][--version][數字代號][文件或目錄...]
chmod [-cfRv][--help][--reference=<參考文件或目錄>][--version][文件或目錄...]

選項說明

-c或--changes 效果類似"-v"參數,但僅回報更改的部分。
-f或--quiet或--silent 不顯示錯誤信息。
-R或--recursive 遞歸處理,將指定目錄下的所有文件及子目錄一併處理。
-v或--verbose 顯示指令執行過程。
--help 在線幫助。
--reference=<參考文件或目錄> 把指定文件或目錄的許可權全部設成和參考文件或目錄的許可權相同
--version 顯示版本信息。
<許可權範圍>+<許可權設置> 開啟許可權範圍的文件或目錄的該項許可權設置。
<許可權範圍>-<許可權設置> 關閉許可權範圍的文件或目錄的該項許可權設置。
<許可權範圍>=<許可權設置> 指定許可權範圍的文件或目錄的該項許可權設置。

範例

範例一:將檔案 file1.txt 設為所有人皆可讀取 :
chmod ugo+r file1.txt
將檔案 file1.txt 設為所有人皆可讀取 :
chmod a+r file1.txt
將檔案 file1.txt 與 file2.txt 設為該檔案擁有者,與其所屬同一個群體者可寫入,但其他以外的人則不可寫入 :
chmod ug+w,o-w file1.txt file2.txt
將 ex1.設定只為該檔案擁有者增加執行許可權 :
chmod u+x ex1
將目前目錄下的所有檔案與子目錄皆設為任何人可讀取 :
chmod -R a+r *
當其他用戶執行oracle的sqlplus這個程序時,他的身份因這個程序暫時變成oracle
chmod u+s sqlplus
此外,chmod也可以用數字來表示許可權如 chmod 777 file
語法為:chmod abc file
其中a,b,c各為一個數字,分別表示User、Group、及Other的許可權。
r=4,w=2,x=1
若要rwx屬性則4+2+1=7;
若要rw-屬性則4+2=6;
若要r-x屬性則4+1=5。
範例二:
chmod a=rwx file
chmod 777 file
效果相同
chmod ug=rwx,o=x file
chmod 771 file
效果相同
若用chmod 4755 filename可使此程式具有root的許可權
範例三:
如果在cd /media/amasun/java/develop/array之後執行
chmod 777 ./
是將本目錄(即/media/amasun/java/develop/array)設為任何人可讀,寫,執行
如果是管理員也就是常說的ROOT用戶的話,基本上有可以查看所有文件的權力.