-
目录与路径
-
绝对路径与相对路径:略
-
目录的相关操作
-
几个特殊目录
- . 代表此层目录
- .. 代表上一层目录
- - 代表前一个工作目录
- ~ 代表『目前用户身份』所在的家目录
- ~account 代表 account 这个用户的家目录(account 是个账号名称)
-
-
几个常见处理目录的指令
-
cd(change directory, 变换目录)
-
pwd(显示目前所在的目录)
- 选项与参数:
1. [-P]:显示出实际路径而非(link)路径
- 选项与参数:
- mkdir(建立新目录)
- 选项与参数:
1. -m:指定文件权限而不需要看预设权限(umask) eg:mkdir -m 711 file_name 2. -p:直接将需要的目录递归创建起来 eg:mkdir -p a/b/c/d
- 选项与参数:
- rmdir(删除[空]目录)
- 选项与参数:
1. -p:连同『上层』『空的』目录也一起删除
- 选项与参数:
-
-
关于执行文件路径的变量:$PATH
+ echo $PATH:显示目前的PATH,执行顺序即搜到的顺序 + 添加PATH:PATH="${PATH}:/root"
- 不同身份预设的PATH不同,默认能够随意执行的指令也不同
-
-
文件与目录管理
-
文件与目录检索:ls
- 语法
1. ls [-aAdfFhilnrRSt] 文件名或目录名称 2. ls [--color={never,auto,always}] 文件名或目录名称 3. ls [--full-time] 文件名或目录名称
- 选项与参数
1. -a :全部的文件, 连同隐藏档( 开头为 . 的文件) 一起列出来(常用) 2. -A :全部的文件, 连同隐藏档,但不包括 . 与 .. 这两个目录 3. -d : 仅列出目录本身,而不是列出目录内的文件数据(常用) 4. -f :直接列出结果,而不进行排序 (ls 预设会以档名排序! ) 5. -F :根据文件、目录等信息, 给予附加数据结构,例如: *:代表可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件; 6. -h : 将文件容量以易读的方式(例如 GB, KB 等等)列出来; 7. -i :列出 inode 号码; 8. -l : 长数据串行出,包含文件的属性与权限等等数据; (常用) 9. -n :列出 UID 与 GID 而非使用者与群组的名称 10. -r : 将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小; 11. -R : 连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来; 12. -S :以文件容量大小排序,而不是用档名排序; 13. -t :依时间排序,而不是用档名。 14. --color=never :不要依据文件特性给予颜色显示; 15. --color=always : 显示颜色 16. --color=auto : 让系统自行依据设定来判断是否给予颜色 17. --full-time :以完整时间模式 (包含年、月、日、 时、分) 输出 18. --time={atime,ctime} : 输出 access 时间或改变权限属性时间 (ctime)而非内容变更时间 (modification time) eg:ll -alF --color=never --full-time ~
- 语法
-
复制、删除和移动:cp/rm/mv
- 语法:
1. cp [-adfilprsu] 来源文件(source) 目标文件(destination) 2. cp [options] source1 source2 source3 .... directory
- 选项和参数
1. -a :相当于 -dr --preserve=all (常用) 2. -d :若来源文件为链接文件的属性(link file), 则复制链接文件属性而非文件本身; 3. -f : 为强制(force)的意思,若目标文件已经存在且无法开启, 则移除后再尝试一次; 4. -i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用) 5. -l : 进行硬式连结(hard link)的连结档建立,而非复制文件本身; 6. -p : 连同文件的属性(权限、用户、 时间)一起复制过去,而非使用默认属性(备份常用); 7. -r : 递归持续复制,用于目录的复制行为; (常用) 8. -s :复制成为符号链接文件 (symbolic link); 9. -u : destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。 10. --preserve=all :除了 -p 的权限相关参数外, 还加入 SELinux 的属性, links, xattr 等也复制了。 注:如果source有两个以上,destination必须得是目录
- 在预设条件中,cp的源文件与目标文件的权限事不同的,目标文件的拥有者通常事指令操作者本身,三思而后复制哈哈
- 语法:
-
rm (移除文件或目录)
- 选线和参数:
1. -f:(force) ,忽略不存在的文件,不会出现警告讯息 2. -i:删除前询问使用者 3. -r:递归删除
- 选线和参数:
-
mv (移动文件与目录,或更名)
- 语法:
1. mv [-fiu] source destination 2. mv [options] source1 source2 source3 .... directory
- 选项与参数
1. -f:如果目标文件已经存在,不会询问而直接覆盖 2. -i:若目标文件 (destination) 已经存在时,就会询问是否覆盖 3. -u:若目标文件已经存在,且 source 比较新,才会更新 (update)
- 语法:
- 取得路径的文件名与目录名称
1. basename /etc/sysconfig/network-->network 2. dirname /etc/sysconfig/network-->/etc/sysconfig
-
-
文件内容查阅
-
直接查看文件内容
-
cat(concatenate)
选项与参数:
1. -A :等于 -vET 2. -b :列出行号, 仅针对非空白行做行号显示 3. -E : 显示结尾断行符 $ 4. -n :列出行号, 连同空白行也会有行号 5. -T : 将 [tab] 按键以 ^I 显示出来; 6. -v :列出一些看不出来的特殊字符
-
tac(反向显示)
-
nl(添加行号打印)
选项和参数:
1. -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); -b t :如果有空行,空的那一行不要列出行号(默认值); 2. -n :列出行号表示的方法,主要有三种: -n ln :行号在屏幕的最左方显示; -n rn :行号在自己字段的最右方显示,且不加 0 ; -n rz :行号在自己字段的最右方显示,且加 0 ; 3. -w :行号字段的占用的字符数。
-
-
可翻页查看
-
more (一页一页翻动)
选项和参数:1. 空格键 (space):代表向下翻一页 2. Enter :代表向下翻『一行』 3. /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词 4. f :立刻显示出文件名以及目前显示的行数 5. q :代表立刻离开 more ,不再显示该文件内容 6. b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用
-
less (一页一页翻动,man就是使用less来显示说明文件的)
选项和参数:1. 空格键 :向下翻动一页; 2. [pagedown]:向下翻动一页; 3. [pageup] :向上翻动一页; 4. /字符串 :向下搜寻『字符串』的功能; 5. ?字符串 :向上搜寻『字符串』的功能; 6. n :重复前一个搜寻 (与 / 或 ? 有关! ) 7. N :反向的重复前一个搜寻 (与 / 或 ? 有关! ) 8. g :前进到这个资料的第一行去; 9. G :前进到这个数据的最后一行去 (注意大小写); 10. q :离开 less 这个程序;
-
-
资料撷取
-
head (取出前面几行)
- 语法
1. head [-n number] 文件
- 选项与参数
1. -n :后面接数字,代表显示几行,不加此选项默认显示十行,如为负数代表显示负数绝对值前面的行
- 语法
-
tail (取出后面几行)
- 语法
1. head [-n number] 文件
- 选项与参数
1. -n :后面接数字,代表显示几行,如选项为+n,则代表显示n行以后的数据 2. -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c 才会结束 tail 的侦测
- 语法
- 非纯文本档: od(我觉得自己暂时用不到O(∩_∩)O)
-
-
修改文件时间或建置新档: touch
- 文件的三个主要变动时间
- modification time (mtime):文件的内容数据(文件的内容,非属性或权限)变更时的时间
- status time (ctime):当文件的状态(比如权限和属性)改变时会更新的时间
- access time (atime):当文件的内容被读取时候会更新的读取时间
- ls默认情况显示的是文件的mtime,其余可用ls -l --time={atime,ctime}来查看
- 语法
1. touch [-acdmt] 文件
- 选项与参数
1. -a : 仅修改access time; 2. -c : 仅修改文件的时间,若该文件不存在则不建立新文件(全都修改了) 3. -d :后面可以接欲修订的日期而不用目前的日期,也可以使用--date="日期或时间"(atime/mtime) 4. -m : 仅修改 mtime ; 5. -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm])(atime/mtime)
- 文件的三个主要变动时间
-
-
文件与目录的默认权限与隐藏权限
-
文件预设权限:
umask(目前用户在建立文件or目录时的权限默认值,可直接通过umask value设定)-
两种查阅方式:
- 直接输入umask,可见到数字形态的权限设定
- 加上-S可以符号形式来显示
- 注:为啥有四组,第一组是特殊权限
-
两种预设情况
- 目录:drwxrwxrwx,建立目录时: (drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
- 文件:-rw-rw-rw-,建立文件时: (-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
-
-
文件隐藏属性
- 注:chattr指令只在ext2/ext3/ext4的Linux传统文件系统完整生效,其他文件系统eg:xfs只支持部分参数
-
chattr (配置文件案隐藏属性)
- 语法
1. chattr [+-=][ASacdistu] 文件或目录名称
- 选项与参数
1. + :增加某一个特殊参数,其他原本存在参数则不动。 2. - :移除某一个特殊参数,其他原本存在参数则不动。 3. = : 更新为指定参数 4. A:文件的atime(access time)不可被修改,这样可以减少磁盘I/O数量,对于笔记本电脑有利于提高续航能力 5. S:硬盘I/O同步选项,功能类似sync 6. a : 当设定 a 之后, 这个文件将只能增加数据,而不能删除也不能修改数据,只有 root 才能设定这属性 7. c:即compresse,文件会自动的经压缩后再存储,读取时会自动的解压 8. d:不被dump程序备份 9. i:设定该属性后,可使得文件不能被删除、重命名、设定连接关系、写入或新增数据,仅有root可设定此属性 10. s:文件被删除后将被完全移除硬盘空间,不能救回 11. u:与s相反,文件删除后可救回
- 注意
1. 常见使用a与i,很多属性需要root才能设定 2. xfs文件系统仅支持AadiS
- 语法
-
lsattr(显示文件隐藏属性)
- 语法
1. lsattr [-adR] 文件或目录
- 选项与参数
1. -a : 显示所有文件的隐藏权限,包括隐藏文件 2. -d:显示目录的属性而非目录内文件的属性 3. 递归显示目录下文件和子目录的属性
- 语法
-
文件特殊权限:SUID,SGID,SBIT
-
Set UID
当s标志出现在文件owner的权限上时,(eg:/usr/bin/passwd)此时被称为Set UID(简称SUID的特殊权限)- SUID的限制有功能
- SUID权限仅对二进制程序有效(不能用在shell script上)
- 执行者需对该程序有x权限
- SUID权限仅仅在执行该程序的过程中有效
- 执行者在此过程中将具有该程序owner的权限
- 这里给的例子真的是让人一下就明白了,/etc/shadow的权限为---------- 1 root root,但是一个一般账号也可以通过passwd指令来修改密码呀,这就是SUID的功能啦,/usr/bin/passwd的权限是rwsr-xr-x,所以一般账号也有x权限,临时借用了一下root的权限对etc/shadow进行修改
- SUID的限制有功能
-
Set GID
当s标志在文件group权限上时,称为Set GID(简称SGID),(eg /usr/bin/locate)- 与SUID不同,SGID可以针对文件或目录及来设置
- 对文件
- SGID对二进制程序有效
- 执行者需要对该程序有x的权限
- 执行者在执行过程中将会得到程序群组的支持
- eg,locate可以搜寻/var/lib/mlocate/mlocate.db中的内容,mlocate.db的权限为-rw-r-----,locate的权限为-rwx--s--x,那么一般账号在执行locate时将会在执行过程中的到slocate群组的支持,于是才能读取mlocate.db的内容
- 对文件
- 对目录
- 用户对于此目录具有r与x权限时,该用户能够进入此目录
- 用户在此目录下的有效群组将会变成该目录的群组
- 用途:若用户在此目录具有w的权限,则使用则锁建立的新文件,该新文件的群组与此目录的群组相同
- 与SUID不同,SGID可以针对文件或目录及来设置
-
Sticky Bit
(简称SBIT),只针对目录有效- 对目录
- 当用户对此目录具有w权限(具有group或others的权限时)
- 当用户在该目录下建立文件or目录时,仅有自己与root才有权力删除/重命名/移动文件
- eg:以不同用户在tmp下建立文件,切换用户尝试删除操作
- 对目录
- SUID/SGID/SBIT权限设定
- 4:SUID
- 2:SGID
- 1:SBIT
- eg:需要将一个文件权限修改为-rwsr-xr-x,即加入SUID权限
chmod 4755 filename 顺便试一下其他几种情况 chmod 6755 filename chmod 1755 filename chmod 7666 filename,(这种情况下会出现S和T,这是因为文件本身都不具有x的权限,想一想SUID时文件执行时具有文件owner的权限,既然都不能执行,哪来的的权限借用,所以S、T代表就是“空的”的意思) 这是符号法来处理(个人认为不如数字法方便) chmod u=rwxs,go=x filename chmod g+s,o+t filename
-
-
观察文件类型:file
- 如果想知道某个文件的基本数据类型,可以使用file
- 语法
1. file filename
-
-
指令与文件的搜索
-
脚本文件名的搜索
-
which
- 语法
1. which [-a] command
- 选项与参数
1. -a:将所有PATH目录中可以找到的指令列出而不仅仅是列出第一个被找到的指令名称
- 注:which预设找PATH内所规范的目录,但是找不到bash内建的指令,eg:which history是找不到的
- 语法
-
- 文件档名的搜寻
-
whereis(有一些特定的目录中寻找文件文件名)
- 语法
1. whereis [-bmsu] 文件或目录名
- 选项与参数
1. -l:列出whereis会查询的几个主要目录 2. -b:执照二进制格式的文件 3. -m:只找在说明文件manual路径下的文件 4. -s:只找source来源文件 5. -u:搜寻不在上面三个选项中的其他特殊文件
- 语法
-
locate/updatedb
- 语法
1. locate [-ir] keyword
- 选项与参数
1. -i:忽略大小写差异 2. -c:不输出档名,仅计算找到的数据量 3. -l:输出几行的意思,eg,输出5行: -l 5 4. -S:输出locate所使用数据库文件的相关信息,包括该数据库记录的文件/目录数量...etc 5. -r:后面可接正则表达式的显示方式
- 注:locate搜索快的原因是因为他是经由数据库搜寻的,而在CentOS7.x中数据库是每天更新一次的,所以可能对于新建立的文件无法搜寻到,需要使用updatedb读取/etc/updatedb.conf配置更新数据库
- updatedb:根据/etc/updatedb.conf的设置搜寻硬盘内文件名并跟新/var/lib/mlocate内的数据库文件
- locate:根据/var/lib/mlocate的数据库记载找出用户输入的关键词文件名
- 语法
-
find
-
语法
1. find [PATH] [option] [action]
-
选项与参数
1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明 -mtime n : n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件; -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名; -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。 -newer file : file 为一个存在的文件,列出比 file 还要新的文件档名 2. 与使用者或组名有关的参数: -uid n : n 为数字, 这个数字是用户的账号 ID,亦即UID , 这个 UID 是记录在/etc/passwd 里面与账号名称对应的数字。 -gid n : n 为数字, 这个数字是组名的 ID,亦即 GID, 这个 GID 记录在/etc/group -user name :查找符合指定的拥有者名称的文件或目录 -group name: 查找符合指定的组名称的文件或目录 -nouser:找出不属于本地主机用户识别码的文件或目录(通过这个指令可以轻易找到不太正常的文件,但是如果找到也不要紧张,有时是正常的~尤其是以原始码自行编译软件时候) -nogroup:找出不属于本地主机群组识别码的文件或目录 3. 与文件权限即名称有关的参数 -name filename:搜寻文件名为 filename 的文件 -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。 这个 SIZE 的规格有:c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB还要大的文件,就是『-size +50k 』 -type TYPE:搜寻文件的类型为 TYPE 的, 类型主要有:一般正规文件 (f), 装置文件 (b, c),目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性 -perm mode:搜寻文件权限刚好等于mode的文件,mode类似于chmod的属性值,eg:-rwsr-xr-x 的属性为 4755 -perm -mode:搜寻文件权限『必须要全部囊括 mode 的权限』的文件,比如4755包括0744啦 -perm /mode:搜寻文件权限『包含任一 mode 的权限』的文件,就是会搜索到他的子集啦 4. 额外可进行的动作 -exec command: command 为其他指令, -exec 后面可再接额外的指令来处理搜寻到的结果 -print:将结果打印到屏幕上(这是默认的)
-
几个例子
1. find / -name ”*passwd*“ 2. find /run -type s 3. find / -perm /7000,这个比较有意思7000表示---s--s--t,那么搜索其子集的话呢,意味着具有SUID,SGID,SBIT权限的问价or目录会被列出 4. find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; {}代表由find找到的内容,或者说find的结果会被放置到{}中 -exec到\;之间是关键词,代表find额外的动作
-
关于时间参数可参见下图:
+4 代表大于等于 5 天前的文件名: find /var -mtime +4
-4 代表小于等于 4 天内的文件名:find /var -mtime -4
4 则是代表 4-5 那一天的文件名:find /var -mtime 4
-
-
-
-
权限与指令之间的关系
-
让用户能进入某目录的基本权限:
- 目录:用户对此目录至少有x权限
- 额外:若过想查阅目录内文件名(ls),需有r权限
-
让用户在某个目录内读取一个文件的基本权限:
- 目录:用户至少有x权限
- 文件:用户至少有r权限
-
让用户可修改一个文件的基本权限:
- 目录:用户至少有x权限
- 文件:用户至少对该文件有r,w权限
-
用户建立一个文件的基本权限:
- 目录:用户在该目录要有x,w权限
-
用户进入某目录并执行目录内某个指令:
- 目录:至少有x权限
- 文件:至少有x权限
-
-
重点回顾
- ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要
- cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同
- 除了传统的 rwx 权限之外,在 Ext2/Ext3/Ext4/xfs 文件系统中,还可以使用 chattr 与 lsattr 设定及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性
- 新建文件/目录时,新文件的预设权限使用 umask 来规范。默认目录完全权限为 drwxrwxrwx, 文件则为-rw-rw-rw-
- 文件具有 SUID 的特殊权限时,代表当用户执行此一 binary 程序时,在执行过程中用户会暂时具有程序拥有者的权限
- 目录具有 SGID 的特殊权限时,代表用户在这个目录底下新建的文件之群组都会与该目录的组名相同
- 目录具有 SBIT 的特殊权限时,代表在该目录下用户建立的文件只有自己与 root 能够删除
-
课后问题
- 假设系统中有两个账号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同支持一个名为project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。 请问
该目录的权限设定应为何?(真的做一遍就明白了)groupadd project useradd -G project alex useradd -G project arod mkdir /srv/ahome chgrp project /srv/ahome chmod 2770 /srv/ahome
- 找出 /etc 底下, 文件大小介于 50K 到 60K 之间的文件,并且将权限完整的列出 (ls -l)
find /etc -size +50k -a -size -60k -exec ls -l {} \;( -a 是 and 的意思)
找出 /etc 底下, 文件容量大于 50K 且文件所属人不是 root 的档名,且将权限完整的列出 (ls -l)
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;( ! 代表的是反向选择)
找出 /etc 底下,容量大于 1500K 以及容量等于 0 的文件
find /etc -size +1500k -o -size 0(-o 就是或 (or) )
- 假设系统中有两个账号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同支持一个名为project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。 请问