8.30 总结(vim find bash基础 特殊权限位 磁盘管理基础)


1、总结文本编辑工具vim的使用方法;

vim是一种可视化的编辑器

有三种模式:编辑模式、插入模式、末行模式;(使用vim打开文件时默认是处于编辑模式)

模式间的转换:

编辑模式à插入模式

i   在光标所在处插入

a   在光标所在处的后一位进入插入

I   在光标所在行的行首进入插入模式

A   在光标所在行的行尾进入插入模式

o   在光标所在行的下方,另起一新行并进入插入模式

O   在光标所在行的上方,另起一新行并进入插入模式

插入模式à编辑模式

按ESC键即可

编辑模式à末行模式

:   冒号

末行模式à编辑模式

一下或者连续两下ESC按键

退出vim的操作

编辑模式下的ZZ可以执行保存退出(不常用)

:q    在文本内容没有发生变化时可以直接使用q退出

:q!    强制退出,放弃编辑的内容

:wq   正常的保存退出

:wq!   强制保存退出(一般只有root才用的上,root可以忽视文件只读状态)

:w    保存,但不退出

:w!   强制保存,但不退出

光标移动

在编辑模式下hjkl

h    向左移动一下   等同于方向键向左箭头

l    向右移动一下   等同于方向键向右箭头

j    向下移动一下(马老说j是小日本下流)    等同于方向键向下箭头

k    向上移动一下    等同于方向键向上一下

也可以#{h|j|k|l}(#代表数字)

比如:5h就是向左移动5个字符,同理5l就是向右移动5个字符、5j向下5下、5k向上5下

单词之间的移动

编辑模式下

w    跳到下个单词的词首

e    跳到下个单词的词尾

b    调到上个单词的词首

同样支持#{w|e|b}

一次移动#个位置,如:

3w   等于按了3次w,跳到光标处向右第三个单词的词首

3e   跳到从光标所在的单词或向右三个单词的词尾

3b   跳到前三个单词的词首

行首、行尾之间的快速跳转

编辑模式下

0   数字零,跳转至绝对的行首,实际试验中是跳到相对行首而不是绝对行首??

^   脱字符,跳转至行首,如果行首是空白字符,则跳到行首的首字母上

$   跳转至行尾

句子间跳转(不常用)

编辑模式下

)  下一句

(  上一句

段落之间跳转(不常用)

编辑模式下

}   下一段

{   上一段

行间移动

编辑模式下

#G   跳转到指定行,如8G,就是跳转至第八行的行首

G    跳转至文章的尾行

gg   跳转至文章的首行

末行模式下,直接指明数字即可完成跳转

:3    代表跳至第三行

编辑操作

编辑模式下

x   删除光标所在的字符

#x   一次删除#个字符(向右)

dd   删除一整行

#dd   删除连同本行以及向下一共#行

d可以结合单词跳转、行首、行尾跳转完成定位删除,如:

dw   删除光标所在处至下个单词词首之间的字符

de   删除光标所在处至下个单词尾部之间的字符,基本上算是删除下个单词

db   删除光标所在处至上个单词词首之间的字符

d^   删除光标所在处至行首之间的字符

d$   删除光标所在处至行尾之间的字符

d0   删除光标所在处至行首之间的字符(绝对行首)

#d{w|e|b}  一次删除多个

p    粘贴(put ,paste)可以粘贴最后一次删除的内容

p    小写,粘贴光标之后

P    大写,粘贴光标之前

行级别的粘贴,p(小写)光标所在行向下另起一新行粘贴,P(大写)光标所在行向上另起一新行粘贴

y   复制操作,使用方法和d一样

yy   复制一整行

#yy   向下连同本行一共#行进行复制

和d一样可以结合单词、行首、行尾的跳转动作进行复制

dw   复制光标所在处至下个单词词首之间的字符

de   复制光标所在处至下个单词词尾之间的字符

db   复制光标所在处至上个单词词首之间的字符

y^   复制光标所在处至行首之间的字符

y$   复制光标所在处至行尾之间的字符

#y{w|e|b}  一次复制多个

c   change,替换操作

cc  删除整行并进入插入操作

#cc   连同本行向下一共#行删除并进入插入操作

c^   删除光标所在处至行首之间的内容,并进入插入操作

c$   删除光标所在处至行尾之间的内容,并进入插入操作,与C(大写)效果一样

cw   删除光标所在处至下个词的词首之间的字符并进入插入操作

ce   删除光标所在处至下个词的词尾之间的字符并进入插入操作

cb   删除光标所在处至上个单词词首之间的字符并进入插入操作

#c{w|e|b}  一次替换多个

r   替换光标所在处的单个字符,一次只做一次替换

撤销动作

u   undo  撤销修改

#u   撤销#次修改(默认只保存50次修改)

Ctrl+r    还原撤销内容

.   重复上一次动作

编辑模式下的翻屏操作

Ctrl+f    下一屏

Ctrl+b    上一屏

Ctrl+d    向下半屏

Ctrl+u    向上半屏

文本搜索

/PATTERN    从头部向下搜索

?PATTERN    从尾部向上搜索

n           下一个

N           上一个

文本替换操作(末行模式)

地址定界

:startline[,endline]

:#  第#行

:.  当前行

:$  尾行

:%  全文

:+#  指定位置向下#行

:-#  指定位置向上#行

如   :10,+8d  删除10到18行的内容;  :10,-8d   删除10行到第2行的内容

文本替换命令(末行模式)

格式    s/要查找的内容/要替换的内容/修饰符

其中”/”  是分隔符,可以使用查找或替换中不包含的符号来替换,如@、#等

“要查找的内容”   支持正则表达式

“要替换的内容”   不支持正则表达式,但可以使用后向引用\1  \2 ……

修饰符   i表示忽略大小写,g表示全局global

PS:“要替换的内容”使用&引用“要查找的内容”的全部内容

多文件模式

vim   [option ]  file ……

+#   打开文件并跳转至第#行,vim +3  file,打开file并定位至第3行

:next  下一个文件

:prev   上一个文件

:first  第一个文件

:last   最后一个文件

:wall   全部保存

:qall   全部退出

:wqall  全部保存退出

多窗口模式

vim  -o  file1  fiel2 ……   水平分割打开多个文件

vim  -O file1  fiel2 ……   垂直分割打开多个文件

窗口之间跳转ctrl+w,arrow(方向键)

单个文件也可以进行窗口分割

Ctrl+w,s    水平分割

Ctrl+w,v    垂直分割

显示属性定义(末行模式)

:set  nu  显示行号      :set nonu关闭显示行号

:set  hlsearch  搜索高亮显示    :set  nohlsearch 关闭搜索高亮

:set  autoindent (:set ai)   开启自动缩进   :set noautoindent  (:set noai)

:set  ignorecase (:set ic)  忽略大小写      :set  noignorecase  (:set noic)

:set showmatch  (:set sm) 开启高亮显示括号配对   :set noshowmatch  (:set nosm)

vim配置文件

全局配置文件  /etc/vimrc

个人配置文件  ~/.vimrc  默认不存在,新建保存即可


2、总结文件查找命令find的使用方法;

文件查找功能可以使用locate和find

locate   根据数据库查找文件,所有查找的结果不会很全,必要时执行updatedb更新数据库

find 用法

find  [option] [PATH]  [条件]  [处理动作]

查找条件:

根据名称来查找

-name “文件名”  文件名写法支持globbing(通配符)

-iname  “文件名”  忽略文件名大小写

根据属主、属组来查找

-user  unsername  

-group  groupname

-uid  #   根据uid查找

-gid  #   根据gid查找

-nouser     查找没有属主的文件

-nogroup    查找没有属组的文件

条件组合,与、或、非

-a    查找条1 -a  查找条件2 �Ca……   -a可省略

-o    查找条件1 �Co 查找条件2 �Co ……

-not   使用!也行

按照文件类型查找

-type

f    普通文件

d    目录文件

l    链接文件

b    块文件

c    字符文件

p    管道文件

s    套接字

按照文件大小查找

-size  +|-   常用单位有K M G

-size   #k    查找大于#-1 小于等于#k的文件

-size   +#k   查找大于#k的文件

-size   -#k   查找小于等于#-1k的文件

根据时间戳查找

以天为单位

-atime   [ +|-]  #

-ctime   [ +|-] #

-mtime   [ +|-] #

举个例子:

wKioL1XroV_Ah5nXAAAKmAH4QiM204.gif

-4  表示小于等于4

4   表示大于4但小于5天

+4  表示大于等于5天

以分钟为单位

-mmin

-cmin

-amin

根据权限查找

-perm [+|-] MODE

指明MODE不是+、- 表示精确匹配

+   任何一类的权限,只要对应用户位能够包含其中一类即可

-   每一类用户权限都要包含对应位的权限

处理动作

-print   结果输出值屏幕,默认及时如此

-ls     显示详情

-exec  COMMAND {}  \;  直接执行没有交互提醒操作,{}代表find搜索到的值,\;是固定语法格式结尾

-ok   COMMAND {} \;   效果等同于-exec ,但是每一步操作需要用户确认,有交互提醒

注意:

find  能够一次性找到所有符合条件的文件,并一同传递给后面的命令,但有些命令不支持过长的参数,可以使用:

find  XXXX |  xargs COMMAND

 

3、总结bash环境变量的相关内容;

bash配置文件生效范围,存在两类:

全局类

/etc/profile  /etc/profile.d/*.sh

/etc/bashrc

个人类

~/.bash_profile

~/.bashrc

按照功能划分(profile类、bashrc类)

profile类,为交互式登录shell提供配置

/etc/profile  /etc/profile.d/*.sh

~/.bash_profile

功用:1、定义环境变量如PATH PS1等;2、运行的命令脚本

bashrc类,为非交互式登录shell提供配置

/etc/bashrc

~/.bashrc

功用:1、定义命令别名;2、定义本地变量

变量类型

环境变量    作用于当前shell进程及子进程

本地变量    作用于当前shell进程,子进程不生效

局部变量    作用与仅当前shell进程中某代码片段

位置变量    $0 $1 $2  ……

特殊变量    $?

变量定义方式:

bash内嵌变量,可以直接调用,其中内嵌了如PATH  PS1等

用户自定义变量

变量名=值   变量存储格式默认均采用字符形式,可以不经声明之间使用

查看:set

pstree  命令,查看进程树

定义环境变量

export  变量名=值   本地变量声明为环境变量

declare  -x  变量名=值   等同于export

查看:env  printenv export

撤销变量

unset  变量名

引用变量

${变量名}

bash中引号的作用

“”  双引号,弱引用

‘’  单引号,强引用

``    反引号,引用其命令执行的结果

交互式、非交互式登录shell的区别:

交互式:需要输入用户名和密码 ,如终端登录;  su -  username用户切换

非交互式:不需要输入用户名和密码,如图形界面下右击打开终端 ;  su  username切换(不加-)

配置文件的作用次序

交互式:

/etc/profile à /etc/profile.d/*.sh à /etc/bashrc  à  ~/.bash_profile à ~/.bashrc 

非交互式

~/.bashrc  à /etc/bashrc à /etc/profile.d/*.sh

编辑配置文件后生效方法:

可以重新登录shell; source  file  或者./PATH/FILE 执行(注意重复执行,结果可能或重复添加)


4、总结Linux文件系统上的特殊权限(SUID、SGID、Sticky)的知识点;

进程的安全上下文

前提是进程有属主,文件有属主和属组

1、用户能否将某个可执行文件启动为进程,取决于用户对文件有没有执行权限

2、程序启动后,程序的属组就是用户,即程序的发起者,进程的属组是发起者的基本组

3、进程拥有的访问权限,取决于其属组的访问权限

进程的属主同文件的属主,则应用属主权限

进程的属主同文件的属组,则应用属主权限

否则应用文件的其他权限

特殊权限

SUID

如果属主有执行权限,显示为s  ,否则显示为S

功用:对于一个可执行的文件来敬,任何用户运行此程序为进程时,进程的属主不在是发起者本人,而是可执行程序文件自己的属组

chmod u+s    添加UID权限

 

SGID

功用:当目录的属组有写权限,且拥有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录新建文件或目录是,新文件或目录的属组不是创建者所属的基本组,而是目录的属组

chmod g+s  DIRECTORY

 

特殊权限位sticky

chmod o+t

除了root和文件的属主用户有删除文件,其他人都不可以删除

 


5、总结Linux磁盘管理、文件系统相关知识点及其相关命令的使用方法;

硬盘分类

机械式硬盘

SSD固态硬盘

 

机械式

track  磁道

sector  扇区  512bytes

cylinder  柱面,分区的基本单位

 

MBR  master boot record

           512bytes 

其中前446字节:bootloader

64  filesystem allocation  table (FAT)

    每16个字节表示一个分区

 

 

硬盘接口类型

IDE

SCSI

SATA

SAS

USB

 

设别硬盘设备:/dev/sd[a-z],标记同一设备上的不通过分区/dev/sd[a-z][1-]

1-4  主分区或扩展分区标识

5+  逻辑分区标识



设备文件也称为特殊文件

[root@localhost ~]# ll /dev/sda*
brw-rw---- 1 root disk 8, 0 Aug 24 16:33 /dev/sda
brw-rw---- 1 root disk 8, 1 Aug 24 16:33 /dev/sda1
brw-rw---- 1 root disk 8, 2 Aug 24 16:33 /dev/sda2
brw-rw---- 1 root disk 8, 3 Aug 24 16:33 /dev/sda3
brw-rw---- 1 root disk 8, 4 Aug 24 16:33 /dev/sda4
brw-rw---- 1 root disk 8, 5 Aug 24 16:33 /dev/sda5

设备号:

主设备号major (8)     次设备号minor  (0-5)

major   设备类型

minor   同一类型下不同设备



分区原因:分割存储空间,为多个小的空间,每个空间可以独立使用文件系统

 

分区工具

常见:fdisk   parted  sfdisk   

fdisk  命令   (据说:同一块硬盘上最多支持管理15个分区)

-l   DEV 列出磁盘信息

 

fdisk  DEV    分区管理自命令

p  显示

n  创建

d   删除

t   修改磁盘id

l   列出支持的ID

w  保存退出

q   放弃修改并退出

 

创建完成之后,查看内核是否已经识别新的分区

cat /proc/partions


 

重读磁盘分区

centos5:   partprobe  【DEVICE】

centos6、7:  partx   kpartx   

partx  

-a   add

-n  number

partx -a -n /dev/sda6   添加sda6到内核

partx  -a  -n  4:6 /dev/sda    一次添加4-6分区

partx   -a DEVICE,全部添加,不过已添加的会报错

 

kpartx  -af DEVICE  强制添加硬盘分区

 

 

Linux 文件系统管理

Linux 文件系统:  ext2  ext3  ext4  xfs btrfs swap

光盘文件系统:  iso9660

windows:  fat32  ntfs

网络文件系统:  nfs   cifs

 

日志型文件系统:  (ext3  ext4xfs  btrfs)

swap 交换分区(把硬盘空间当作内存来使用)  内存不足时,把暂时不用的放到swap中存放,类似于windows中的虚拟内存

 

创建文件系统

在分区上执行格式化(高级格式化)

创建工具mkfs

检测工具fsck(fsck.ext4用来检测ext4系列)

mkfs  -t TYPE  DEVICE

blkid  DEVICE   查看分区LABEL  UUID,文件系统类型等信息

mkfs -t ext4  = mkfs.ext4

 

ext 系列文件系统的专用管理工具

mke2fs  -t  {ext2|ext3|ext4}  

-b   BLOCK  1024  2048 4096  字节

-L    LABEL   设定卷标


6、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;


Centos6中没有grub.cfg,使用/etc/grub.conf来演示


    :%s/^[[:space:]]//


7、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;


        :%s@^\([[:space:]]\)@#\1@      

    为什么不用/进行分割?因为后面用到了\(\),所以看上去不够一目了然,所以使用@来进行分割

8、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;


        :%s#/etc/sysconfig/init#/var/log#

     还可以使用#进行分割,如果查找或者替换的内容中不含这个字符


9、删除/tmp/functions文件中所有以#开头,且#后面至少跟了一个空白字符的行的行首#;


        :%s@^#\([[:space:]]\)@\1@   

    要查找的内容中可以有正则表达式,而替换中的内容不可以有,但可以使用后项引用(\1)


10、查找/var目录属主为root,且属组为mail的所有文件;


[root@localhost ~]# find  /var/ -user root -group mail -ls
525473    4 drwxrwxr-x   2 root     mail         4096 Sep  2 10:12 /var/spool/mail


11、查找/usr目录下不属于root、bin或hadoop的所有文件;


[root@localhost ~]# find /usr/  -not \( -user root -o -user bin -o -user hadoop \) -ls
402139   12 -rwsr-xr-x   1 abrt     abrt        10296 Jul 25 00:08 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

注意事项:-not后面的\(\) 前后需要空格隔开


12、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;


[root@localhost ~]# find /etc/ -mtime -7 -not \( -user root -o -user hadoop \) -ls
1179660    4 drwxr-xr-x   2 779      hadoop       4096 Sep  2 13:38 /etc/mytest


13、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;


[root@localhost ~]# find / \( -nouser -o -nogroup \) -mtime -7 -ls
1179660    4 drwxr-xr-x   2 779      hadoop       4096 Sep  2 13:38 /etc/mytest
526066    0 -rw-rw----   1 779      mail            0 Aug 31 18:26 /var/spool/mail/bash
917513    0 --w--w--w-   1 779      root            0 Aug 31 18:10 /tmp/b
918351    4 drwx------   4 1001     1001         4096 Sep  2 13:43 /home/database
917516    4 drwx------   4 779      779          4096 Sep  2 13:43 /home/bash
find: `/proc/1090/task/1090/fd/5': No such file or directory
find: `/proc/1090/task/1090/fdinfo/5': No such file or directory
find: `/proc/1090/fd/5': No such file or directory
find: `/proc/1090/fdinfo/5': No such file or directory

14、查找/etc目录下大于20k且类型为普通文件的所有文件;


[root@localhost ~]# find /etc/ -size +20k -type f -exec ls -ldh {} \;

查找出来的太多,就不贴上来了


15、查找/etc目录下所有用户都没有写权限的文件;


[root@localhost ~]# find /etc/ -not -perm +222 -ls
1179988  352 -r--r--r--   1 root     root       359773 Aug 19 23:51 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
1179991  208 -r--r--r--   1 root     root       211626 Aug 19 23:51 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem

所有用户都没有写权限 = 不是任何个一个用户包含写权限


16、查找/etc目录下至少有一类用户没有执行权限的文件;


[root@localhost ~]# find /etc/ -not -perm -111

至少有一类用户没有执行权限  =  不是 每一类用户都有执行权限


17、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;


[root@localhost ~]# find /etc/init.d/ -perm -113

-111 是每位用户都包含执行权限,其他用户还要有写权限,就在其他用户位上+2即可 = -113


18、让普通用户能使用/tmp/cat去查看/etc/shadow文件;

[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1206 Sep  2 13:42 /etc/shadow
[root@localhost ~]# chmod u+s /tmp/cat 
[root@localhost ~]# ll /tmp/cat
-rwsr-xr-x 1 root root 48568 Sep  6 11:14 /tmp/cat

分析:普通用户执行cat,那么此cat的进程属主为执行者本人,而此执行者本人不属于passwd中的属主、属组,所以按照shadow的的o权限位,是不能读的,给/tpm/cat添加上SUID权限,那么普通用户执行cat的进程属主就为root,虽然shadow的属主为没有权限,但root具有至高无上的权限,依然能够读取

[root@localhost ~]# su - hadoop
[hadoop@localhost ~]$ /tmp/cat /etc/shadow
root:$6$qHghFv2SnmPJgsKM$JbGecAAkkhJQsRO4eLGMScdCe3HCzZF2QXoHskXDMEM7FT3NxwiLzurqyYFiXrG5gQfv1rutpAeMuTcyUKwQm/:16666:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
……

19、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组;此外,每个用户仅能删除自己的文件;


先分析下:

让某组内普通用户对其有写权限,chmod  g=rwx  /test/data

且创建的所有文件的属组为目录所属的组  chmod  g+s  /test/data

每个用户仅能删除自己的文件  chmod s+t  /test/data

验证:

[root@localhost data]# ll -d /test/data/
drwxrwsr-t 2 root hadoop 4096 Sep  6 12:00 /test/data/
[user1@localhost data]$ touch aa
[user1@localhost data]$ ll
total 0
-rw-r--r-- 1 user1  hadoop 0 Sep  6 12:01 aa
-rw-rw-r-- 1 hadoop hadoop 0 Sep  6 12:02 bb

 查看/test/data的权限,SUID,sticky

[user1@localhost data]$ whoami
user1
[user1@localhost data]$ ll
total 0
-rw-r--r-- 1 user1  hadoop 0 Sep  6 12:01 aa
-rw-rw-r-- 1 hadoop hadoop 0 Sep  6 12:02 bb
[user1@localhost data]$ rm  -rf bb
rm: cannot remove `bb': Operation not permitted

删除另外一个用户的文件被拒绝






你可能感兴趣的:(总结,练习)