linux,shell学习(一)

1.1 什么是shell
shell是核心程序(kernel)之外的指令解析器,是一个程序同时一中命令语言和程序设计语言。
shell的类型:ash,bash,sh,ksh,csh,tcsh
    -/etc/shells
    -echo $SHELL
程序在shell中运行
shell中可以运行子shell
    #!/bin/bash
    echo "hello word"
    chmod +x xx.txt
    ./xx.txt
1.2存取权限与安全
    文件和目录的权限(-rwrr--r--)
    setuid(suid/guid)(chmod u+s,g+s file)
    chown 和 chgrp (chown user file/chgrp group file)
    unmask(unmask nnn)
    符号链接(ln [-s] source_path target_path)

    ls -lh 查看各个文件占用的空间大小   
    chmod [who] operator [permission] filename
    who(u,g,o,a) u:用户, g:全部用户, o:其他用户,a:全部
    operator(+,-,=) +:增加 - :减少 = :设定某个权限
    permission(r,w,x,s,t)
    r:可读,w:可写,可更改,x:执行
    s或S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。
    T或T(Sticky):/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。
    [hadoop@localhost ~]$ ls -lh
    总用量 32K
    drwxr-xr-x. 2 hadoop hadoop 4.0K 4月   7 01:08 公共的
    第一列:第一个字符表示文件的类型:目录或者文件,连接等
        第2,3,4位表示:当前用户对此文件的权限:读,写,执行
        第5,6,7位表示:所属组的权限:执行,读
        最后三位表示:其他用户对此文件用户的权限
   第二列:文件硬链接数或目录子目录数
    如果一个文件不是目录那么这一字段表示,这个文件所具有的硬链接数,即这个文件总共有多少个文件名.查看第一个文件:
    -rw-r--r-- 1 root root 1581 11月 24 18:14 anaconda-ks.cfg
    第2字段的值为1,说明这个文件只有anaconda-ks.cfg这一个文件名.即只有一个指向该链接的硬链接.
    如果我用ln,做一个指向该文件的硬链接再查看该文件,该文件的第2字段就会变成2:
   
[root@localhost ~]# ln anaconda-ks.cfg anaconda-ks.cfg.hardlink 
    [root@localhost ~]# ls -l 
    总用量 4071 
    -rw-r--r-- 2 root root 1581 11月 24 18:14 anaconda-ks.cfg 
    -rw-r--r-- 2 root root 1581 11月 24 18:14 anaconda-ks.cfg.hardlink

    此时,anaconda-ks.cfg 和anaconda-ks.cfg.hardlink 称为互为硬链接.他们指向同一个文件,无论是修改哪一个文件,另一个里也做相应的变化,因为实际上他们指向同一个文件.
用ls -i anaconda-ks.cfg可以查看它的文件节点(inode)
互为硬链接的文件具有相同的文件节点. 以下是验证实验:
   
[root@localhost ~]# ls -i anaconda-ks.cfg 
    18102 anaconda-ks.cfg 
    [root@localhost ~]# ls -i anaconda-ks.cfg.hardlink 
    18102 anaconda-ks.cfg.hardlink

    可以看到,这两个文件具有相同的文件节点号:18102
    如果你知道一个文件有多个文件名,如何查找他的其他文件名分布在什么地方呢?
    可以先用ls -i 获得它的节点号,然后用find查找,       如/etc/sysconfig/networking/devices/ifcfg-eth0就具有多个文件名,我要查找与它互为硬链接的文件:
   
[root@localhost ~]# ls -i /etc/sysconfig/networking/devices/ifcfg-eth0 
    147181 /etc/sysconfig/networking/devices/ifcfg-eth0

    得到它的节点号为 147181
    再用find查找:
    [root@localhost ~]# find /etc -inum 147181 
    /etc/sysconfig/networking/devices/ifcfg-eth0 
    /etc/sysconfig/networking/profiles/default/ifcfg-eth0

     这样就得到了同一个文件的不同文件名的位置.
    *************************************
    如果是一个目录,第2字段的含义:
    **************************************
    如果是一个目录,则第2字段表示该目录所含子目录的个数.
    新建一个空目录,这个目录的第二字段就是2,表示该目录下有两个子目录.为什么新建的目录下面会有两个子目录呢?
    因为每一个目录都有一个指向它本身的子目录"." 和指向它上级目录的子目录"..",这两个默认子目录是隐藏的.用ls -a可以看到.
   每次在目录下新建一个子目录,该目录第2字段的值就增1,但是新建一个普通文件该字段值不增加.
--------------------------------------------------------
    第三列:文件的拥有者
    第四列: 文件拥有者所在的组
    第五列:文件文件大小(以字节为单位)
    第六列:文件创建月份
    第七列: 文件创建日期
    第八列: 文件创建时间

        文件创建的时间可以通过touch命令来修改.如:
        #touch testfile
        可以把testfile的创建时间修改为当前时间.
        touch的详细用法请看链接文档:
        #man touch
        另外,一个文件还有最后访问时间,最后修改时间等属性.
        这些属性可以用ls 的其它参数显示出来.
    第九列:文件名
        如果是一个符号链接,那么会有一个 "->" 箭头符号,后面根一个它指向的文件名.
    如果想改变一个文件的权限,必须是root用户或者文件的拥有者
    chown [-cfhvR] [--help] [--version] user[:group] file...
    user : 新的档案拥有者的使用者 ID
  group : 新的档案拥有者的使用者群体(group)
   -c : 若该档案拥有者确实已经更改,才显示其更改动作
  -f : 若该档案拥有者无法被更改也不要显示错误讯息
  -h : 只对于连结(link)进行变更,而非该 link 真正指向的档案
  -v : 显示拥有者变更的详细资料
  -R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)
  --help : 显示辅助说明
  --version : 显示版本
   chown 和 chgrp (chown user file/chgrp group file)
   改变文件所属的用户或者组
   chown [-R] owner filename
   chown ower.group filename
   chown .group filename
   chgrp [-R]  group filename
   umask
   umask的值共有4位,分别代表:gid/uid,属主,组权,其它用户权限。一般用的是后3位。
   umask设置的是权限“补码”:如上umask值为022,则对应目录权限为7-0=7,7-2=5,7-2=5,即用777减去umask的相应位上的值;而对应的文件权限是用666减去umask的相应位上的值
   修改umask的值
       输入:umask 024,则可直接修改以后新建的目录和文件的默认权限为:553,642。
       //在文件 /etc/profile里可以设置umask值
   符号链接
      硬链接
      软连接
      ln [-s] source_path target_path
   1.Linux链接概念
      Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic     Link)。默认情况下,ln命令产生硬链接。
  【硬连接】
       硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
  【软连接】
       另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
   2.通过实验加深理解
     
      [root@localhost ~]$ touch f1          #创建一个测试文件f1
      [root@localhost ~]$ ln f1 f2          #创建f1的一个硬连接文件f2
      [root@localhost ~]$ ln -s f1 f3       #创建f1的一个符号连接文件f3
      [root@localhost ~]$ ls -li            # -i参数显示文件的inode节点信息
      total 0
      9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f1
      9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f2
      9797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1
      

      从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。
     
      [root@localhost ~]$ echo "I am f1 file" >>f1
      [root@localhost ~]$ cat f1
      I am f1 file
      [root@localhost ~]$ cat f2
      I am f1 file
      [root@localhost ~]$ cat f3
      I am f1 file
      [root@localhost ~]$ rm -f f1
      [root@localhost ~]$ cat f2
      I am f1 file
      [root@localhost ~]$ cat f3
      cat: f3: No such file or directory
      

      通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效
   3.总结
       可以做一些相关的测试,可以得到以下全部结论:
       1).删除符号连接f3,对f1,f2无影响;
       2).删除硬连接f2,对f1,f3也无影响;
       3).删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
       4).同时删除原文件f1,硬连接f2,整个文件会真正的被删除。
    别名的使用
        Linux 提供的命令别名功能很有用.比如我经常使用ll | more 命令,而不是直接使用ll.但又不想敲那么多的字符.那么,可以给ll | more设置别名:
       
[root@localhost ~]# alias lm='ll | more' 

        试试命令lm,它的效果跟ll | more一样! 再比如DOS下的清屏命令是cls,而Linux下是clear.如果在Linux下也想使用cls,可以给它设置一个别名:
       
[root@localhost ~]# alias cls='clear' 

        直接输入alias,可以查看当前设置的命令别名:
       
[root@localhost ~]# alias
        alias cls='clear'
        alias cp='cp -i'
        alias l.='ls -d .* --color=tty'
        alias ll='ls -l --color=tty'
        alias lm='ll | more'
        alias ls='ls --color=tty'
        alias mv='mv -i'
        alias rm='rm -i'
        alias vi='vim'
        alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --    show-tilde' 

        如果想取消命令别名,使用unalias即可
       
[root@localhost ~]# unalias cls
        [root@localhost ~]# unalias lm
        [root@localhost ~]# alias
        alias cp='cp -i'
        alias l.='ls -d .* --color=tty'
        alias ll='ls -l --color=tty'
        alias ls='ls --color=tty'
        alias mv='mv -i'
        alias rm='rm -i'
        alias vi='vim'
        alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

    命令替换
        myfile的内容两个文件名:pram findfile
        ls `cat myfile` -al
    后台运行
         在后台执行程序
         nohup /root/start.sh &
         使用 jobs 查看任务 jobs -l
    管道
         cat xx.txt | more
    模式匹配
         ls *.txt -l
    特殊字符
         双引号:用来使shell无法认出空格,制表符和其他大多数的特殊字符。
         单引号:用来使shell无法认出所有特殊字符。
         反引号(`):用来替换命令。
         反斜杠:用于去除一个单个字符的特殊意义,它保留了跟随在之后的字符的字面值。
         分号:用于在同一行上放多个命令。
         &:命令后台执行。
         括号():创建成组的命令。
         竖杠(|):管道标示符。
         < >&:表示重定向。
         * ? [ ] !:表示模式匹配。
         #:表示注释(除第一行外)。
         空格,制表符,换行符:当做空白。

你可能感兴趣的:(linux,shell,学习)