Bash特性之变量:
程序 = 指令 + 数据
数据:文件,变量
变量:一段连续的内存空间,cell - - 8bit,为这一段内存空间取名,称为变量名,在这段内存空间中所存储的数据,称为变量值。
赋值操作:
=:赋值操作符
赋值方法:VARNAME=VALUE(中间不能加空格)
VARNAME的命名规范:
1. 只能以字母或‘_’为首字符,不能使用数字,后面可以是任意字符,(首字符只能字符或者下划线)
2. 大小写严格区分
3. 见名如意
4. 书写规范:
(1.)全大写:FILES
(2.)驼峰式:MyFiles(不能全小写,因为可能会和文件名冲突)
5. 不能与已知变量名相同
根据不同的编程语言,变量可以分为两类:
强变量:必须在使用前先声明,而且要声明其类型,严格区分变量类型:
字符类型:38ytes
整数型:18yte 11111111
Null(空型):
弱变量:可以随时使用随时声明,甚至可以不声明即使用,不对变量类型做硬性要求,如果没有指明变量类型,,统一按照字符型对待。
Bash的变量即为弱变量:
引用变量的值(也称为变量替换):$(VARNAME)= =》 $VARNAME
Bash的变量种类:
(1.):全局变量(环境变量):作用范围是整个shell进程,包括其子shell
(2.):本地变量:作用范围仅仅只是当前登录的shell,不包含子shell
(3.):局部变量:作用范围仅仅只是当前的程序段,一般用于函数
(4.):默认全局变量:
位置参数变量:$1,$2,$3......
特殊变量:$?,$#,$@,$$,$*....
$?:展开最近一次所执行的命令的状态返回值(退出状态)
$#:位置参数的个数,以十进制表示
$*:从1开始展开为位置参数,当使用双引号引用展开的时候,展开为以特殊变量“IFS(分隔符)”的第一个字符分隔的值(默认的分隔字符为空白字符)
*:可以理解成从1到N的通配符
$@:从1开始展开为位置参数,当使用双引号引用展开的时候,展开为单独的字符串。
$$:展开为当前shell的进程标识符
$0:展开为shell或者脚本的文件名
变量的使用:
变量的赋值:VARNAME(变量名)=VALUE(值):声明本地变量
例如:ABC(变量名)=‘1+2’(值)
撤销变量:~]# unsat VARNAME
声明环境变量:export VARNAME
export VARNAME=VALUE
Declare:
-a:声明索引数组(如果支持)
-A:声明关闭数组(如果支持)
-i:声明整型变量
-l:声明变量并将变量值中的字符转换为小写字符
-u:声明变量并将变量值中的字符转换为大写字符
-x:声明变量并将其导出为环境变量
-r:声明变量为设置只读变量(常量)【不能修改,不能撤销,只能关闭当前bash】
查看环境变量的方法:
Set:
Export:
Env:
声明局部变量:
Local VARNAME(变量名)=VALUE(值)
配置文件:
通用配置文件:/etc/bashrc,/etc/profile
私人配置文件:~/.bashrc,~/bash_profile
注意:一般情况下,声明变量都是现做现用,并不需要改配置文件。
用户和组的管理:
1.用户账户
2.组账户
3.权限的分配
Cisco(思科)公司开发的AAA认证体系
Authentiction:认证,核实身份是否正确:
Authorlzation:授权,对已经核实身份的用户进行资源分配
Accounting:审计,监管资源被使用的情况
多用户,多任务的系统:
能够实现资源使用和完成的任务的主体是,应用程序进程
安全上下文:secure context
进程是以其发起者的身份运行的:可以理解为,进程的所有者就是发起者,在进程上会将发起者标记在进程上
当进程试图访问资源的时候,安全上下文会比对进程的所有者和资源的所有者关系,
首先查看进程的所有者是不是资源的所有者,如果是,就按照属主的权限使用资源,如果不是,则判断进程的所有者是否属于资源所属组,如果是,按照属组的权限使用资源
如果不是,则直接使用资源的其他人访问权限来使用资源
用户账户:就是计算机操作者在操作系统中的身份映射,在满足了认证条件之后的身份映射
用户分类:
超级用户(管理员):root
普通用户:
系统用户:为了保证安全,必须让那些运行在后台的进程或者服务类进程以非管理员的身份运行,这类用户一般不需要登录到系统
登录用户:能够正常使用整个系统资源的用户,
用户的标识:
用户的登录名称:为操作者准备的简单易记的字符串标识,
用户的ID(简称叫做UID):为计算机系统准备的数字标识:16bit--->32bit
超级用户:ID号为0
系统用户:
Centos5-6:ID号为1~499
Centos 7:ID号为1~999
登录用户:
Centos5-6:ID号为500~60000
Centos 7:ID号为1000~60000
60000+的标识符为用户自定义标识
名称解析:名字 ----> UID 或者 ID ---> 名字
解析库:/etc/passwd
系统利用解析库完成认证机制,验证登录用户是否是你声称的那个人
认证库:
用户的认证信息库:/etc/shadow
组的认证信息库:/etc/group
采用密码认证的机制:
设置密码的一般性策略:
1.尽量使用随机字串作为密码
2.密码的长度不要少于8个字符
3.密码中尽量包括大写字母,小写字母,数字和标点符号四类字符中的三类
4.不定期更换,每隔一段时间换一次密码(推荐42天内应该更改密码)
在linux中,保存到认证库中的密码信息是经过加密保存的
Hash单向加密算法:抽取原始数据的特征信息,数据指纹:
单向加密算法的特征:
1.只要数据相同,其加密结果必然相同
2.无论数据多大,其加密结果定长输出
3.雪崩效应:
4.不可逆(只可加密,不能解密)
单向加密常用的算法(民用)
1.:md5:Message Digest(消息摘要):128bit位定长输出,
2.:sha1:Secure Hash Alogorithm(安全的哈希算法):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/gshadow
组也需要密码保护:
如果组没有设置密码保护的话,则不能随时加入。
以用户为核心来对组进行分类:
用户的主要组(基本组)Primary Group:对于用户来讲这样的组必要要有而且只能有一个
用户的附属组(额外组,附加组)Addition Group:对于用户来说可以没有也可以有多个
根据组所容纳的用户来分:
私有组:组名与用户登录名相同,并且组中只有此用户
公共组:组中可以包含其他多个不同用户
注意:默认情况下,用户的主要组都是其私有组
用户和组的管理:主要使用命令来完成。
组管理相关的命令:都是由group开头的命名 可是是由Tab键来补全
Groupadd:新建组账户,添加组
Groupadd [-g gid [-o]] [-r] [-f] groupname
-g gid:在创建组账户的时候,指定组账户的GID,如果不使用该选项指定,系统会选择在组解析文件中出现在的不大于60000最大GID加1。
-r:创建系统组,意思就是创建一个GID在1~999(1~499)之间的组
Groupdel:删除组账户
Groupdel [选项] group
注意:如果某个组是某个用户的主要组或私有组,则该组无法被删除
Groupmod:修改组的相关属性信息
Groupmod [选项] group
-g gid:修改组账户的ID
-n NEW_GROUPMOD:修改组名字
用户管理相关的命令:
Useradd:创建用户
useradd [选项] 登录名
/etc/dafault/useradd
/etc/login.defs
/etc/skel
以上三个文件目录能够帮助管理员在未指定任何选项时,也能创建用户,并为用户赋予默认的属性
选项:
-c:--comment“COMMENT”:创建用户时为用户添加注释信息,一般为全名
-d:--home;/PATH/TO/HOME_DIR:在创建用户的时候为用户指定家目录的路径被指定的目录应该是事先不存在的目录
-g:--gidG ROUP:在创建用户时,为用户指定主要组
-G:--groupsGROUP1[,GROUP2,...[,GROUPN]]]:在创建用户时,为用户添加附加组。
-m:--create-home:在创建用户时强制性为用户创建家目录
-M:在创建用户时,不会创建目录的家目录,即使在/etc/login.defs中CREATE_HOME的值为yes也不创建(不能与-m同时使用)
-r:--system:创建系统目录
-u:--uidUID:在创建用户时,为用户指定UID,这个UID可以超过60000的限制
-s:--shellSHELL:在创建用户时,为用户指定默认shell,使用绝对路径
-D:--defaults:显示或修改用户默认属性值
-s:--shell/PATH/TO/SHELL:修改/etc/default/useradd文件中shell的默认值
Userdel:删除用户账户
userdel [选项] 登录名
选项:
-r:删除用户的同时,清楚用户的家目录
Usermod:修改用户账户信息
Usermod [选项] 登录名
选项:
-c:--comment“COMMENT”:修改用户的注释信息
-g:--gidGROUP:修改用户的主要组
-G:--groupsGROUP1[,GROUP2,...[,GROUPN]]]:修改用户的附加组为列表中的组
-a:--append:与-G选项同时使用,给用户添加新的附加组
-d:--home/PATH/TO/HOME_DIR:修改用户的家目录
-m:--move-home:与-d选项同时使用将旧的家目录中的数据移动至新家之中
-l:--loginNEW_LOGIN:更改用户账户的登录名
-s:--shell/PATH/TO/SHELL:修改用户账户的登录shell
-u:--uidUID:修改用户的UID
-L:--lock:锁定用户密码
-U:--unlock:解锁用户密码
认证管理相关的命令:
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 [选项] group
选项:
-a:--adduser:向名为group的组中添加用户user
-d:--deleteuser:从名为group的组中移除用户user
Chage:
-d:
-E:
-m:
-M:
-W:
其他管理相关命令:
Chsh:修改用户默认shell相对于username -s
-s shell
Finger:
Chfn:
Pwck:
Grpck:
Su:swith user:切换用户身份
Su USERNAME:部分切换,半切换,在切换用户的时候,不会重新读取目标用户的配置文件,因此,用户并没有登录行为,所以,工作环境不初始化
Su - USERNAME:登录式切换,完全切换,珍惜爱切换用户的时候,重新读取目标用户的配置文件并且初始化工作环境,相当于su -l USERNAME
-c COMMAND:并不会切换用户身份,而是以目标用户的身份执行某命令
使用su命令的时候,从root切换到其他普通用户,无需密码,但普通登录用户进行切换时,必须给出目标用户的密码
注意:进行用户切换之后,不要连续切换,而是用exit命令返回之前的用户
Newfrp GROUPNAME:临时更改当前登录用户的主要组,使用exit返回之前的状态
Id:显示真实的和有效的用户和组的ID
真实的ID:珍惜爱/etc/passwd/定义用户的UID和GID
有效的ID:当前生效的用户UID和GID
id [OPTION]... [USER]
-g:只显示用户的有效GID
-u:只显示用户的有效UID
-G:显示用户所有组的ID
-n:以名称来代替ID进行显示
两个解析库:/etc/passwd,/etc/group
两个认证库:/etc/shadow,/etc/gshadow
/etc/passwd
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 Date of last password change:minmum password age:maximum password age:password warning period:password inactivity perod:account expiration date:reserved field:
Login name:登录名
Encrypted password:加密了的密码
格式:$算法$salt$真正意义的加密密码
如果该位置为!,则表明用户的密码被禁用
如果该位置为*,则表明该用户为系统用户,不能登录
如果该字段为空,则表明用户可以无需输入密码即可登录系统,不推荐使用
Date of last password change:
相对于1970年1月1日到最后一次修改密码的那天的天数
minmum password age:
在多长时间之内无法修改密码,默认值为0,意即,随时可以修改密码,如果是非0的其他数字,意思是在这么长的天数里不能修改密码
Maximum password age:
在多长时间之后密码过期,默认为99999,意思是永久有效
password warning period:
密码过期之前的友善提醒天数,默认为7天
password inactivity perod:
密码过期之后的宽限期,默认为-1,意思是永久宽限
password inactivity perod:account expiration date:
一个用户账户密码过期的日期,这是一个绝对的过期期限,xxxx年/xx月/xx日
reserved field:
保留字段,以备以后使用
/etc/group
Group name:encryted password:administrators:members