文件目录与管理及vim程序编辑器
1.文件目录的权限
文件的重要权限有三个:
r(读权限),w(写权限),x(执行权限)
其中还有其他特殊权限是s,t
1.1文件的特殊权限
SUID:
当s出现在拥有者的x权限上时,则文件拥有特殊权限
功能:
- 只能对binary二进制文件使用;
- 执行者需要对此文件拥有x可执行权限
- 权限只在执行该文件时生效
- 执行者将拥有owner(此文件拥有者的权限)
SGID
当s出现在群组的x时,则称为文件拥有SGID权限,与SUID不同的是SGID可以针对文件或目录来设定,
功能:
- 用户对此目录具有r和x权限时,用户可以进入该特权目录
- 二进制binary文件在执行时可以获得群组的权限
- 若用户在此目录下具有w写权限,目录具有SGID的特殊权限时,代表用户在这个目录底下新建的文件之群组都会与该目录的组名相同,但目录拥有者在目录中创建的文件的群组仍然为拥有者本人的群组。
SBIT
当t出现在other的x时,则文件拥有SBIT权限,SBIT仅能对目录使用:
SBIT对目录的作用:
- 当用户对此目录具有w和x权限,则可以进入目录修改文件
- 当用户进入到此目录仅能对自己创建的文件进行操作
例子:当用户甲对于目的A目录拥有w(写权限)和 x(执行权限),可以对目录内的文件进行“删除,移动,更名等操作”。但若A目录加上了SBIT权限,则甲只能对自己创建的文件或目录进行删除,移动,更名操作。
1.2文件特殊权限的设定
1.2.1数字形态更改特殊权限
数字形态更改权限的方式为三个数字组合,在这个基础上再在最前加上一位数字,最前面的数字就代表了这个特殊权限
- SUID:4
- SGID:2
- SBID:1
范例1:
数字形态更改权限范例:使用touch创建空文件,再将其权限设置为拥有SUID特殊权限,拥有者全部权限,其他人和群组拥有可读可执行权限
[root@admin hello]# touch test
[root@admin hello]# chmod 4755 test
[root@admin hello]# ls -l test
-rwsr-xr-x. 1 root root 0 7月 23 06:08 test
范例2:
[root@admin hello]# chmod 7666 test
[root@admin hello]# ls -l test
-rwSrwSrwT. 1 root root 0 7月 23 06:08 test
文件拥有SUID,SGID,SBIT特殊权限的,需要拥有者,群组,其他人拥有文件的可执行权限,若为大写的S,T则说明文件的x为空
符号法修改特殊权限:
u代表拥有者,g代表群组,o代表其他人
范例1:
[root@admin hello]# chmod u=rwxs,go=rx test
[root@admin hello]# ls -l test
-rwsr-xr-x. 1 root root 0 7月 23 06:08 test
范例2:在原有基础上为group和other加上特殊权限
[root@admin hello]# chmod g+s,o+t test
[root@admin hello]# ls -l test
-rwsr-sr-t. 1 root root 0 7月 23 06:08 test
1.3 观察文件的类型
使用的特殊语句为file语句
写法:
file 文件路径
范例:
[root@admin hello]# file test
test: setuid setgid sticky empty
2.指令与文件的搜寻
2.1寻找执行档文件:which
which是在PATH这个环境变量中规定的路径中去寻找;
只可以寻找可以执行的二进制文件
写法:
which -a command
选项和参数:
-a:把所有在PATH中的指令都找出,而不是只给出第一个被找到的指令
范例:搜寻ifconfig的完整文件名
[root@admin hello]# which ifconfig
/usr/sbin/ifconfig
2.2 文件档名的搜寻:whereis
在几个常用的目录中去寻找文件文件名
写法:
whereis [-bmsu] 文件或目录名
选项和参数:
- -l:列出whereis会去查找的路径
- -b:只查找binary二进制格式的文件
- -m:找出manual说明路径下的文件
- -s:只找source来源文件
- -u:寻找不在上述三个目录二进制执行文件,说明文件,source来源文件的其他特殊文件
范例1:寻找和passwd有关的文件
[root@admin hello]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
范例2:在说明文档manual中寻找与passwd有关的文件
[root@admin hello]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
2.3 通常在数据库中使用locate / updatedb
写法:locate [-ir] keyword
选项与参数:
- -i:忽略查找时的大小写差异
- -c:仅计算出找到的文件数量
- -l:仅输出几行,例子 输出5行 -l 5
- -S:输出locate使用数据库文件的相关信息
- -r:后接正规表示法的显示方式
范例1:找出系统中所有与 passwd 相关的档名,且只列出 5 个
[root@admin hello]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
2.4 find(最重要)
查找需要的文件
写法:`find [PATH] [option] [action]
参数:
- 与时间有关的:-atime(access time),-mtime(modification time),-ctime(status time)
-mtime n:显示n天前,一天之内被改动的文件
-mtime +n:显示n天之前(不包括n)被改动的文件
-mtime -n:显示n天之内(包括n)被改动的文件
-newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
范例1:找到两天前hello中内容被改动的文件
[root@admin /]# find /hello -mtime 2
/hello/test1/demo.txt
范例2:找出一天之前内容被改动的文件
[root@admin /]# find /hello -mtime +1
/hello/test1/demo.txt
/hello/testtouch
范例3:找出4天之内被改动过的文件:
[root@admin /]# find /hello -mtime -4
/hello
/hello/test1
/hello/test1/demo.txt
/hello/test1/test.txt
/hello/test1/.test.txt.swp
/hello/test2
/hello/test2/test1
/hello/test2/test1/demo.txt
/hello/demo.txt
/hello/nihao
/hello/nihaoa
/hello/slink
/hello/slink1
/hello/test3
/hello/test
范例4:找出文件中比/hello/test1/demo.txt更早的文件
[root@admin hello]# find /hello -newer /hello/test1/demo.txt
/hello
/hello/test1
/hello/test1/test.txt
/hello/test1/.test.txt.swp
/hello/test2
/hello/test2/test1
/hello/test2/test1/demo.txt
/hello/demo.txt
/hello/nihao
/hello/nihaoa
/hello/slink
/hello/slink1
/hello/test3
/hello/test
- 与使用者和组名有关
-uid n:找出数字n所对应的用户ID
-gid n:找出数字n所对应的群组ID
-user name:找出name拥有者名下的文件
-group name:找出name群组名下的文件
-nouser:找出没有拥有者的文件
-nogroup:找出没有群组的文件
范例1:找到hello目录下root为拥有者的文件
[root@admin hello]# find /hello -user root
/hello
/hello/test1
/hello/test1/demo.txt
/hello/test1/test.txt
/hello/test1/.test.txt.swp
/hello/test2
/hello/test2/test1
/hello/test2/test1/demo.txt
/hello/demo.txt
/hello/nihao
/hello/nihaoa
/hello/slink
/hello/slink1
/hello/testtouch
/hello/test3
/hello/test
范例2:找出hello目录下群组为yang的文件
[root@admin hello]# find /hello -group yang
/hello
/hello/test1
/hello/test1/demo.txt
/hello/demo.txt
/hello/nihaoa
- 与文件权限有关
-name filename:找出名为filename的文件
-size [-+]SIZE:寻找比SIZE还要大(+)或小(-)的文件
-type TYPE:搜寻文件类型为TYPE的文件
-perm mode:搜寻文件权限刚好等于mode的文件,mode与chmod的属性值相似,例如-perm 4755找到-rwsr-xr-x的文件
-perm -mode:找到权限必须等于mode的文件
-perm /mode:找到包含任一mode的权限的文件
范例1:找到hello目录中名为test的文件
[root@admin hello]# find /hello -name test
/hello/test
范例2:找到hello目录中具有特殊权限的文件
[root@admin hello]# find /hello -perm /7000
/hello/test
- 与额外可进行的操作
-exec command:command为其他指令,-exec可以接额外指令来处理搜寻到的结果
-print:将结果打印到屏幕上
范例:
[root@admin hello]# find /hello -perm /7000 -exec ls -l {} \;
-rwsr-sr-t. 1 root root 0 7月 23 06:08 /hello/test
2.vim程序编辑器
- 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在;
- 很多个别软件的编辑接口都会主动呼叫 vi (例如未来会谈到的 crontab, visudo, edquota 等指令);
- vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计;
- 因为程序简单,编辑速度相当快速。
2.1 vi的使用
vi共有三种模式一般指令模式,编辑模式,指令列命令模式
一般指令模式(command mode):
vi一打开进入的模式
编辑模式(insert mode):
在一般指令模式中按下[i, I, o, O, a, A, r, R]会进入编辑模式,按下Esc退出编辑模式
指令列命令模式 (command-line mode) :
在一般指令模式下使用[: / ?]可以进入该模式,可以读取、存盘、大量取代字符、离开 vi 、显示行号等等
范例:使用vi创建一个程序
- 使用
vi test
进入一般指令模式
[root@admin test]# vi test1
- 按下 i 进入编辑模式,开始编辑文字
- 按下 [ESC] 按钮回到一般指令模式
- 按下:进入指令列模式,文件储存并离开 vi 环境 ,输入write(写入)存档和quit(离开)就可以在目录看见test了
2.2模式按键说明:
第一部分:
一般指令的光标移动:
光标的移动方法 | 实现功能 |
---|---|
h 或 向左箭头键(←) | 光标向左移动一个字符 |
j 或 向下箭头键(↓) | 光标向下移动一个字符 |
k 或 向上箭头键(↑) | 光标向上移动一个字符 |
l 或 向右箭头键(→) | 光标向右移动一个字符 |
[Ctrl] + [f] | 屏幕『向下』移动一页(常用) |
[Ctrl] + [b] | 屏幕『向上』移动一页(常用) |
[Ctrl] + [d] | 屏幕『向下』移动半页 |
[Ctrl] + [u] | 屏幕『向上』移动半页 |
+ | 光标移动到非空格符的下一列 |
- | 光标移动到非空格符的上一列 |
n空格space | n代表数字,按下数字再按下空格键,光标会向右移动这一列的 n 个字符 |
0 或功能键[Home] | 这是数字『 0 』:移动到这一列的最前面字符处(常用) |
$ 或功能键[End] | 移动到这一列的最后面字符处(常用) |
H | 光标移动到这个屏幕的最上方那一列的第一个字符 |
M | 光标移动到这个屏幕的中央那一列的第一个字符 |
L | 光标移动到这个屏幕的最下方那一列的第一个字符 |
G | 移动到这个文件的最后一列(常用) |
nG | n为数字。移动到这个文件的第 n 列 |
gg | 移动到文件的第一列。相当1G(常用) |
n回车Enter | n为数字。光标向下移动n列(常用) |
搜寻与取代:
查询语句 | 实现目的 |
---|---|
/word | 向光标下搜寻名为word的字符串 |
?word | 向光标上搜寻名为word的字符串 |
n | 重复前一个搜寻动作 |
N | 反向重复前一个搜寻动作 |
:n1,n2s/word1/word2/g | 在n1,n2列之间将word1替换为word2 |
:1,$s/word1/word2/g | 在第一列到最后一列将word1替换为word2 |
:1,$s/word1/word2/gc | 在第一列到最后一列将word1替换为word2,并在每次替换前给用户确认(confirm) |
第二部分:一般指令切换到编辑模式
语句 | 实现功能 |
---|---|
i, I | 进入插入模式(Insert mode): i 为『从目前光标所在处插入』, I 为『在目前所在列的第一个非空格符处开始插入』 |
a, A | 进入插入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光标所在列的最后一个字符处开始插入』 |
o, O | 进入插入模式(Insert mode): 这是英文字母 o 的大小写。o 为『在目前光标所在的下一列处插入新的一列』; O 为在目前光标所在处的上一列插入新的一列!(常用) |
r, R | 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用) |
[Esc] | 退出编辑模式 |
第三部分:一般指令模式切换到指令列模式
语句 | 实现功能(!具有强制的意思) |
---|---|
:w | 将编辑的数据写入硬盘文件中(常用) |
:w! | 若文件属性为『只读』时,强制写入该文件。 |
:q | 离开 vi (常用) |
:q! | 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存文件。 |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ | 若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开 |
:w [filename] | 将编辑的数据储存成另一个filename文件 |
:r [filename] | 在编辑的数据中,读入另一个文件的数据。 |
:n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个文件。 |
:! command | 暂时离开 vi 到指令列模式下执行 command |
:set nu | 显示行号 |
:set nonu | 取消行号 |