-
chmod
鎖定
- 外文名
- chmod
- 函數原型
- int chmod
- 所屬庫
- io.h
- 函數功能
- 改變文件的讀寫許可設置,
chmod簡介
chmod函數原型
函數名稱:chmod
函數原型:int chmod( const char *filename, int pmode );
所屬庫:io.h
函數功能:改變文件的讀寫許可設置,如果改變成功返回0,否則返回-1
chmod示例
#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 [-cfvR] [--help] [--version] mode file...
參數説明:
mode : 權限設定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中u 表示該檔案的擁有者,g 表示與該檔案的擁有者屬於同一個羣體(group)者,o 表示其他以外的人,a 表示這三者皆是。
+ 表示增加權限、- 表示取消權限、= 表示唯一設定權限。
r 表示可讀取,w 表示可寫入,x 表示可執行,X 表示只有當該檔案是個子目錄或者該檔案已經被設定過為可執行。
-s :在文件執行時把進程的屬主或組ID置為該文件的文件屬主。
-c : 若該檔案權限確實已經更改,才顯示其更改動作
-f : 若該檔案權限無法被更改也不要顯示錯誤訊息
-v : 顯示權限變更的詳細資料
--help : 顯示輔助説明
--version : 顯示版本
頭文件:#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 其他用户具可執行權限
基於系統安全,如果欲將數據寫入一執行文件,而該執行文件具有S_ISUID 或S_ISGID 權限,則這兩個位會被清除。如果一目錄具有S_ISUID 位權限,表示在此目錄下只有該文件的所有者或root 可以刪除該文件。
錯誤代碼:
1、EPERM 進程的有效用户識別碼與欲修改權限的文件擁有者不同, 而且也不具root 權限.
2、EACCESS 參數path 所指定的文件無法存取.
4、EFAULT 參數path 指針超出可存取內存空間.
5、EINVAL 參數mode 不正確
6、ENAMETOOLONG 參數path 太長
7、ENOENT 指定的文件不存在
8、ENOTDIR 參數path 路徑並非一目錄
9、ENOMEM 核心內存不足
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); }
chmodLinux命令
chmod命令描述
變更文件或目錄的權限。在UNIX系統家族裏,文件或目錄權限的控制分別以讀取,寫入,執行3種一般權限來區分,另有3種特殊權限可供運用,再搭配擁有者與所屬羣組管理權限範圍。您可以使用chmod指令去變更文件與目錄的權限,設置方式採用文字或數字代號皆可。符號連接的權限無法變更,如果您對符號連接修改權限,其改變會作用在被連接的原始文件。權限範圍的表示法如下:
u:User,即文件或目錄的擁有者。
g:Group,即文件或目錄的所屬羣組。
o:Other,除了文件或目錄擁有者或所屬羣組之外,其他用户皆屬於這個範圍。
a:All,即全部的用户,包含擁有者,所屬羣組以及其他用户。
有關權限代號的部分,列表於下:
r:讀取權限,數字代號為"4"。
w:寫入權限,數字代號為"2"。
x:執行或切換權限,數字代號為"1"。
-:不具任何權限,數字代號為"0"。
s:當文件被執行時,根據who參數指定的用户類型設置文件的setuid或者setgid權限。
chmod語法
chmod [-cfRv][--help][--version][<權限範圍>+/-/=<權限設置...>][文件或目錄...]
chmod [-cfRv][--help][--version][數字代號][文件或目錄...]
chmod [-cfRv][--help][--reference=<參考文件或目錄>][--version][文件或目錄...]
chmod選項説明
-c或--changes 效果類似"-v"參數,但僅回報更改的部分。
-f或--quiet或--silent 不顯示錯誤信息。
-R或--recursive 遞歸處理,將指定目錄下的所有文件及子目錄一併處理。
-v或--verbose 顯示指令執行過程。
--help 在線幫助。
--reference=<參考文件或目錄> 把指定文件或目錄的權限全部設成和參考文件或目錄的權限相同
--version 顯示版本信息。
<權限範圍>+<權限設置> 開啓權限範圍的文件或目錄的該項權限設置。
<權限範圍>-<權限設置> 關閉權限範圍的文件或目錄的該項權限設置。
<權限範圍>=<權限設置> 指定權限範圍的文件或目錄的該項權限設置。
chmod範例
範例一 :將檔案 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用户的話,基本上有可以查看所有文件的權力.