之前经常使用这两个命令,但是一直没有真正认识过这两个命令的区别,之前做项目总是赶进度,对linux命令用得糊里糊涂的,现在觉得赶进度固然重要,但是还是要弄懂其中的原理才能真正算是自己做项目的收获~~
首先,先弄清楚这两个命令都是干嘛的?chmod用来改变文件的使用权限,权限包括r(读)、w(写)、x(执行)等。chown是用来更改文件的所有者或所有组的。
下面,再具体介绍一下二者怎么应用。
一、chmod(来自change mode)
一种使用方式为:chmod [-cfvR] [-help] [-version] mode file
mode——权限设定字符串,格式为[ugoa...] [+-=] [rwxXst]
其中u表示该档案的拥有者,g表示与该档案拥有者属于同一群组者,o表示其他人,a表示三者皆是。
+表示增加权限,-表示取消权限,=表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行(不明白什么意思),s 文件属主和组id
l 给文件加锁,使其它用户无法访问。
[-cfvR]—— -c表示若该档案权限确实已更改,才显示其更改动作
-f表示若该档案权限无法被更改也不要显示错误讯息
-v 表示显示权限变更的详细资料
-R 表示对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)(这个比较常用)
[–help]—— 显示辅助说明
[–version]——显示版本
另外一种用数字来表示权限如 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。
下面是几个实例
(1)将档案 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt
或 chmod a+r file1.txt
(2)将档案 file1.txt 与 file2.txt 设为该档案拥有者和与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt
(3)将 ex1.py 设定为只有该档案拥有者可以执行 :
chmod u+x ex1.py
(4)将当前目录下的所有档案与子目录皆设为任何人可读取 :
chmod -R a+r *
(5)收回所有用户的对file1的执行权限
chmod a-x file1
利用数字控制文件权限
(1)把hh.c文件修改为可写可读可执行
chmod 777 hh.c
(2)要修改当前目录下所有的文件属性为可写可读可执行
chmod 777 *.*
(3) 若是要修改所有htm文件的属性
chmod 777 *.htm
(4)把目录 /tmp/sco修改为可写可读可执行
chmod 777 /tmp/sco
(5)要修改某目录下所有的文件夹属性为可写可读可执行
chmod 777 * (把文件夹名称用*来代替就可以了)
(7)要修改/tmp/sco下所有的文件和文件夹及其子文件夹属性为可写可读可执行
chmod -R 777 /tmp/sco
详细出处参考:http://www.jb51.net/article/6935.htm
再来看一下文件显示的权限
[root@www ~]# ls -l
-rw-r--r-- 1 oracle oinstall 0 Feb 24 00:00 alertlogbyday.log
-rwxr-xr-x 1 oracle oinstall 430 Feb 20 01:10 alertlogbyday.sh
-rwxr-xr-x 1 oracle oinstall 7 Feb 24 05:00 del_st_arch.log
-rwxr-xr-x 1 oracle oinstall 648 Feb 19 00:51 del_st_archive.sh
-rwxr-xr-x 1 oracle oinstall 9 Feb 24 05:00 max_sn.log
drwxr-xr-x 3 root root 4096 Feb 23 23:40 pymonitor
第一栏 [文件属性] 第二栏 [文件数] 第三栏 [拥有者] 第四栏 [所有者群组] 第五栏 [大小] 第六栏 [建档日期] 第七栏 [档名]
我们设置文件的权限就是这是第一栏里的文件属性。
文件属性这块共有十个字段,如:drwxr-xr-x
我们把这10个列分成4块:[d] [rwx] [r-x] [r-x]
第一块:也就是第一列,用来表示这个文件的类型,有如下值:
(1)[ d ]——是目录,我这里的是d,表示的是一个目录
(2)[ - ]——是文件;
(3)[ l ]——表示为连结档(link file);
(4)[ b ]——表示为装置文件里面的可供储存的接口设备;
(5)[ c ]——表示为装置文件里面的串行端口设备,例如键盘、鼠标。
第二块:第 2~4列,表示文件拥有者的权限。
第三块:第5~7列,表示拥有者同组人的权限。
第四块:第8~10列,表示是非拥有者组人的权限。
这些权限均有[rwx] 三个参数表示,而且分别对应不同的位置。每块由3个列组成,每列对应一个值。 [ r ]代表可读、[ w ]代表可写、[ x ]代表可执行。
举例: 如果拥有者只有只读的权限,那么第2到4列就是[r--],有读写的权限就是[rw-],有读写和执行的权利就是[rwx].
出自:http://blog.youkuaiyun.com/xiaolongwang2010/article/details/8654848
二、chown(change owner)
使用方式:chown [-cfhvR] [--help] [--version] user[:group] file...
说明 : Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥
有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以
改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才
有这样的权限。
这里指介绍部分含义,其他字符含义可以参照上面
-h ——只对于连结(link)进行变更,而非该 link 真正指向的档案
user——新的档案拥有者ID
group——新的档案拥有群组ID
例子
(1)将档案 file1.txt 的拥有者设为 users 群组下的 jessie用户 :
chown jessie:users file1.txt
(2)将目录/scr/hadoop文件夹下的所有档案与子目录的拥有者皆设为 users群组下的lamport用户 :
chown -R lamport:users /scr/hadoop
出自 http://blog.youkuaiyun.com/xiaolongwang2010/article/details/8654848
补充部分例外情况:
如果仅仅给定owner(用户名活在用户ID),执行此语句后,仅仅改变选定文件的拥有者,文件的组是没有改变的。
例如:
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 liujl liujl 0 2012-06-20 09:31 mytest.txt
执行chown 后:
liujl@liujl-Rev-1-0:~/mycode/TEST$ sudo chown juanzhang mytest.txt
[sudo] password for liujl:
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 juanzhang liujl 0 2012-06-20 09:31 mytest.txt
- 如果owner后跟着“:”和组名(或者组ID),注意在“:”两边不要有空格,执行完此条语句后,用户和组拥有者都会发生改变,例如:
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 liujl liujl 0 2012-06-20 09:31 mytest.txt
执行chown后:
liujl@liujl-Rev-1-0:~/mycode/TEST$ sudo chown liujl:liujl mytest.txt
[sudo] password for liujl:
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 liujl liujl 0 2012-06-20 09:31 mytest.txt
- 如果仅有“:”,但后面没有组名,系统会改变文件的拥有者及此拥有组所在的组。
例如:
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 liujl liujl 0 2012-06-20 09:31 mytest.txt
liujl@liujl-Rev-1-0:~/mycode/TEST$ sudo chown juanzhang: mytest.txt
[sudo] password for liujl:
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 juanzhang juanzhang 0 2012-06-20 09:31 mytest.txt
- 如果“:”和组名给定,但是拥有者忽略,仅有组名被修改;在这种情况下,chown的功能和chgrp的功能相似。
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 juanzhang juanzhang 0 2012-06-20 09:31 mytest.txt
iujl@liujl-Rev-1-0:~/mycode/TEST$ sudo chown :liujl mytest.txt
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 juanzhang liujl 0 2012-06-20 09:31 mytest.txt
- 如果仅“:”给定或者整个操作数为空,文件拥有者或者组名都不会改变。
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 juanzhang liujl 0 2012-06-20 09:31 mytest.txt
liujl@liujl-Rev-1-0:~/mycode/TEST$ chown : mytest.txt
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-rw-r-- 1 juanzhang liujl 0 2012-06-20 09:31 mytest.txt
整个操作数为空,会报错:
liujl@liujl-Rev-1-0:~/mycode/TEST$ chown mytest.txt
chown: "mytest.txt" 后缺少操作数
参数:
-R :进行递归的持续更改,即将同子目录下的所有文件、目录都更新问这个用户组。通常用在更改某一目录的情况。
应用场合:
此命令用的最多的地方是,当我们使用mv或者cp拷贝给其他人的时候,这些文件的拥有者和组名没有改变,所以需要修改。
例子:
liujl@liujl-Rev-1-0:/usr$ ls -l|grep mytest2.txt
-rw-r--r-- 1 root root 0 2012-06-20 13:50 mytest2.txt
liujl@liujl-Rev-1-0:/usr$ sudo mv mytest2.txt /home/liujl/mycode/TEST/
liujl@liujl-Rev-1-0:~/mycode/TEST$ ls -l
总用量 0
-rw-r--r-- 1 root root 0 2012-06-20 13:50 mytest2.txt
现在mytest2.txt已经mv到liujl用户下了,但是当修改的时候是不允许的,从上句可以看出,还是属于root root ,这就需要chown了。
出自http://blog.youkuaiyun.com/richerg85/article/details/7679508