bash特性
十二、bash变量

变量:一段有名称的连续的内存空间;这段内存空间的名称,称为变量名,在这段内存空间中存储数据,则称为变量值;


向内存空间(变量)中存储数据的过程,称为赋值操作;赋值的符号通常为  =  。
变量的类型:
eg:123   整型:  01111011
          字符型:ACCII  3字节
          字符型:UTF-8  9字节


  变量:
      强变量:使用之前必须事先予以声明;必须声明变量类型;(java,C)
      弱变量:使用之前无需声明,无需指明变量类型;(bash变量)



变量的赋值方法:
  VARNAME(变量名)=VALUE(数值)
  其含义为将某数值(VALUE)通过赋值操作(=)存储于特定的内存空间中(VARNAME)

  bash中变量名称的命名规范:
   1.变量名只能以“-”或“字母”为起始字符,后面的其他字符可以是任意字母数字或下划线;
   2.变量名中的字母是大小写敏感的;
   3.命名的书写格式;
      全大写  HISTSIZE
      全小写  myvar
      驼峰式  MyNewVariable
      连接式  My-New-Var
   4.变量名最好能做到见名知意
   5.变量名不能与已知变量或bash的内置变量重复;


bash中的变量的分类:
    根据变量的作用范围来划分:
     全局变量(环境变量):作用范围为整个shell进程,包括其子shell;
     本地变量:作用范围为当前登录时所打开的shell进程,不包括其子shell;
     局部变量:作用范围仅仅只是当前程序段,一般用于函数;
    根据变量的声明方式:
     bash内置变量:
       普通的内置变量:HISTSIZE,...
       位置参数变量:$0,$1,...
       特殊变量:$?(展开为最近一次执行的命令的状态返回值/退出状态码,用于表示最近一次执行的命令是否成功),
                 $#(不包括$0在内的其余的位置参数的个数,通常以十进制数字来表示),
                 $*(从$1开始展开为位置参数,当使用双引号引用展开的结果时,他展开为特殊变量 IFS文件分隔符 的第一个字符分隔的值),
                 $$(展开为当前shell的进程标识符),
                 $@(从$1开始展开为位置参数,当使用双引号引用展开的结果时,他展开为一个单独的字符串),
                 ...
     用户的自定义变量:
       1.变量的声明和赋值:
         1)声明全局变量(环境变量)
           export VARNAME
           export VARNAME=VALUE


           declare命令
           Set variable values and attributes   格式:declare [-aAfFgilrtux] [-p] [name[=value] ...]
           常用选项:
             -a:声明索引数组(如果支持)
             -A:声明关联数组(如果支持)
             -i:声明×××变量
             -l:声明变量并将变量名中的字母转换为小写字母
             -u:声明变量并将变量名中的字母转换为大写字母
             -r:声明只读变量,该变量仅能进行一次赋值操作
             -x:声明变量并将其导出为全局变量;

               declare -x  VARNAME[=VALUE]

          2)声明本地变量
            VARNAME=VALUE

          3)声明局部变量:
           local VARNAME=VALUE

       2.查看环境变量

        set命令
        查看和改变shell属性的值及查看shell变量的变量名和变量值;


        export命令
        查看变量名称,也可以为变量赋值;


      3.查看变量的值
        echo ${VARNAME}


      4.撤销变量的赋值及变量声明

        unset命令
        unset  VARNAME

    有关于保存变量的shell配置文件:
      通用配置文件:
        /etc/bashrc
        /etc/profile
        /etc/profile.d/*


      私人配置文件:
       ~/.bashrc
       ~/.bash-profile



    注意:1.一般情况下,变量都是随用随声明,除非有必要,否则不建议修改配置文件的内容;
          2.声明的变量在使用完之后,最好使用unset命令予以撤销;

 


  用户和组的管理
      用户账户
      组账户
      权限分配


      cisco开发并建立了AAA认证体系:
        Authentication:认证,核实使用者身份;
        Authorization:授权,对于已经核实身份的使用者进行资源分配;
        Accounting:审计,监管资源被使用的情况;

    多任务,多用户操作系统;


    能够实现资源使用和完成任务的主体是:应用程序进程


    安全上下文: Secure Context

    进程是以其发起者的身份运行的;可以理解为,进程的所有者就是其发起者;每个进程上都会标记上其所有者的身份信息;


    当进程试图访问资源的时候,安全上下文会比对进程的所有者和资源的所有者之间的关系;
      首先,查看进程的所有者是否和资源的所有者为同一用户,如果是,就按照所有者拥有的权限来使用资源;
            如果不是,则判断进程的所有者是否属于该资源所属组的成员,如果是,按照所属组的权限来使用资源;
            如果不是,就按照最为普通的其他用户的权限来使用资源;


    用户账户:实现操作者和计算机交互式操作的基础,是操作者的身份在满足了验证条件之后的计算机系统中的映射;



  用户账户分类:
    超级用户(管理员):root
    普通用户:
          系统用户(非登录用户):为了保证系统安全,往往会让某些进程或服务必须以非管理员的用户身份运行;这类非管理员用户,成为系统用户,此类用户一般不允许登陆到系统;
          登录用户:能够通过登陆行为来验证用户身份进而获得资源访问权限并可以对资源进行操作的用户,可以称为登陆用户;


  用户账户的标识方式:
    用户登陆名称:为操作者提供的简单易记的字符串标识;
    用户的数字ID(UID):为计算机操作系统提供的标准的数字标识符号;0~2^32-1


  超级用户:
     用户名:root
     UID: 0

  普通用户:
   系统用户:
    centos6及之前的版本: 1~499
    centos7及以后的版本: 1~999
   登录用户:
    centos6及之前的版本: 500+
    centos7及以后的版本: 1000+
    注意:60000+的UID通常需要用户自定义标识


  名称解析:
   用户名<-->UID

   用户名解析库:/etc/passwd
     操作系统中的认证组件通过解析库实现认证机制,即验证登录用户是否为已经存在的用户;

   用户的认证库:/etc/shadow
     通过此前的解析库认定用户是存在的,在经过认证库的认证来证明登录用户就是其声明的用户;

     默认的认证机制:密码认证;

     密码复杂性要求:
       1.尽量避免使用有规律的或者来源于字典中的字符串作为密码;
       2.密码要足够长,一般不得少于6个字符;
       3.密码要足够复杂,其中应该至少包括大写字母、小写字母、数字及其他符号中的三类
       4.密码要不定期更换;


      在linux中,保存到认证库的密码是经过单向加密算法处理过的;
       能够加密密码的算法有两类:
        MD:MD5  message digest  version 5,信息摘要算法第五版
           128位定长输出
        SHA:
          secure hash algorithm,安全的哈希算法;
          SHA1:160位加密输出
          SHA224:
          SHA256:33
          SHA384:
          SHA512:默认的加密算法;


          salt:通过随机算法计算得到的随机数,

          随机数生成装置: /dev/random:仅仅从熵池中返回随机数;如果熵池中随机数耗尽,进程会被阻塞
                           /dev/urandom:首先试图从熵池中返回随机数,如果熵池中随机数耗尽,则用伪随机数生成器生成伪随机数;

      在认证库中密码的最终形态: 算法 + salt + 加密字符串
        算法:$1~$6
        salt:$随机字符串
        加密字符串:$单项加密结果


组账户:将具有某些相同或相似属性的用户联系在一起以便可以集中授权的容器;
组的分类:
 超级用户组
 普通用户组
  系统用户组
  登录用户组


组账户的标识方法:
 组账户名称:
 组账户ID(GID):
   超级用户组:0
   系统用户组:
     centos6以前:1~499
     centos7以后:1~999
    登录用户组:
     centos6以前:500+
     centos7以后:1000+


  组名解析:
   解析库:/etc/group
   认证库:/etc/gshadow


用户帐户和组账户之间的关系:
 在linux中,每个用户必须至少属于一个组;
 用户账户的GID标识被称为用户的主要组(基本组),primary group;每个用户必须要有主要组,而且只能有一个;


 在主要组的基础上,用户可以与其他的组账户存在逻辑关系,此类组称为用户的附加组(附属组,额外组),addtion group;对于用户来说此类组可以没有,也可以有多个;



用户和组的管理命令:
  组账户的管理命令:
    groupadd、groupdel、groupmod、
  用户账户的管理命令:
    useradd、userdel、usermod
  与认证相关的命令:
    passwd、gpasswd
  其他的相关命令:
    chage、chsh、finger、su、id

与用户和组相关的命令:
  1.groupadd
   创建一个新组
   格式:groupadd  [选项]   组名
   常用选项:
   -g GID:指定要创建的组的GID
   -r:将组创建为系统组,此时应该保证GID在系统组范围内;


   2.groupdel
   删除一个组
   格式:groupdel  [选项]   组名
   注意:如果某个组是某个用户的主要组,则该组不能删除;



   3.groepmod
   modify a group definition on the system
   格式:groupmod  [选项]   组名
   常用选项:
    -g GID:修改指定组的GID
    -n GROUP-NAME:修改指定组的组账户名称


   4.useradd
   创建一个新用户或更新默认新用户信息
   格式:useradd [选项] 登录名
         useradd -D [选项]
    常用选项:
     -c:为用户添加注释信息;
     -d:为用户指定家目录的路径;此目录不能事先存在;
     -e EXPIRE_DATE:用户密码的过期绝对时间,如:2018/01/01
     -f:为用户指定密码使用达到最大时间之后的宽限期;
     -g GROUP:为用户指明GID,如果不写此选项,系统会创建一个与用户名相同的组并且将之设置为此用户的主要组
     -G   GROUP1....:为用户添加附加组
     -m:必须为用户创建家目录
     -M:不为用户创建家目录
     -s SHELL:创建用户是为用户指定默认的shelll;
     -u  UID:为用户指定UID


     5.userdel
     删除用户账户和相关文件
     格式: userdel [选项]  username
      常用选项:
     -r:删除用户的同时,删除用户的家目录及用户邮箱文件;



     6.usermod
     修改一个用户账户
     格式:usermod [选项] username
     常用选项:
     -c:修改用户的注释信息;
     -d:修改用户的家目录;
     -e  expire-date:修改用户密码过期的绝对日期;
     -f:修改用户密码过期后的宽限期;
     -g:修改用户的主要组(GID)
     -G:修改用户的附加组为此列表中的组,如果同时使用了 -a 则保留原有的附加组,将此列表中的组追加值用户的附加组列表;
     -l:修改用户的登陆名;
     -s:修改用户的登陆SHELL;
     -u:修改用户的UID;
     -L:锁定用户
     -U:解锁被 usermod -L锁定的用户



     7.passwd
     update user's authentication tokens
     格式: passwd  [-k]  [-l]  [-u  [-f]]  [-d]  [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin]
       [username]
       常用选项:
       -l:锁定用户
       -u:解锁用户
       --stdin:通过标准输入接收密码,可以用于管道;
       -d:删除用户的密码,也可以用于解除用户锁定;
       -e:直接设置用户密码过期;
       -n  DAYS:用户密码的最短使用时间;默认为0
       -x  DAYS:用户密码的最长使用时间;默认为99999
       -w  DAYS:修改密码过期前多少天发送警告;
       -i  DAYS:修改用户密码过期之后的宽限期;
       -S:查看用户密码的状态信息;


     
     8.chage
     更改用户密码过期信息
     格式: chage[选项]  username
     -d:更改密码最后期限
     -E:设置密码使用期限
     -I:修改密码过期后的宽限期
     -l:
     -M:
     -m:密码使用的最小期限
     -W:密码到期前几天警告用户



     9.chsh
     修改用户登录shell





     10.finger
     用户信息的查看程序



     11.id
     查看用户ID信息
     -u:显示用户有效UID
     -g:显示用户有效GID
     -n:显示名称



     12.su

     -l:以这个用户身份登陆到系统
     -c   [USERNAME]  “COMMAND”:以前面指定的用户身份运行此命令;而不进行登陆切换;