一、作业(练习)内容:

1、总结文本编辑工具vim的使用方法;
2、总结文件查找命令find的使用方法;
3、总结bash环境变量的相关内容;
4、总结Linux文件系统上的特殊权限(SUID、SGID、Sticky)的知识点;
5、总结Linux磁盘管理、文件系统相关知识点及其相关命令的使用方法;
6、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;
7、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;
8、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;
9、删除/tmp/functions文件中所以#开头,且#后面至少跟了一个空白字符的行的行首#;
10、查找/var目录属主为root,且属组为mail的所有文件;
11、查找/usr目录下不属于root、bin或hadoop的所有文件;
12、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
13、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
14、查找/etc目录下大于20k且类型为普通谁的的所有文件;
15、查找/etc目录下所有用户都没有写权限的文件;
16、查找/etc目录下至少有一类用户没有执行权限的文件;
17、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
18、让普通用户能使用/tmp/cat去查看/etc/shadow文件;
19、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组;此外,每个用户仅能删除自己的文件;

二、完成时间:

2015年9月7日之前。


三、完成步骤:


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

vim编辑器

1)vi的三种模式(模式化编辑器)

    a)编辑模式(又称命令模式)

    b)输入模式

    c)末行模式(内置接口)


(1)编辑模式 --切换至--> 输入模式,可通过以下字符进入:

    i:insert,光标所在字符前插入

    a:append,光标所在字符后插入

    o:new line,当前行的下一行插入一行

    I:行首输入

    A:行尾输入

    O:光标所在行上一行新建一行

(2)输入模式 --切换至--> 编辑模式

    ESC键

(3)编辑模式 --切换至--> 末行模式

    :(英文冒号)

(4)末行模式 --切换至--> 编辑模式

    ESC键 (注:需快速回到末行模式,连续按两次ESC键)

    

2)使用VIM

(1)打开vim:

#vi

#vi /PATH/TO/SOMEFILE

     +#:#号为行号;(打开定位到第#行)

     +/PATRERN 定位到第一次被匹配的PATTERN。 

(2)关闭vim:

:q    不保存退出(文件没有更改的情况下使用)

:q!   不保存强制退出(文件更改过,不想保存时使用)

:wq   保存退出(修改过文件保存配置)

:x    保存退出

:w /PATH/TO/SOMEFILE 将文件内容保存至另外一个新路径下

ZZ:保存退出(直接保存退出,不用退出编辑模式)

(3)光标转转:

a)字符跳转:

    h,左移一个字符

    l,右移动一字符

    j,下移动一行

    k,上移动一行

    3h,右移动3个字符

b)单词间跳转:

    w:后单词的词首(字符当作一个单词)

    e:当前或后一个单词的词尾

    b:当前或前一个单词的词首

    #COMMAND 3w 表示后移第三个词的词首

c)行内路转:

    ^:跳转至行首的每个非空白字符;

    0:跳转至行首

    $:跳转至行尾

d)行间移动:

    #G:跳转至第#行

    1G,gg 跳至第一行

    G 跳至最后一行

(4)编辑命令:

a)字符编辑:

    x:删除光标所在处的1个字符

    nx:删除n个光标所在处的字符

    xp:将光飘洋过海所在的字符和后面的对调

    r:替换光标所在处的字符

b)删除命令:

    d:

    d^:当前到行首非空白字符

    d$:当前到行尾

    d0:当前到行首

    dw,de,db

    dd:当前一行

    #COMMAND

    注:删除的内容会被vim编辑器

c)粘贴:p

    如果此复制或删除的内容不是一个完整行

        p:粘贴至当前光标所在处后面;

        P:粘贴至当前光标所在处前面;

    如果复制的内容是完整行(不止一行)

        p:粘贴至当前光标所在行下行;

        P:粘贴至当前光标所在行上面一行;

c)复制命令:

 y

y$,y^,y0

ye,yw,yb

 yy:复制行

 #COMMAND

改变命令:c,change

 c$,c^,c0

 cb,ce,cw

 cc:

 #COMMAND  支持数字

d)撤消此前的编辑操作:

u:undo

 #u 撤消此前n次的操作

Ctrl+r :

 恢复此前的撤销操作

.:重复前一个编辑操作

e)翻屏操作:

Ctrl+f:向后一屏;

Ctrl+b:向前一屏;

Ctrl+d:向后半屏;

Ctrul+u:向前半屏;

vim内建教程:

vimtutor

(5)vim的末行模式:内建的命令行接口

(a)地址,定界 

指定文本匹配的范围

:start_pos,end_pos

#:第#行;

#,#

#,+# 

. :当前行

$:后行一行

%:全文,相当于1,$

/pat1/:第一次被此模式所匹配到的行;

#,/pat1/

/pat1/,/pat2/

后可跟编辑命令:

 d,y

 w,r

100r /etc/fastb 

  (b)查找

/PATTERN 向尾部进行

?PATTERN 向首部进行

 n:与命令同方向

 N:与命令反方向

  (c)查找替换

s:在末行模式下,在地址定界的范围内完成查找替换操作;

s/查查看的内容/替换为的内容/修饰符

 要查找的肉容:可使用模式

 替换为的内容:不能使用模式,但可以使用后向引用符号,以引用前面模式中的分组括号所匹配到的内容;

\1,\2,...

&:引用“要找的内容”匹配到的整个内容;

修饰符:

 i:忽略大小写

 g:全局替换

/:用于分隔符,所以,要查找的内容或替换的内容中出现此符号,要使用\对其转义,使用格式:\/

  分隔符可替换为其他字符:例如@,#等;

(6)多文件模式:

vim fstab functions grub.cfg

:next 切换下一个文件

:prev 前一个

:first 第一个

:last 最后一个 


wqall 保存所有文件退出


多文件窗口分割:

vim -o fstab functions grub.cfg  ##水平分隔

vim -O  垂直分割


Ctrl+w,ARROW

单文件窗口分割:

ctrl+w,s:split,水平分割

ctrl+w,v:vertical,垂直分割


(7)定制vim的某些工作特性:

1)行号

显示:set nu

禁行:set nonu

2)括号匹配

显示:set sm

禁用:set nosm

3)自动缩进

set ai

set noai

4)高亮搜索

set hlsearch

set nohlsearch

5)语法着色

syntax on 

syntax off

6)忽略字符大小写

set ic

set noic


特性设定的永久生效方式:

全局配置文件:vim /etc/vimrc

用户个人的配置文件:vim ~/.vimrc

:help 获取帮助



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


1)文件查找:

   要文件系统中查找符合条件的文件的过程;

   文件查找:locate,find

locate:非实时查找工具:依赖于事先构选的索引:索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新此数据库(updatedb); 查找速度快,模糊查找;

find:实时查找;查找速度略慢;精确查找;


2)find 命令:

  find [OPTION]... [查找路径] [查找条件] [处理动作]


查找路径:默认为当前路径;

查找条件:指定的查找标准,可以根据文件名,大小,属主属组,类型等进行;默认为找出指定路径下的所有文件;

处理动作: 对符合条件的文件做什么操作;默认为输出至屏幕;


3)查找条件:

    (1)根据文件名进行查找: 

-name "文件名称":支持使用glob;

 *,?,[]

-iname "文件名称":不区分字符大小写,支持使用glob;

-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;

    (2)根据属主、属组查找:

-user USERNAME:查找属主为指定用户的文件

-group GROUPNAME  

-uid UserID:找查文件的属主指定uid的文件;

-gid GroupID:

-nouser :查找没有属主的文件

-nogroup:查找没有属组的文件;

     (3)根据文件类型进行查找: 

-type TYPE

 f:普通文件

 d:目录

 l:符号

 b:块设备

 c:字符设备

 p:命令管道

 s:套接字

      (4)组合查找条件:

          与条件:-a

  或条件:-o

  非条件:-not ,!

   !A -o !B = !(A -a B)

    !A -a !B = !(A -o B)

       (5)根据文件大小来查找:

  -size: [+|-]#UNIT

  单位:k,M,G

  #UNIT :(#-1,#)大于-1 ,而又小于等于数字

  +#UNIT:(#,+oo)大于

  -#UNIT:(,#)小于

       (6)根据时间戳:

以“天”为单位

 -atime [+|-]#

#:[#,#+1]

+#:[#+1,oo]

-#:[0,#]

 -mtime

 -ctime

以“分钟”为单位

 -amin

 -mmin

 -cmin


[root@MyTest-C67 etc]# touch -m -t 201508220303 /etc/fstab           

[root@MyTest-C67 etc]# find /etc/ -mtime 3  -ls 


       (7)根据权限:

-perm [/|-] MODE

 MODE:精确权限匹配

/MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可;隐含或条件;

/222:666,600,

-MODE:为每一类对象指定的每一位权限都必须同时存在方为符合条件,隐含与条件;

-222,-220


 4)处理动作:

-print:默认处理动作

-ls:类似于对查找到的每个文件做“ls -l”的操作;

-delete:删除查找到的文件;

-fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;

-ok COMMAND {} \;  

对每个文件执行指定的命令行需要用户事先确认;

-exec COMMAND {} \;

无需用户确认;


[root@MyTest-C67 test]# find ./ -perm -003 -exec chmod o-w {} \; 

##查找其他用户有w权限的用户移除。

[root@MyTest-C67 test]# find ./ -not -perm /111 -exec mv {} {}.old \;

##所有用户没有执行权限的更名加.old


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

bash环境配置:

 1)配置文件,生效范围划分,存在两类:

全局配置:

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

 /etc/bashrc

个人配置:

 ~/.bash_profile

 ~/.bashrc

  2)按功能划分,存在两类:

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

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

 ~/.bash_profile

 功用:

   (1)定义环境变量,例如PATH、PS1

   (2)运行命令或脚本


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

  /etc/bashrc

  ~/.bashrc

  功用:

(1)定义命令别名;

(2)定义本地变量;


  3)变量:内存空间,变量名

类型:

  环境变量:作用范围当前shell进程及其子进程

  本地变量:作用范围当前shell进程

  局部变量:作用范围仅为当前shell进程中某代码片断(通常为函数上下文)

 位置变量:$1,$2

 特殊变量


  4)变量定义方式:

 bash内置变量:可直接调用,内置了许多环境变量,例如PATH等

 自定义变量:

变量赋值:变量名=值

bash弱类型:

 变量存储数据时,默认均采用字符形式;任何变量可以不经声明,直接引用。

     定义本地变量:

name=value

查看:set

     定义环境变量

export name=value

declare -x name=value

     查看:env,export,printenv,


     撤消变量

unset name

     引用变量:

${name},$name

     bash中的引用符号

'':强引用,变量替换不会发生

"":弱引用

``:命令引用

5)shell登录类型:

交互式登录:

 直接通过终端进行的登录;

 通过su -l Username命令实现的用户切换;

非交互式登录:

 图形界面下打开的命令行窗口;

 执行脚本;

 su Username; 

6)配置文件作用次序:

    交互式登录:

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

    非交互式登录:

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh


  编辑配置文件定义的新配置文件如何生效?

1)重新登录;

2)让当前shell进程去重新读取指定的配置文件。

  source /PATH/TO/SOMEFILE

  . /PATH/TO/SOMEFILE

注意:副作用


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

Linux文件系统上的特殊权限

权限模型:

 u,g,o 对应r,w,x

进程的安全上下文:

 前提:进程有属主(进程以哪个用户的身份运行);文件有属主和属组;

 (1)用户是否能够把某个可执行程序启动为进程,取决于用户对程序文件是否拥有执行权限;

 (2)程序启动为进程后,此进程的属主为当前用户,也即进程的发起者;进程所属的组,为发起者的基本组;

 (3)进程拥有的访问权限,取决其属主的访问权限;

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

b)进程的属主,属于文件的属组,则应用文件属组权限;

c)则应用其他权限。


  SUID:

(1)任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否有执行权限;

(2)启动为进程之后,其属主不是发起者,而程序文件自己的属主;这种机制即为SUID;

权限设定:

 chmod u+s FILE...

 chmod u-s FILE...

注意:

s:属主原本拥有x权限

S:属主原本无x权限

  SGID:

默认情况下,用户创建文件时,其属组为此用户所属的基本组;

一旦某目录被设定了SGID权限,则对此目录拥有写权限的用户在此目录中创建的文件所属的组为此目录的属组。

权限设定:

 chmod g+s FILE...

 chmod g-s FILE...

  Sticky:

对于一个多人可写的目录,此权限用于限制每个仅能删除自己的文件;

权限设定:

 chmod o+t FILE...

 chmod o-t FILE...

SUID,SGID,STICKY

chmod 4777 FILE

chmod 3755 DIR

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


1)Linux磁盘管理

  硬盘:

机械式硬盘

SSD


  机械式:

track

sector:512bytes

cylinder:分区的基本单位;

 

MBR:Master Boot Record

  512bytes

446:bootloader

64:filesystem allocation table

 16:标识一个分区

2:55AA

  磁盘接口类型:

IDE(ATA):133MB/s,/dev/hd

SCSI:640MB/s

SATA:6Gbps

SAS:6Gbps

USB:480MB/s


识别硬盘接口:/dev/sd

 标记不同的硬盘设备:/dev/sd[a-z]

 标记同一设备上的不同分区:/dev/sd[a-z][1-]

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

5+:逻辑分区标识

设备文件:特殊文件

 设备号:

major,minor

major:设备类型

minor:同一类型下的不同设备

 "块":block,随机设备

 "字符":character,线性设备

GPT


  分区:分隔存储空间为多个小的空间,每个空间可独立使用文件系统;

  分区工具:

fdisk,parted,sfdisk

  fdisk工具的使用:

最多支持在一块硬盘上的15个分区;

分区管理子命令:

 p:显示

 n:创建

 d:删除

 t:修改分区ID

 l:列出所有支持ID类型

 w:保存退出

 q:放弃修改并退出

 m:获取帮助

  


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

 ##cat /proc/partitions

 有三个命令可以让内核重读磁盘分区表:

   CentOS 5:partprobe [device]

   CentOS 6,7:

partx []

kpartx

partx -s /dev/sda  显示

partx命令:

 partx DEVICE

 partx -a DEVICE

 partx -a -n 7:8 /dev/sda

kpartx命令:

 kpartx -ar DIEVICE


2)Linux上的文件系统管理

文件系统:

   VFS:Virtual File System

   Linux:ext2,ext3,ext4,reiserfs,xfs,btrfs,swap

   光盘:iso9660

   Windows:fat32(vfat),ntfs

   Unix:ffs,ufs,jfs,jfs2   

   网络文件系统:nfs,cifs

   集群文件系统:ocfs2,gfs2

   分布式文件系统:ceph,

moosefs,mogilefs,hdfs,gfs,glusterfs

   (1)日志型文件

非日志型文件系统:ext2

日志型文件系统:ext3

   (2)swap:交换分区


创建文件系统:

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

 要使用某种文件系统,满足两个条件;

 内核中,支持此种文件系统

 用户空间:有文件系统管理工具

创建工具:mkfs(make filesystem)

 mkfs -t type DEVICE

创建:

[root@localhost ~]# mkfs -t ext4 /dev/sda7

检查:

[root@localhost ~]# blkid /dev/sda7

/dev/sda7: UUID="69808cf0-cf4f-4915-963c-ea91d81afe36" TYPE="ext4"


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

 mke2fs -t {ext2|ext3|ext4} DEVICE

-b BLOCK:1024,2048,4096

-L 'LABEL':设定卷标

 mke2fs -t ext4 /dev/sda7

blkid命令:定位和显示块设备的属性。

blkid DEVICE

LABEL,UUID,TYPE


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

[root@MyTest-C67 tmp]# cp /etc/grub.conf /tmp/
[root@MyTest-C67 tmp]# vim /tmp/grub.conf 
:1,s/[[:space:]]//

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

[root@MyTest-C67 tmp]# cp /etc/rc.d/init.d/functions /tmp/
[root@MyTest-C67 tmp]# vim /tmp/functions
:1,%s/^[[:space:]]/#\1/g

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

:1,%s#/etc/sysconfig/init#/var/log#g

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

:1,%s/^#[[:space:]]//g

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

[root@MyTest-C67 tmp]# find /var -user root -group mail -type f
/var/spool/mail

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

[root@MyTest-C67 etc]# find /usr !  -user root -o -user bin -o -user hadoop 
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache


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

[root@MyTest-C67 etc]# chown user1:user1 123.txt 
[root@MyTest-C67 etc]# find /etc/ ! -user root -o  -user hadoop
/etc/123.txt
[root@MyTest-C67 etc]# find /etc/ ! -user root -o  -user hadoop -mtime -7
/etc/123.txt

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

[root@MyTest-C67 etc]# find / -nouser -nogroup -ctime -7
/home/centos
/home/centos/.bash_profile

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

[root@MyTest-C67 etc]# find /etc/ -size +20k -type f
/etc/services
/etc/prelink.cache
/etc/sysconfig/network-scripts/network-functions-ipv6
/etc/httpd/conf/httpd.conf
/etc/mime.types

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

[root@MyTest-C67 etc]# find /etc  -perm 444 -ls 
2098671    4 -r--r--r--   1 root     root          324 Jul 24 00:14 /etc/ld.so.conf.d/kernel-2.6.32-573.el6.x86_64.conf
2099268    0 -r--r--r--   1 root     root            0 Aug 25 15:09 /etc/111
2099194    4 -r--r--r--   1 root     root

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

[root@MyTest-C67 etc]# find /etc  -perm /111 -ls

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

[root@MyTest-C67 init.d]# touch 111
[root@MyTest-C67 init.d]# chmod o+w 111
[root@MyTest-C67 init.d]# ll 111
-rw-r--rw-. 1 root root 0 Aug 25 15:18 111
[root@MyTest-C67 init.d]# find /etc/init.d/  -perm /111 -o -perm -002 -ls
2099386    0 -rw-r--rw-   1 root     root            0 Aug 25 15:18 /etc/init.d/111

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

[root@MyTest-C67 init.d]# cp /bin/cat /tmp/
[root@MyTest-C67 init.d]# ll /tmp/cat
-rwxr-xr-x. 1 root root 48568 Aug 25 15:24 /tmp/cat
[root@MyTest-C67 init.d]# chmod u+s /tmp/cat 
[root@MyTest-C67 init.d]# ll /tmp/cat 
-rwsr-xr-x. 1 root root 48568 Aug 25 15:24 /tmp/cat
[root@MyTest-C67 init.d]# su - hadoop
[hadoop@MyTest-C67 ~]$ /tmp/cat /etc/shadow
root:$6$TJtZoHFGdPSaJRLw$GqMCBXKtGU7R08n8K3/MTY0tm3.YejlWwsVCkgpVjFL1V4Qx2R.f10voWBeIYDQEchyVAEyTq33cvJyKUWokQ.:16671:0:99999:7:::

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

[root@MyTest-C67 init.d]# mkdir /test/data -p
[root@MyTest-C67 init.d]# ll -ld /test/data/
  wxr-xr-x. 2 root root 4096 Aug 25 15:26 /test/data/
[root@MyTest-C67 init.d]# chmod g+w /test/data
[root@MyTest-C67 init.d]# chmod g+s /test/data
[root@MyTest-C67 init.d]# ll -ld /test/data/  
drwxrwsr-x. 2 root root 4096 Aug 25 15:26 /test/data/
[root@MyTest-C67 init.d]# cd /test/data/
[root@MyTest-C67 data]# touch root.old
[root@MyTest-C67 data]# chmod o+t /test/data/
[root@MyTest-C67 data]# su - hadoop
[hadoop@MyTest-C67 ~]$ cd /test/data/
[hadoop@MyTest-C67 data]$ ll
total 0
-rw-r--r--. 1 root root 0 Aug 25 15:28 root.old
[hadoop@MyTest-C67 data]$ touch hadoop.old
touch: cannot touch `hadoop.old': Permission denied
[hadoop@MyTest-C67 data]$ exit
logout
[root@MyTest-C67 data]# usermod -a -G root hadoop
[root@MyTest-C67 data]# su - hadoop
[hadoop@MyTest-C67 ~]$ cd /test/data/
[hadoop@MyTest-C67 data]$ touch hadoop.old
[hadoop@MyTest-C67 data]$ ll
total 0
-rw-rw-r--. 1 hadoop root 0 Aug 25 15:31 hadoop.old
-rw-r--r--. 1 root   root 0 Aug 25 15:28 root.old
[hadoop@MyTest-C67 data]$ rm root.old 
rm: remove write-protected regular empty file `root.old'? y
rm: cannot remove `root.old': Operation not permitted
[hadoop@MyTest-C67 data]$ vim root.old
[hadoop@MyTest-C67 data]$ exit
logout
[root@MyTest-C67 data]# chmod o-t /test/data/
[root@MyTest-C67 data]# su - hadoop          
[hadoop@MyTest-C67 ~]$ cd /test/data/
[hadoop@MyTest-C67 data]$ ls
hadoop.old  root.old
[hadoop@MyTest-C67 data]$ rm root.old 
rm: remove write-protected regular empty file `root.old'? y
[hadoop@MyTest-C67 data]$