bash特性续写以及用户和组的管理

简介:

                    bash 特性之变量

  程序=指令+数据

  数据:文件  变量

  变量:一段连续的内存空间cell=8bit  (32bit字长支持4GB内存)为这一段内存空间取名 称之为变量名:在这段内存空间中所存储的数据称为变量值

  赋值操作:

= 赋值操作符

  赋值方法 变量=变量值(VARNAME=VALUE)

变量的命名规范

   1 只能以字母或者下划线为首字符 不能使用数字 后面可以是任意字母 数字 下划线

   2 大小写严格区分

   3 见名知意

   4 书写规范  

1)全大写:FILES

2)驼峰式:MyFiles

          5 不能与已知变量名相同

根据不同的编程语言 变量可以分为两类

      强变量:必须在使用前声明 而且要声明变量的类型 严格区分变量的类型

           255  字符类型:38bytes

                整数型:1byte

                null:

      弱变量:可以随时使用随时声明 甚至可以不声明即使用 另外不对变量类型做硬性要求 如果没有指明变量类型 统一按照字符型对待

      bash的变量即为弱变量:


引用变量的值 :${变量名}=$变量名   也称为变量替换 

   bash的变量种类:

         全局变量(环境变量):作用范围为整个shell进程 包括其子shell

         本地变量:作用范围仅仅只是当前登录的shell 不包括子shell

       局部变量:作用范围仅仅只是当前的程序段 一般用于函数

       默认全局变量:

              位置参数变量:$1 $2 $3 $4……$n

              特殊变量  $? $# $@ $* $$……

  $? 表示 展开为最近一次所执行的命令状态返回值(退出状态)

  $# 表示 位置参数的个数 以十进制表示

  $* 表示 从一开始展开为位置参数 当使用双引号引用展开的时候 它展开为以特殊变量“IFS”的第一个字符分隔的值 

  $@ 表示 从一开始展开为位置参数 当使用双引号引用展开的时候 它展开为一个单独的字符串

  $$ 表示 展开为当前shell的进程的标识符

  $0 表示 展开为当前shell或者shell脚本的文件名

变量的使用

   变量的赋值:变量=标量名  声明本地变量

   撤销变量:~]# unset 变量名

声明环境变量 

   export 变量

   export 变量=变量名

declare

   -a声明索引数组(如果支持)

   -A声明关联数组(如果支持)

   -i声明整型变量

   -l声明变量并将变量值中的字符转换为小写字母

   -u声明变量并将变量值中的字符转换为大写字母

   -x声明变量并将其导出为环境变量

   -r声明变量为只读变量(常量)

查看环境变量

   set

   export

   env

声明局部变量

   local 变量=变量名

配置文件:

  通用配置文件 /etc/bashrc   /etc/profile

  私人配置文件~/.bashrc    ~/.bash_profile

注意  一般情况下 声明变量都是现做现用 因此我们并不需要改配置文件



                    用户和组的管理


  用户账户

  组账户

  权限的分配


  Cisco 思科公司开发的AAA认证体系

Authentication 认证 核实身份是否正确

Authorization 授权 对已经核实身份的用户进行资源分配

Accounting 审计 监管资源被使用的情况


多用户、多任务的系统

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

安全上下文:secure context

进程是以其发起者的身份运行的 可以理解为进程的所有者就是发起者 会将发起者的信息标记在进程上


当进程试图去访问资源的时候 安全上下文会比对进程的所有者和资源所有者的关系

首先查看进程的所有者是不是资源的所有者 如果是 就按照属主的权限使用资源

如果不是 则判断进程的所有者是否属于资源所属组 如果是 按照属组的权限使用资源

如果不是 则直接使用资源的其他人访问权限来使用资源


用户账户: 就是计算机操作者在操作过程中的身份映射 在满足了认证条件之后的身份映射


1.用户分类

超级用户 (管理员)root

普通用户

    系统用户:   为了保证安全 必须让那些运行在后台的进程或者服务类以非管理员的身份运行 这类用户一般不需要登录到系统

    登录用户:   能够正常使用整个系统资源的用户

用户的标识 

用户的登录名称:  为操作者准备的简单易记的字符串标识

用户的ID (UID):  为计算机系统准备的数字标识

   超级用户的ID号码为: 0

   系统用户:

       centos5、6:1-499

       centos7: 1-999

  登录用户 :

       centos5、6: 500 -60000

       centos7 : 1000-60000

    60000以上的标识符为用户自定义标识       

名称解析:

    把名字解析成UID


解析库:/etc/passwd

系统利用解析库完成认证机制 验证登录用户是否是你声称的那个人

用户的认证信息库:/etc/shadow

组的认证信息库:/etc/group


采用密码认证的机制:

    设置密码的一般性策略

       1.尽量使用随机字串作为密码

       2.密码长度一般不要少于八个字符

       3.密码中至少包括大写字母、小写字母、数字、标点符号四类中的三类

       4.不定期更换密码 

在Linux中 保存中认证库中的密码信息是经过加密保存的

    hash单项加密算法:抽取原始数据的特征信息,数据指纹

    单项加密算法的特征:

1.只要数据相同 其加密结果就必然相同

       2.无论数据多大 其加密结果定长输出

       3.雪崩效应 

       4.不可逆

  单项加密常用的算法:

    1.md5:Message Digest 消息摘要  128bit的定长输出

    2.sha1:Secure Hash Algorithm 安全的哈希算法 160bit 定长输出

    3.sha224

    4.sha256

    5.sha384

    6.sha512


salt:随机数

    /dev/random: 仅仅只是从熵池中返回随机数 如果熵池随机数耗尽 则进程被阻塞

   /dev/urandom: 试图先从熵池中返回随机数 如果熵池耗尽 则利用伪随机数生成器生产伪随机数


最终认证的字符串:算法+salt+密码

  在认证库中存放的信息:$6$salt$crytped_password


用户组:

将具有某些相同或者相似属性的用户联系在一起以便集中授权的容器

   组类别;

       管理员组:

       普通用户组:

           系统组:

           登录组:

      组的标识方法:

           组名:方便操作者使用的

       组的ID(GID):为系统提供组标识

          管理员组:0

           系统组:

           centos5、6: 1-499

           centos7 : 1-999

       登录组:

           centos5、6: 500 -60000

           centos7 : 1000-60000

          解析库:/etc/group

组也需要认证,组也有认证库:/etc/gpasswd

组也需要密码保护

   如果组没有设置密码保护的话 则不能随时加入

以用户为核心来对组进行分类:

   用户的主要组(基本组):primary group 

对用户来说 这样的组必须要有而且只能有一个

用户的附加组(附属组、额外组):Addition Group 

这样的组对于用户来说 可以没有 也可以有多个

根据组所容纳的用户来分:

   私有组:组名与用户登录名相同 并且组中只有此用户

   公共组:组中可以包含其他多个不同用户

注意:默认情况下 用户的主要组都是其私有组


用户和组的管理:

   主要使用命令完成:

     组管理相关的命令:

groupadd、groupdel、groupmod

     用户管理相关的命令:

        useradd、userdel、usermod

     认证管理相关的命令:

        passwd、gpasswd、chage

其他的相关管理命令:

        chsh、finger、su、id


name:password:UID:GID:GECOS:directory:shell

name:登录名

password:密码字段 现在在使用了shadow机制的系统中 通常使用“X”作为占字符

UID:用户ID

GID:此用户主要组的ID

GECOS:comment 注释类的信息 现在一般都会用来存放用户的说明信息或全名

directory:用户的家目录的绝对路径

shell:用户的默认登录shell的绝对路径

/etc/group:


group_name:password:GID:user_list

group_name:组名

password:组密码占位符 默认为空

GID:组的ID

user_list:以该组的附加组的用户的列表


/etc/shadow:

login name:用户的登录名

encrypted password:加密了的密码

   格式:$算法$salt$真正意义的加密密码

如果该位置为!则表明用户的密码被禁止

如果该位置为*则表明该用户为系统用户 不能登录

如果该字段为空 则用户可以不输入密码即可登录系统 不推荐使用

date of last password change:

  相对概念 表示从1970年1月1日开始的天数 到最后一次更改密码的时间

minimum password age:

  在多长时间内无法修改密码 默认值为0 意思即为:随时修改密码  如果是非0的其他数字 意思是在这么长的天数里不能改密码

maximum password age:

  在多长时间后密码过期 默认为99999 意思是永久有效

password warning period:

  密码过期之前的友善提醒天数 默认值是七天

password inactivity period:

  密码过期后的宽限期 默认为-1 意思是永久宽限

account expiration date:

  一个用户账户密码过期的日期 这是一个绝对的过期期限 

reserved field

  保留字段 以备以后使用


/etc/gpasswd:

group name:encrypted password:administrators:members


组管理命令:

  groupadd:新建组账户、添加组

    -g gid  在创建组账户的时候 指定组账户的GID 如果不使用该选项指定 系统会选择在组解析文件中出现在的不大于60000最大GID加1

    -r  创建系统组 意思是创建一个GID在1-999(1-499)之间的组

 groupmod:修改组的一些相关属性信息

     groupmod[选项]GROUP

   -g gid:修改组账户的ID

   -n NEW_GROUPNAME:修改组名

 groupdel:删除组账户

   groupdel[选项]GROUPNAME

   注意:如果某个组是某个用户的主要组或者私有组 则该组无法删除


用户管理的命令

   useradd:创建用户账户

   useradd [选项] 登录名

  /etc/default/useradd

  /etc/login.defs

  /etc/skel

以上三个文件和目录能够帮助管理员在未指定任何选项时 也能创建用户 并为用户赋予默认的属性

  -c, --comment ‘COMMENT’: 在创建用户时为用户添加注释信息 一般为全名

  -d –home /PATH/TO/HOME _DIR : 在创建用户的时候为用户指定家目录的绝对路径 被指定的目录应该是事先不存在的目录

  -g, --gid GROUPNAME:在创建用户时 为用户指定组

  -G, --groupsGROUP1[,GROUP2,...[,GROUPN]]: 在创建用户时为用户添加附加组

  -m, --create-home  在创建目录时强制性为用户创建家目录

  -M  在创建用户时不创建用户家目录 即使在/etc/login.defs中CREATE_HOME的值为yes也不创建

  -r –system 创建系统用户

  -u, --uid UID  在创建用户的时候为用户指定UID 这个UID可以超过60000的限制

  -s, --shell /PATH/TO/SHELL  在创建用户的时候 为用户指定默认shell 使用绝对路径

  -D  --defaults  显示或修改用户默认属性值

  -s, --shell /PATH/TO/SHELL 修改/etc/default/useradd文件中SHELL的默认值


usermod:修改用户账户信息

   usermod [选项] 登录名

   -c, --comment ‘COMMENT’ 修改用户的注释信息

-g, --gidGROUPNAME  修改用户的主要组

-G, --groupsGROUP1[,GROUP2,...[,GROUPN]]]  修改用户的附加组为列表中的组

-a, --append 与-G选项同时使用 给用户添加新的附加组

-d, --home /PATH/TO/HOME_DIR 修改用户的家目录

-m, --move-home  与-d选项同时使用意味着将旧的家目录中的数据移动到新家之中

-l, --login NEW_LOGIN 更改用户账户的登录名

-s, --shell/PATH/TO/SHELL 修改用户账户的登录shell

-u, --uid UID  修改用户的UID

-L, --lock  锁定用户的密码

-U, --unlock 解锁用户的密码


userdel 删除用户账户

  userdel [选项] 登录名

   -r 删除用户的同时 清除用户的家目录


用户认证相关的命令

passwd  设置或者查看用户密码信息的命令

passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

1.如果省略用户名 意味着更改当前登录用户密码

2.如果指定用户名 更改指定用户密码 只能root使用

选项:

  -l, --lock  锁定用户的密码

  -u, --unlock  解锁用户的密码

     相比较usermod –L|-U 而言 其优先级更高

     如果使用usermod –L锁定的用户密码 可以使用passwd –u解锁

     而是用passwd –l锁定的用户密码 无法使用usermod –U解锁

  -d,-–delete  删除用户密码 将/etc/shadow文件中第二字段清空

  -S, --status  查看用户的密码状态

  --stdin  借助于管道将输入数据流当做标准输入信息送给passwd命令

    echo“PASSWORD”|passwd—stdin USERNAME

组认证相关的命令

gpasswd

gpasswd [选项] groupname

-a, --adduser  向名为 group 的组中添加用户 user。

   -d, --deleteuser  从名为 group 的组中移除用户 user。


其他命令

   su switch user 切换用户身份

     su USERNAME 部分切换 半切换  在切换用户的时候不会重新读取用户的配置文件 因此 用户并没有登录行为 所以 工作环境不初始化

     su-USERNAME 完全切换 在切换用户的时候 重新读取目标用户的配置文件并且初始化工作环境  相当于su –l USERNAME

     -c“COMMAND”并不切换用户身份 而是以目标用户的身份执行某命令

使用su命令的时候 从root切换到其他普通用户 无需密码 但普通登录用户进行切换时 必须给出目标用户的密码

 进行用户切换之后 不要连续切换 而是用exit命令返回之前的用户

newgrp GOUPNAME 临时更改当前登录用户的主要组 使用exit返回之前的状态

id  显示真实的和有效的用户和组的ID

  真实ID 在/etc/passwd定义的用户的UID和GID

  有效的ID  当前生效的用户的UID和GID

id [OPTION]... [USER]

  -g 只显示用户的有效GID

  -n 只显示用户的有效UID

  -G 显示用户所有组的ID

  -n 以名称代替ID来显示



本文转自 Runs_ 51CTO博客,原文链接:http://blog.51cto.com/12667170/1911416,如需转载请自行联系原作者

相关文章
|
4月前
|
Linux Shell Windows
4:Bash shell命令-步入Linux的现代方法
4:Bash shell命令-步入Linux的现代方法
53 0
|
6月前
|
关系型数据库 MySQL Shell
【Linux命令】-bash: mysql: command not found
【Linux命令】-bash: mysql: command not found
56 0
|
8月前
|
Ubuntu 安全 Linux
不用安装虚拟机,直接在Windows上面运行Linux Bash Shell,嗯!真香!!!
不用安装虚拟机,直接在Windows上面运行Linux Bash Shell,嗯!真香!!!
152 0
|
13天前
|
存储 Shell Linux
【攻防世界】unseping (反序列化与Linux bash shell)
【攻防世界】unseping (反序列化与Linux bash shell)
|
2月前
|
Linux Shell
mac/linux提示bash: telnet: command not found
mac/linux提示bash: telnet: command not found
|
9月前
|
Kubernetes Shell Linux
linux中sh/bash 进程为何不接受kill SIGTERM
在k8s的优雅终止中,如果容器的入口进程是sh 或者bash,需要注意你设定的gracefulterminate是无效的
105 0
|
10月前
|
Java Shell Linux
如何在 Linux 中使用 Bash For 循环
如何在 Linux 中使用 Bash For 循环
90 0
|
10月前
|
Unix Shell Linux
Linux中sh与bash的区别(详细介绍)
Linux中sh与bash的区别(详细介绍)
317 0
|
11月前
|
Shell Linux
Linux pip命令报错 -bash: pip: command not found
Linux pip命令报错 -bash: pip: command not found
254 0
|
Ubuntu Shell Linux
Shell脚本的常用执行方式、bash 和 sh 的关系、子shell、Centos 默认的解析器是 bash、Linux 提供的 Shell 解析器、Shell 概述、Shell 脚本入门
采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)、采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)、在脚本的路径前加上“.”或者 source(了解)原因: 前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则 子 shell 关闭,回到父 shell 中。第三种,也就是使用在脚本路径前加“.”或者 source 的方式,`可以使脚本内容在当前 shell 里执行,而无需打开子 shell!`这也是为什么我们每次要修改完
568 1
Shell脚本的常用执行方式、bash 和 sh 的关系、子shell、Centos 默认的解析器是 bash、Linux 提供的 Shell 解析器、Shell 概述、Shell 脚本入门