十二、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;不進行身份登錄切換;