十二、bash变量
变量:一段有名称的连续的内存空间;这段内存空间的名称,成为变量名;在这段内存空间中存储的数据,则称为变量值;
数据:文件,存在值;
向内存空间(变量)中存储数据的过程,称为赋值操作;赋值符号通常为“=”;
变量的类型:
123 --整型:01111011
--字符型:ASCII:3字节
--字符型:UTF-8:9字节
变量:
强变量:使用之前必须事先予以声明;必须声明变量类型;
弱变量:在使用之前无需声明、也无需指明变量类型;(bash变量)
变量的赋值方法:
VARNAME=VALUE
其含义:将某数值(VALUE)通过赋值操作存储于特定的内存空间中(VARNAME)
bash变量名称的命名规范:
1.变量名只能以“_”或“字母”为起始字符,后面其他字符可以是任意字母,数字或下划线:
ABC A_B
2.变量名中的字母是大小写敏感的;
3.命名的书写格式:
全大写:HISTSIZE
全小写:myvar
驼峰式:MyNewVariable
4.变量名要能见名知意;
5.变量名不能与已知变量或bash的内置变量重复;
bash中的变量分类:
根据变量的作用范围来划分:
全局变量(环境变量):作用范围为整个shell进程包括其子shell;
本地变量:作用范围为当前登录时所打开的shell进程,不包括其子shell;
局部变量:作用范围仅仅只是当前程序段,一般用于函数;
根据变量的声明方式来划分:
bash内置变量:
普通的内置变量:HISTSIZE,……
位置参数变量:$0,$1,$2,$3……
特殊变量:$?,$#,$*,$@,$$,……
$?:展开为最后一次执行的命令的状态返回值(退出状态码):用以表示最后一次执行的命令是否成功执行;
$#:不包括$0在内的其余位置参数的个数,以十进制数字表示;
$*:从$1开始展开为位置参数当使用双引号引用展开的结果时,他展开为特殊变量IFS的第一个字符分隔值;
$@:从$1开始展开为位置参数,当使用双引号引用展开的结果时,他展开为一个单独的字符串;
$$:展开为当前shell的进程标识符
自定义变量:
变量的使用:
1.变量的声明和赋值:
1)声明全局变量(环境变量):
export VARNAME
export VARNAME=VALUE
declare命令:
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变量名和变量值;
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Set or unset values of shell options and positional parameters.
export命令:查看变量名称,也可以为变量赋值
env命令:
3. 查看变量的值:
echo ${VARNAME}
4.撤销变量的赋值及变量声明:
unset VARNAME
有关于保存变量的shell配置文件:
通用配置文件:
/etc/bashrc
/etc/profile
/etc/profile.d/*
私人配置文件:
~/.bashrc
~/.bash_profile
注意:
1. 一般情况下,变量都是随用随声明,除非有必要否则不建议修改配置文件的内容;
2. 声明变量在使用完以后,最好使用unset命令予以撤销;
用户和组管理:
用户账户
组账户
权限分配
没有一个完整的认证机制资源将会造成一种混乱的局面尤其是在服务器上他并不是给某个人或某个团体网给多个部门和团体使用,为了保证资源的安全利用最开始由Cisco开发并建立了AAA认证体系:
Authentication:认证并核实使用者身份;
Authotization :授权,对已经核实身份的使用者进行资源分配;
Acciunting:审计,监管资源被使用的情况;
多任务,多用户操作系统;(windows中并不可以多用户操作)
能够实现资源使用和完成任务的主体是:应用程序进程;
安全上下文:Secure Context(对进程和文件都是有的)
进程是以发起者的身份运行的;可以理解为,进程的所有者就是发起者;每个进程上都会标记上其所有者的身份信息;
当继承试图访问资源的时候,安全上下文会比对进程的所有者和资源的所有者之间的关系;
首先,查看进程的所有者是否和资源的所有者为同一用户,如果是,就按照所有者所拥有的权限来使用资源;如果不是,则判断进程的所有者是否属于该资源所属组的成员;如果是,按照所属组的权限来使用资源;
如果不是,就按照最为普通的其他用户的权限来使用资源;(最关键的两个问题所有者和所属组)
用户账户:实现操作者和计算机交互式操作的基础,是操作者的身份在满足了验证条件之后的计算机系统中的映射;
用户账户分类(Linux中用户账户有很多):
超级用户(管理员):root/
普通用户:
系统用户(非登录用户)
为了保证系统安全,往往会让某些进程或服务必须以非管理员的用户身份运行;(网络会话劫持:劫持系统中正在进行的一个进程)这类非管理员用户,称为系统用户:此类用户一般不允许登陆到系统,防止被网络会话劫持后系统遭到破环。
登录用户
能通过登陆行为验证用户身份进而获得资源访问权限并可以对资源进行操作的用户,可以称为登录用户;
用户账户的表示方式:
用户登陆名称:
位操作者提供简单易记的字符串表示
用户的数子ID(UID):
为计算机操作系统提供的标准数字标识符号,0~2^32-1
超级用户:
用户名:root
UID:0
普通用户:
系统用户:
Centos 6及以前的版本:系统的UID是1~499
Centos 7及以后的版本:系统的UID是1~999
登录用户:
Centos 6及以前的版本:500+
Centos 7及以后的版本: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:
sha384:
sha512:Linux中默认的加密算法;
salt:通过随机算法计算得到的随机数;
随机数的生成装置:
/dev/random:
仅仅是从熵池中返回随机数;如果熵池中随机数耗尽,进程会被阻塞;
/dev/urandom
首先试图从熵池中返回随机数,如果熵池中随机数耗尽,则利用伪随机数生成器生成伪随机数;
在认证库中的密码的最终形态:算法+salt+加密字符串;
算法:$1~$6
salt:$随机字符串
加密字符串:$单向加密的结果
组账户:将具有某些相同或相似属性的用户联系在一起以便可以集中授权的容器;
组的分类:
超级用户组
普通用户组
系统用户组
登录用户组
组账户的标识方法:
组账户名称:
组账户ID(GID):
超级用户组:0
系统用户组:
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 - 创建一个新组
格式:groupadd [选项] group
常用选项:
-g GID:指定要创建的组的GID;
-r:将组创建为系统组,此时应该保证GID在系统组范围内;
2. Groupdel
groupdel - 删除一个组
格式:groupdel [选项] GROUP
注意:如果某个组是某个用户的主要组,则改组不能删除;
3. Groupmod
groupmod - modify a group definition on the system
格式:groupmod [选项] GROUP
常用选项:
-g GID:修改指定组的GID;
-n GROUP_NAME:修改指定组的组账户名称;
例如:[root@localhost ~]# groupadd group1
[root@localhost ~]# tail /etc/group
postfix:x:89:
sshd:x:74:
slocate:x:21:
avahi:x:70:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
tcpdump:x:72:
die:x:1000:die
group1:x:1001:
[root@localhost ~]# groupmod -g 6000 -n grp1 group1
[root@localhost ~]# tail /etc/group
postfix:x:89:
sshd:x:74:
slocate:x:21:
avahi:x:70:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
tcpdump:x:72:
die:x:1000:die
grp1:x:6000:
4.useradd
useradd - 创建一个新用户或更新默认新用户信息
格式: useradd [选项] username
useradd -D[选项]
常用选项:
-c, --commentCOMMENT:为用户添加注释信息
-d, --homeHOME_DIR:为用户指定家目录的路径;此目录不能事先存在
-e, --expiredateEXPIRE_DATE:用户账户将被禁用的日期 ;如:2017/10/11
-f, --inactiveINACTIVE:为用户指定密码使用达到最大时间之后的宽限期
-g, --gidGROUP:为用户指明GID;如果不写此选项,系统将创建一个与用户相同的组
-G, --groupsGROUP1[,GROUP2,...[,GROUPN]]]:为用户添加附加组
-m, --create-home :必须为用户创建家目录
-M :不为用户创建家目录;在创建系统用户时常用
-r,--system:创建系统用户;
-s, --shellSHELL:为用户指定默认的shell ;
-u, --uidUID:为用户指定UID
5.userdel
userdel - 删除用户账户和相关文件
格式:userdel [选项] username
常用选项:
-r, --remove:删除用户的同时删除用户的家目录及用户邮箱文件;
6.usermod
usermod -修改一个用户账户
格式;usermod[选项]username
常用选项:可以在shell中man一下基本上和useradd一样
-c, --commentCOMMENT:修改注释信息
-d, --homeHOME_DIR:修改用户的家目录
-e, --expiredateEXPIRE_DATE:修改用户密码过期的绝对日期
-f, --inactiveINACTIVE:修改用户密码过期之后的宽限期;
-g, --gidGROUP:为用户指明GID;
-G, --groupsGROUP1[,GROUP2,...[,GROUPN]]]:修改用户的附加组位此列表中的组,如果同时使用了-a选项,则保留了原有的附加组,将此列表中的组追加到用户的附加组列表;
-l, --loginNEW_LOGIN:修改用户的登录名
-s, --shellSHELL:为用户指定默认的shell ;
-u, --uidUID:为用户指定UID
-L, --lock:锁定用户
-U, --unlock:解锁被usermod -L锁定的用户;
7.passwd
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, --lock:锁定用户
-u,--unlock:解锁用户
--stdin:通过标准输入接受密码,可以用于管道;
例如:[root@localhost ~]# echo 123 | passwd --stdin user1
更改用户 user1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
-d, --delete:删除用户密码,也可以用于解除用户锁定
[root@localhost ~]# tail -1 /etc/shadow
user2:!!:17471:0:99999:7:::
其中的叹号证明用户已被锁定,可以通过解锁的方式登录用户也可以在root用户下用vi去删除!来实现对用户的解锁
-n, --minimum DAYS:用户密码的最短使用时长;默认值位0;
-x, --maximum DAYS:用户密码的最长使用时长;默认值位99999;
-w, --warning DAYS:用户密码过期之前多少天开始发送警告信息;
-i, --inactive DAYS:用户密码过期之后的宽限期;
-S, --status”:查看用户密码的状态信息
8.chage
chage - 更改用户密码过期信息
格式:chage [选项] username
常用选项:
-d, --lastdayLAST_DAY:
-E, --expiredateEXPIRE_DATE
-I, --inactiveINACTIVE
-l, --list 现实账户年龄信息
-m, --mindaysMIN_DAYS
-M, --maxdaysMAX_DAYS
-W, --warndaysWARN_DAYS
9.chsh
chsh - change your login shell
格式:chsh [-s shell] [-l] [-u] [-v] [username]
10.finger
finger — user information lookup program
格式:finger [-lmsp] [user ...] [user@host ...]
11.id
id - print real and effective user and group IDs
格式:id [OPTION]... [USER]
常用选项:
-u:显示用户的有效UID;
-g:显示用户的有效GID;
-n:显示名称;
12.su
su - run a command with substitute user and group ID
格式:su [options...] [-] [user [args...]]
常用选项:
-, -l, --login:以后面的用户身份登录到系统;
-c "COMMAND":以前面指定的用户身份运行COMMAND;不进行身份登录切换;