Linux 20150830学习整理 VIM、FIND、bash环境、特殊权限

第一部分  VIM

文本编辑器只针对ASCII码,字处理器

1、种类:

  简单编辑器  nano:是全屏模式

  vi:visual interface 全屏文本编辑器,模式化的编辑器

  VIM是vi的增强版本有高量、语法着色显示等功能

2、VI工作模式

  编辑模式:VI默认工作模式(也称为命令模式)

  输入模式:输入字符内容

  末行模式:在屏幕最后一行,可以编辑文件和其它额外操作。内嵌命令行接口 以

  冒号" : "可输入命令

工作模式切换

  编辑模式----> 输入模式用以下快捷键

       小写i   insert光标前插入

       大写I   当前光标所在行首插入

 

       小写a append 当前光标后

       大写A   当前光标所在行尾插入

 

       小写o    新行,当前光标所在行下一行新建一行

       大写O   当前光标上一行接入新行

 

       大写L   最后一行行首

                                       

  输入模式---->返回编辑模式 esc键

  编辑模式--->末行模式 ,冒号 : 可输入相关命令

      末行模式----》编辑模式 一次esc 2-3秒延时 二次esc快速

      无法直接从编辑进行末行模式 ,需要先使用esc退出

3、编辑操作

A:打开文件定位光标类

#VIM /path/to/somefile  要求文件前的目录存在,如果文件不存在将新建文件

    vim [options] [file ..] 
    vim [options] - 
    vim [options] -t tag 
    vim [options] -q [errorfile]

      +# :#号为行号   vi +10 bash1.txt 表示编辑bash1的第10行

      +/PATTENR : 定位到第一次匹配的行首  vim +/UUID /etc/fstab

      +  表示最后一行行首 

 B:退出、关闭文件类

  一般在编辑和模式下进行

   末行模式     w为保存   q为退出(不保存模式)

      :q 退出

      :q! 强行不保存退出

      :wq 保存退出

      :w! 管理员强行保存

      :x  保存退出

  编辑模式:

     ctrl+ZZ  保存并退出

C:光标跳转类

字符间跳转

   h 左一个字符  l 右一个字符   

   j 向下一行(与上行字符所在光标位置对齐)   

   K向上一行 (与上行字符所在光标位置对齐)

   #jklh  移动#个字符可加数据3k,6j等 ,一次跳转n个字符或几行

单词跳转

  备注:(不包括特殊字符,字母与数字),连续的字符示为一个单词

  w 后单词词首  e 当前或后一个单词词尾   b 前一个单词词首

   以上支持与数据结合3#

    示例:#W      3W往后跳几个单词

行内跳转

   ^ 跳转至行首的每一行非空白字符

   0 跳行首,绝对行道,包括空白字符

   $ 跳行尾

行间移动

    #G 跳转到#行 1G行道   例如直接3G为第三行

      只有G为最后一行,行首

      在末行模式直接输入行号回车即可 :#  :5 跳转至第5行

句间移动

    )跳转至后一句句首

   (跳转前一句句首

段落间移动

   { 段首

    } 段尾

D:编辑类指令

   字符编辑

     x 表示删除光标所在处字符 #X 删除光标指定后#的字符如4x

     xp: 与后一个字符光标对调

   字符替换

     只能够替换单个字符

       r+替换后的字符    替换光标所在处的字符

       大写R替换模式,可直接替换多个字符

     例如rz   将当前光标字符替换为z

        4rz  将当前光标后4字符替换z                            

   删除命令:可与光标跳转配合,删除之间的字符

     d后面加上指定位置删除多少  #d跳转符

     d^      d$ 行尾   d0 行首

     dw 一个单词单词删除   例如3dw    #de ,#db

     db 删除一行

     #dd  删除包前光标所在行在的的#行

 末行模式下:

  startDD,endADDd 删除从开始至指定位置的行数

     例如:.,5d 当前向下5行后   :1,8d  删除第一至第8行

    . 当前行     $最后一行   +# 当前位置向下的#行       

       $-#  末行最后#行

  注意:删除的内容会被vim编辑在缓冲区(内存)当中,可撤消可恢复。

  最后一次的内容可粘贴到指定位置。

粘贴命令

   p(paste,put)   大小p

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

      小写p 当前光标处所在行的前面

      大写P 当前光标处所在处的后面

     如之前复制或删除的内容是完整行 不止一行

      小写p 当前光标处所在处的上方

      大写P 当前光标处所在处的下方

复制命令   y yank

   #command

     y 用户与d基本相同

      y$  t复制光标处所在行,目前位置至行尾的内容

      y^  当前光标至行首不 包括空白字符 

      y0  当前光标至行首包括空白字符

      ye     yw   二个基本相同针对当前光标的单词  

      yb复制当前光标处单词前面字符

      yy 复制当前一行

      #yy 可复制#行

                             

改变命令  c change 模式转换

    与y,d功能相近,先删除内容,再转换为输入内容

     c$,c^,c0 cb,ce,cw

       cc

        #command改变命令

撤消编辑操作

   u undo 默认50次,撤消此前编辑操作

     #u 直接撤消#次编辑操作

     ctl+r表示撤消最近的一次撤消操作,还原最近一次撤消操作

重复前一个编辑操作

              .

可视化操作

   v按字符选取

   V按矩形选取

     选取后可进行编辑操作包括删除、复制等,

     注意字符时利用hjkl上下左右键选择

  翻屏操作

     编辑模式下

        ctl+f 向后一屏 ctl+b 前一屏

        ctl+d 向下半屏 ctl+u向前半屏       

E:VIM末行模式操作

   (1)地址 ,定界 :start_pos,end_pos

        #:第#行; 
        #,# 
        #,+# 
        .: 当前行 
        $: 最后一行 
        %: 全文,相当于1,$

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

    后可跟编辑命令: 
         d, y 
         w, r 
   示例  :5    光标移动到第5行

        :5d 删除第5行

        :#,# 3,10从3至10行 例如  :1,15d  删除第1至15行

        :#,+# 当前行向下几行  :1,+6d 删除第1至后6行

        :.当前行  .d删除当前行

        :$最后一行

(2)查找

查找:支持正则表达式

   /PATTERN   从行首至行尾

   ?PATTERN  从当前光标处至首部,往回找

   n  下一个,向下

   N  下一个,往回

示例 /echo  查找字符echo

(3)  查找和替换      

在末行模式可以使用命令s(相当于set命令)    s: 在末行模式下,

  在地址定界的范围内完成查找替换操作;

起始地址,结束地址s@PATTERN@替换成的@修饰符gi

  s/要查找的内容/替换为的内容/修饰符 
     要查找的内容:可使用模式 
     替换为的内容:不能使用模式,但可以使用后向引用符号

  ,以引用前面模式中的分组括号所匹配到的内容; 
          \1, \2, ... 
&:引用“要找的内容”匹配到的整个内容; 
       修饰符: 
 i: 忽略大小写 
 g: 全局替换

 /:用于分隔符,所以,要查找的内容或替换为的内容中出现此符号,

要使用\对其转义,使用格式:\ /     分隔符可替换为其它字符:例如@,#等;

addr1,addr2S@pattern@string@gi

   特殊含义字符

      空格:\s

      行末空格:\s$

      行首空格:^\s

F:多文件模式

  vim FILE1 FILE2 ...    默认在第一个文件,第二个文件:next 
      :next 
      :first 
      :prev 
      :last

      :wqall    保存所有文件 
      :q!all   多个文件不保存退出

G:窗口分隔

vim -o|-O FILE1 FILE2 ...

    Ctrl+w, ARROW      小o为分水,大O为垂直分隔

单文件窗口分割: 
    Ctrl+w, s: split, 水平分割 
    Ctrl+w, v: vertical, 垂直分割

H:定制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

     :help 获取帮助    
     :help SUBJECT

   特性设定的永久生效方式:    
    全局配置文件:/etc/vimrc    
    用户个人的配置文件:~/.vimrc

I:练习: 
1、复制/etc/grub2.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub2.cfg

文件中的行首的空白字符;         CentOS: /etc/grub.con

image

 备注说明:%s/^[[:SPACE :]]/     后面为空代表删除空白

 也可以使用:%s/^\s/ 的形式

2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/

tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;

:%s/^[[:space:]]/#&   &表示    
image

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

   这里使用转译符

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

 image

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

:%s/#[[:space:]]/    

image                    
  

第二部分   Find  文件查找

 grep、egrep、fgrep等命令用于文本查找,Find则用于针对文件进行查找

1、查找常用命令

   locate: 非实时查找工具;依赖于事先构建的索引;索引的构建是在系统较为空闲时

自动进行(周期性任务);手动更新此数据库(利用命令updatedb);优势是查找速度快;模糊查找; 
  find:实时查找;查找速度略慢;精确查找;

2、find命令:实时的、精确查找,遍历指定目录中所有文件的查找、速度慢,支持

多种查找类型和标准

 格式定义:    find [OPTION]... [查找路径] [查找条件] [处理动作] 
    查找路径:默认为当前路径; 
    查找条件:l默认是指定下的所有文件:指定的查找标准,根据文件名、大小、

      属主属组、类型等进行;默认为找出指定路径下的所有文件; 
      处理动作:对符合条件的文件做什么操作;默认为输出至屏幕;

 查找条件 
A: 根据文件名进行查找 
 -name "文件名称": 对文件名精确匹配支持使用通配符 glob;  *,任意长度字符 ?, [ ]   

 示例:find /etc �Cname ‘passwd’
 示例:find /etc �Cname ‘*passwd’    查找以passwd结束的文件

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

   -regex "PATTERN":以正则表达式进行文件名。匹配整个文件路径字符串,而不

仅仅是文件名称;  后面需要指定regex类型

B: 根据属主、属组查找 
 -user USERNAME: 查找属主为指定用户的文件;

示例: find /tmp  -user user1

  -group GROUPNAME:  根据属组查找

  -uid UserID: 查找文件的属主指定uid的文件;删除用户后,只显示uid,只能够通过GID进行查找 
     -gid GroupID: 根据GID进行查找

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

 C: 根据文件类型进行查找: 
    -type TYPE 
      f: 普通文件 
      d: 目录 
      l: 符号链接 
      b: 块设备 
      c: 字符设备 
      p: 命名管道 
      s: 套接字 

示例:find /etc �Ctype l

D:组合查找条件 
 与条件:-a    优先级中等与  ,二个都要满足 
   或条件:-o   优先级最低 
   非条件:-not, !   优先级最高

   条件之间末指定条件是默认是与条件,

摩根定律

  !A -o !B = !(A -a B)   AB为二个条件 
  !A -a !B = !(A -o B)

示例:find /tmp �Cnot �Ctype d      用于查找tmp非目录类型的文件

find ./  -not -user  chris -a -not -user root 查找非chirs和root用户的文件

                    或                                     

  

  find ./  -not \( -user chris -o -user root \)

 E:根据文件大小来查找 
  -size [+|-]#UNIT    单位:k, M, G,默认单位是字节  #k #M  #G  精确

    注意这里进行舍入,  +代表大于 

     #UNIT: (#-1,#]    例如3为大于2小于3的数值 
     +#UNIT: (#,+oo) 
     -#UNIT:[0,#-1]

  示例:find /etc �Csize 5k �Cls

 F:  根据时间戳 
  以“天”为单位  +表示至少多少天    -表示多少天之内 
    -atime [+|-]# 
    #:[#,#+1) 
    +#: [#+1,oo] 
    -#: [0,#) 
       -mtime 
       -ctime

 示例:find ./ �Catime �C5 表示5天之内访问过的文件

         以“分钟”为单位 
             -amin 
             -mmin 
              -cmin

   G:根据权限 
   -perm [/|-]MODE 
   MODE: 精确权限匹配 
    /MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可;隐含或条件; 
           /400 属主能读即可

           /444 任意读即可 
    -MODE:为每一类对象指定的每一位权限都必须同时存在方为符合条件;隐含与条件;

            -222

            -200

     

 示例:find ./  �C perm �C200

                             

 处理动作 
    -print: 默认处理动作 
    -ls:类似于对查找到的每个文件做"ls -l"的操作; 
    -delete: 删除查找到的文件; 
    -fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;

    -ok COMMAND {} \;       {}为命令占位符,引用原文件的位置   \;结束 
      对每个文件执行指定的命令之前需要用户事先确认; 
    -exec COMMAND {} \; 
      无需用户确认;

 例如:find ./ �Cperm 200 �Cexec chmod 777 {} \;

image

  3、 练习: 
   1、查找/var目录属主为root,且属组为mail的所有文件; 

 find ./ -user oracle -a -group mail   :注意由于目录没有满足root和mail的条件,

这里调整为user为oracle,group为mail

image 
   2、查找/usr目录下不属于root、bin或hadoop的所有文件; (hadoop替换为51cto用户)

  find ./ -not \( -user root -o -user bin \) -o -user 51cto    

image

         或者

[root@centos71 usr]# find ./ -not -user root -a -not -user bin -o -user 51cto    

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

[root@centos71 /]# find /etc -mtime -7 -not -user 51cto      -7写指7日内的数据 



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

[root@centos71 /]# find / -atime 7 -nouser -o �Cnogroup

image

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

[root@centos71 etc]# find /etc -size +20k -type f


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

[root@centos71 etc]# find /etc -not �Cperm -444

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

[root@centos71 etc]# find /etc -not -perm �C111

image


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

[root@centos71 etc]# find /etc/init.d -perm /111 -a -perm /004

image

第三部分:bash 环境变量

  bash shell是解析器,解析用户的命令

1、配置文件

  A:生效范围划分

 全局配置: 
   /etc/profile, 文件比较大的情况下存在指正目录下/etc/profile.d/*.sh 
                   /etc/bashrc 
 个人配置:文件以隐藏文件 
   ~/.bash_profile 
   ~/.bashrc

  B:按功能划分:(二者区别在于作用范围 

   profile用于全局变量,bashrc用于本地变量 
   profile类:为交互式登录的shell提供配置 
     /etc/profile, /etc/profile.d/*.sh    
     ~/.bash_profile

  功用: 
   (1) 定义环境变量,例如PATH、PS1 
   (2) 运行命令或脚本

     bashrc类:为非交互式登录shell提供配置 
     /etc/bashrc 
     ~/.bashrc

  功用: 
   (1) 定义命令别名;如开始拥有别名 
   (2) 定义本地变量;

 2、变量:内存空间,变量名 
  A: 类型: 
    环境变量:作用范围当前shell进程及其子进程 
    本地变量:作用范围当前shell进程 
    局部变量:作用范围仅为当前shell进程中某代码片断(通常为函数上下文)

        位置变量:$1, $2  用于脚本传递参数 
         特殊变量:$?

可通过pstree查看进程树, 所有从systemd进程开始,是用户空间的第一个进程。

是所有进程的父进程

image

 二个bash,第一个是第二个bash的父进程,父进程定义的对子进程有效,

  父进程定义的环境变量的值,在子进程中无效无法看到

image

例如在第一个bash即父进程定义的变量

  name=‘51cto’

  echo $name 输出为 51cto

这时运行子进程/bin/bash,再次输入echo $name时输出则为空

image

同上为例:如果变量定义以exort name=’51cto’定义,在父进程与子进程都可以通过

    echo$name查看到

image

 B: 变量定义与赋值方式: 
 (1)变量定义:   

    bash内置变量:可直接调用,内置了许多环境变量,例如PATH、ps1等 
     自定义变量:自已给名称 
    变量赋值:变量名=值   等于号为赋值 
                                    

    name='obama' 变量定义

    echo $name 引用变量

    bash弱类型编程语言: 
  变量存储数据时,默认均采用字符形式;任何变量可以不经声明,直接引用;

    120:24bits   120 ASCII码,转换为2进制 
    120: 8bits

 (2)变量赋值

  定义过程中shell关闭后,变量失效

      定义本地变量: 
          name=value

      查看:set

  定义环境变量: 
    export name=value 
    declare -x name=value

  查看:env, printenv, export

 C:撤消变量: 
        unset name

 D:引用变量: 
     ${name}, $name   { }绝大部分可以省略

     如下如果将二个字符串连接到一起的情况下需要使用{ }

image

 E:bash中的引用符号: 
      ' '    强引用,变量替换不会发生 
      ""      弱引用,变量替换会发生 
      ``     命令引用,命令执行结果直接引用

              进程引用

  whick  cat的执行结果字符串 作为ls �Cl参数引用,先执行被引用,再执行外面引用命令

image

  强引用与弱引用的区别,animail变量已经定义,如果利用 echo “$animail”引用则进行变量

替换发生(弱引用),输出为dog,如果为echo ‘$animail’则为强引用,则输出为 $animail

image

 3、shell登录类型: 
 交互式登录: 
   直接通过终端ssh进行的登录; 
   通过su -l Username命令实现的用户切换;

 非交互式登录: 
    图形界面下打开的命令行窗口; 
    执行脚本; 会打开shell执行 
        su Username;

4、配置文件作用次序: 
  交互式登录:后面会复盖前面的变量后面的会最终生效 
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

 非交互式登录: 
 ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

    注意生效范围:全局对所有用户、局部(当前用户下)

示例1:所有用户都生效 

vim /etc/profile.d/welcome.sh  /etc/profile.d为全局,以上操作针对所有用户生效


         文件内容如下:$UID,$HOME为已定义

image

root再通过ssh登陆时

image

示例2:针对某个用户生效编辑相应用户下的~/.bash_profile 或者~/.bashrc文件 取决于自己需要

 在root用户目录下修改bashrc文件

 image

然后重新登陆shell,通过别名查看包括cdnet的配置,再通过命令别名cdnet,

则直接进入/etc/sysconfig/network-scripts目录下

 image

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

  (1) 重新登录; 
  (2) 让当前shell进程去重新读取指定的配置文件; 
        source /PATH/TO/SOMEFILE 
属主的访问权限

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

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

    c:则应用其它权限

image

3、SUID :

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

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

权限设定:

   chmod u+s file

   chmod u-s file

    注意:当加后会出现大小写的情况

    小s :属主原本 拥有x权限

    大S :属主原本无x权限

clip_image001

rwsr中有s说明SUID权限,不管任何用户, passwd不能带参数限制只能针对root

   chmod加s权限

clip_image002

4、SGID:与suid有很大不同,针对属组进行限定

  默认每个用户创建文件时文件的属主是当前用户基本组

一但某目录被设定为SGID权限,则对此目录拥有写权限的用户在此目录中创建的文件

所属的组目录的属组,而非用户的基本组(用于全局可写,每个用户可修改别人文件

协做的情况下使用)

image

   -G代表附加组

  权限设定:chmod g+s file…

        chmod g-s file ….

        chmod g+w file(有写权限)

 示例:

 !、以root用户创建新目录,所属主和属组均为root

image

  !!、修改/mydata/data属组

image

  !!!、修改/mydata/data属组为可执行权限

image

image

  !!!!、分别以用户root,51cto创建文件

image

 这里创建的文件分别属于自已的属主和属组

 !!!!!、为/mydata/data目录添加权限

image

!!!!!! 再分别以root和51cto用户创建文件

   image

  可看到后创建的文件rootbb的属组为51cto,而非root,

  这里其它用户不可以写,但可以删除,要注意组权限

  5、 sticky 只能删除自已的文件,不能删除另人的文件

   临时文件 /tmp /var/tmp每个写都可以写该文件最后一位权限为t

   clip_image003

 sticky(粘制位)对于一个多个可写的目录,此权限用于限制每个人只能删除自己的文件,            

        chmod o+t file

        chmod o-t file

示例:

 !在上面的情况下51cto用户可删除root用户的文件

image

  !! 修改./mydata/data目录权限

image

  !!!再次以51cto用户删除root用户文件

image

6、权限整合

  suid sgid sticky

    000

    001

    010

    011

    100

    101

    110

    111

  后3位 r,x,x

示例:

chmod 1755  /tmp/51cto  说明目录51cto有755权限,1代表拥有sticky权限
chmod 4777 file ,拥有suid
chmod 3755, 目录拥有755权限,同时拥有gid和sticky

  umask 临时生效,只针对当前shell,如果永久需要修改配置文件

  umask 0022  四位中第一位就是对应上面特殊权限

练习:

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

   A:先利用 cp  /usr/bin/cat /tmp目录

   B:查看权限

image

   C:在51cto用户运行/tmp/cat /etc/shadow  提示无权限

   :在root用户运行添加s权限

image

   E:再次以51cto用户运行/tmp/cat   /etc/shadown运行正常输出。

2、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属

组为目录所属的组,此外每个用户仅能删除自己的文件

  准备: 修改51cto目录属主、属组

image

创建用户yy1、yy2、yy3、yy4指定密码为password,同时修改附加组为3001

image 

image

A:以51cto用户创建/tmp/51cto/test/data目录

image

B:同时创建用户yy1、yy2、yy3、yy4的附加组为51cto

C:以4个用户分别创建利用touch,vim命令创建文件,aa为touch文件,bb为vim文件。

这里经测试其它用户可删除文件,如下:yy1用户可删除yy4创建的yy4.cc文件

 image

D:通过chmod修改权限

  现有目录权限为775

 image

  针对sgid和sticky添加权限,组增加s,sticky t

 image

E:验证

 yy1.cc新创建文件的属组为51cto

 image

  删除文件:在yy4用户下,删除yy3.cc文件提示权限不足,删除yy4.cc文件正常可以删除

 image

你可能感兴趣的:(Linux 20150830学习整理 VIM、FIND、bash环境、特殊权限)