簡介
C語言函式
函式原型
函式名稱:chmod
函式原型:int chmod( const char *filename, int pmode );
所屬庫:io.h
函式功能:改變檔案的讀寫許可設定,如果改變成功返回0,否則返回-1
示例
這個例子中實現了把檔案sample.txt設定為
唯讀檔案:
#include<conio.h>#include<io.h>#include<sys/stat.h>intmain(void){if(chmod("D:\\sample.txt",S_IREAD)==-1){cprintf("檔案sample.txt不存在\n");}else{cprintf("檔案sample.txt變為唯讀檔案\n");}return0;}
備註: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 <sys/types.h> #include <sys/stat.h>
定義函式: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 路徑並非一目錄
10、ELOOP 參數path 有過多符號連線問題.
11、EIO I/O 存取錯誤
範例
/* 將/etc/passwd 檔案許可權設成S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH */
#include<sys/types.h>#include<sys/stat.h>main(){chmod("/etc/passwd",S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);}
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用戶的話,基本上有可以查看所有檔案的權力.