本文主要內容爲Linux基礎系統管理命令,包括文件管理、用戶管理,權限管理,以及一些文本查看工具的介紹,同時也介紹了bash的基礎特性、Globbing,以及Linux操作過程中幫助的獲取方式等。
Linux基礎命令-文件管理
一、遠程連接
在介紹命令之前,首選說明一下這裏使用的環境,所有命令的執行時在Windows主機上,通過遠程連接本地虛擬機的方式進行。LInux系統爲CentOS 7.1 x64,遠程連接工具爲Xshell。
第一次連接的同學可以在Linux鍵入命令 ifconfig 來獲取本機地址:
[root@localhost ~]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.18.128 netmask 255.255.255.0 broadcast 192.168.18.255
inet6 fe80::20c:29ff:fecf:6af3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:cf:6a:f3 txqueuelen 1000 (Ethernet)
RX packets 539 bytes 49226 (48.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 501 bytes 57664 (56.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 22 bytes 2232 (2.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22 bytes 2232 (2.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
筆者這裏的地址爲192.168.18.128,lo接口爲本地環回接口(後面將詳細介紹),而後打開Xshell,填寫連接地址與名稱:
由於這裏使用SSH協議連接,需要Linux打開SSH服務,可使用如下命令查看:
[root@localhost ~]# netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 ::1:6010 :::* LISTEN
若主機監聽TCP/22端口,則證明已經開啓SSH服務(默認配置,可修改)
若一切無誤,即可通過遠程連接登錄CentOS。
二、基礎命令介紹
1. 基礎命令
pwd
pwd意爲Print Working Directory,即打印工作目錄。對於現代操作系統而言,用戶在登錄後,一定會處於某一目錄下,這個目錄就叫做工作目錄(Working Directory),使用pwd命令可以顯示該位置,如:
[root@localhost ~]# pwd
/root
ls
ls爲list之意,可列出目錄內容,其用法如下:
ls [OPTION]... [FILE]...
OPTION | 描述 |
---|---|
-l | 使用長格式 |
-h, --human-readable | 通常與-l選項一同使用,可將文件大小顯示爲“人類易讀的”形式,即對文件大小做格式轉換,原默認單位爲字節 |
-a, --all | 顯示以"."開頭的隱藏文件,有兩個特殊目錄: .當前目錄, …上一級目錄 |
-A, --almost-all | 與-a相同,但是不顯示.與…目錄 |
-d, --directory | 顯示目錄自身信息,而非其內容,通常與-l一起使用 |
-i, --inode | 顯示文件的索引節點號 |
-S | 按文件從大到小排序 |
-t | 按文件創建時間排序 |
-r, --reverse | 逆序排列,即逐級向下顯示子目錄中的內容 |
-R, --recursive | 遞歸顯示 |
如:
[root@localhost /]# ls /usr/
bin etc games include lib lib64 libexec local sbin share src tmp
[root@localhost /]# ls -a /usr/
. .. bin etc games include lib lib64 libexec local sbin share src tmp
[root@localhost /]# ls -d /usr/
/usr/
關於-l選項,其輸出如下:
[root@localhost ~]# ls -l /etc/fstab
-rw-r--r--. 1 root root 541 Dec 20 04:12 /etc/fstab
各部分意義如下:
- -rw-r–r--.
- 共11位,最左側一位表示文件類型,有一下幾種類型:
- -:常規文件(file)
- d:目錄文件(directory)
- b:塊設備文件(block device)
- c:字符設備文件(character device)
- l:符號鏈接文件(symbolic link file)
- p:命名管道(pipe)
- s:套接字文件(socket)
- 第2到第10位表示文件的基本權限信息,rwx(讀、寫、執行),沒有改權限則用"-"表示1,分爲三組:
- 第一組爲文件的屬主權限
- 第二組爲文件的數組權限
- 第三組爲其他用戶的權限
- 擴展權限,若文件設置了FACL,則此處爲+,否則爲.
- 共11位,最左側一位表示文件類型,有一下幾種類型:
- 1:文件被硬鏈接的次數
- root:文件的屬主(owner)
- root:文件的數組(group)
- 541:文件大小,默認單位爲字節
- Dec 20 04:12:文件最後一次的修改時間
- /etc/fstab:文件名
cd
cd意爲Change Directory,可用於更改當前工作目錄,若不跟參數,則默認切換到當前用戶的家目錄,若使用 ~USERNAME,可切換到指定用戶的家目錄(僅管理員可執行),如:
[root@localhost ~]# id centos
uid=1000(centos) gid=1000(centos) groups=1000(centos)
[root@localhost ~]# cd ~centos
[root@localhost centos]# pwd
/home/centos
tty
顯示當前終端對應的終端 設備文件(前文有介紹),如
[root@localhost ~]# tty
/dev/pts/0
who
show who is logged on,查看當前系統上登錄的所有用戶及其信息,常用選項如下:
OPTION | 描述 |
---|---|
-b | 系統此次啓動的時間 |
-d | 顯示死亡的進程 |
-l | 顯示登錄進程 |
-r | 顯示當前運行級別 |
如:
[root@localhost /]# who
root pts/0 2019-01-25 20:00 (192.168.18.1)
root pts/1 2019-01-25 20:00 (192.168.18.1)
[root@localhost /]# who -b
system boot 2019-01-25 19:58
[root@localhost /]# who -l
LOGIN tty1 2019-01-25 19:59 6337 id=tty1
[root@localhost /]# who -r
run-level 3 2019-01-25 19:59
[root@localhost /]# who -rb
system boot 2019-01-25 19:58
run-level 3 2019-01-25 19:59
[root@localhost /]# who -rbl
system boot 2019-01-25 19:58
run-level 3 2019-01-25 19:59
LOGIN tty1 2019-01-25 19:59 6337 id=tty1
file
查看文件內容格式,如
[root@localhost /]# file /etc/fstab
/etc/fstab: ASCII text
[root@localhost /]# file /dev/sda
/dev/sda: block special
[root@localhost /]# file /bin/cp
/bin/cp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x930ba1b99a27112a3ce696993ee8b38556235df2, stripped
echo
echo意爲回聲,即輸出信息,有以下常用參數:
OPTION | 描述 |
---|---|
-n | 不爲顯示的內容自動添加換行符 |
-e | 啓用轉義(逃逸)符 |
- 常用轉義符
- \b backspace 刪除前一字符
- \n new line 換行符
- \r carriage return 回車符
- \t horizontal tab 橫向製表符
- \v vertical tab 縱向製表符
- \0NNN byte with octal value NNN (1 to 3 digits)
- \033[##m
- 第一個#:3表示前景色,4表示背景色
- 第二個# 顏色,1-7
- \033[0m 控制符結束
- 多個控制符使用分號隔開
- \033[##m
如:
[root@localhost /]# echo "Hello World"
Hello World
[root@localhost /]# echo -n "Hello World"
Hello World[root@localhost /]#
[root@localhost /]# echo -e "Hello\nWorld"
Hello
World
2. 時間相關
date
輸入或設置系統日期或時間,使用格式:
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
YY:兩位年份
CCYY:四位年份
FORMAT | 描述 |
---|---|
%a | locale’s abbreviated weekday name (e.g., Sun) |
%A | locale’s full weekday name (e.g., Sunday) |
%d | day of month (e.g, 01) |
%D | date; same as %m/%d/%y |
%F | full date; same as %Y-%m-%d |
%m | month (01…12) |
%M | minute (00…59) |
%n | a newline |
%s | seconds since 1970-01-01 00:00:00 UTC,timestamp |
%S | second (00…60) |
%T | time; same as %H:%M:%S |
%y | last two digits of year (00…99) |
%Y | year |
如:
[root@localhost /]# date
Fri Jan 25 20:19:28 CST 2019
[root@localhost /]# date +"%D"
01/25/19
[root@localhost /]# date +"This year is %Y"
This year is 2019
[root@localhost /]# date +"%Y-%m-%d"
2019-01-25
[root@localhost /]# date +"%F"
2019-01-25
cal
cal即calendar,顯示系統日曆:
[root@localhost ~]# cal
December 2018
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
clock, hwclock
clock的程序文件事實上是hwclock的符號鏈接,二者作用相同,用於查看硬件時鐘。
Linux系統上有兩套時鐘,一個爲主板上的硬件時鐘,有獨立電源供電,另一個問內核時鐘,在系統啓動時讀取硬件時鐘。二者在系統運行時可能不一致。
同步硬件時間與系統時間:
- # hwclock {-w|–systohc}: 將系統時間同步到硬件時間(改硬件時間)
- # hwclock {-s|–hctosys}: 將硬件時間同步到系統時間(改系統時間)
3. 關機命令
Linux有衆多關機命令,如
# systemctl poweroff
# halt
-p 關機(poweroff)
--reboor 重啓(reboot)
# shutdown
-r 重啓(reboot)
-h 關閉(halt)
-c 取消關機(cancel)
-k 發送警告信息,禁止新用戶登錄
shutdown可以依據目前已啓動的服務來逐次關閉各服務後才關機;
halt能夠在不理會目前系統狀況下,進行硬件關機。
4. 文本查看命令
cat
cat意爲concatenate,連接文件並將其打印到標準輸出,其使用格式爲:
cat [OPTION]... [FILE]...
OPTION | 描述 |
---|---|
-E | 顯示行結束符$ |
-s | 將多個連續的空白行顯示爲一行 |
-n | 顯示行號 |
-v | 顯示非打印字符 |
-e | 相當於-vE |
如,欲查看/etc/fstab文件內容:
[root@localhost /]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
tac
與cat命令相似,只是默認按行逆序顯示
[root@localhost /]# tac /etc/fstab
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-root / xfs defaults 0 0
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
# Created by anaconda on Wed Dec 19 20:12:26 2018
# /etc/fstab
#
head
head意爲頭,顧名思義,可查看文本文件的前幾行,默認爲10
head [OPTION]... [FILE]...
[OPTION]
-c #: 指定獲取前#字節
-n #: 指定獲取前#行
-#:n可省略
如:
[root@localhost ~]# head -5 /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
[root@localhost ~]# head -c 50 /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec 1[root@localhost ~]#
該命令在執行完成後不會自動換行
tail
tail即尾部,同樣,可用於查看文本文件的末尾幾行,默認爲10
tail [OPTION]... [FILE]...
[OPTION]
-c #: 指定獲取後#字節
-n # 顯示後#行
-#:n可省略
-f 顯示文件尾部,不退出,等待顯示後續追加至此文件的新內容,通常用來監視日誌
如:
[root@localhost /]# tail -5 /etc/fstab
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
more
more意爲更多的,其命令手冊解釋爲: file perusal filter for crt viewing,可用於顯示文本文件,命令使用方式同man命令。與之不同的是,該命令在文件顯示至尾部後,將會自動退出。
如:
[root@localhost /]# more /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
[root@localhost /]#
less
less命令的同發與man命令相同,這裏不再贅述。
- less與more的不同之處在於less命令在顯示到文件尾部後不會自動退出,而more將會自動退出
如:
[root@localhost /]# less /etc/fstab
=============以下爲新屏幕=============
#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/etc/fstab (END)
5. 目錄與文件管理命令
cp
cp以爲copy,即複製,用於複製文件或目錄,格式:
cp SRC... DEST
若SRC是一個文件
若DEST不存在:創建此文件,並複製源文件的數據流至DEST中
若DEST存在:覆蓋,此時建議使用-i選項
若DEST存在,且是個目錄:複製源至目標目錄中並保持源文件名
若SRC有多個文件
若目標存在,且是一個文件,報錯
若目標存在,且是一個目錄:複製個文件至目標目錄中,並保持原名
若目標不存在,報錯
若SRC是隻有一個且是目錄(cp目錄默認只複製文件,不會複製目錄)
若目標是一個文件且存在,報錯
若目標不存在:創建新目錄
若目標存在且是目錄:複製源目錄至目標目錄中,且保持原名
常用選項
選項 | 描述 |
---|---|
-R, -r, --recursive | copy directories recursively,遞歸複製一個目錄及其目錄下所有位文件(包括子目錄) |
-f, --force | 強行覆蓋 |
-i, --interactive | 交互式複製,如提醒用戶是否覆蓋已存在的數據 |
-p | same as --preserve=mode(權限),ownership(屬主屬組),timestamps(時間戳),保留文件的屬主、屬組、權限以及時間戳 |
-a, --archive | same as -dR,archive(歸檔),保留文件所有屬性,常用於備份 |
-d,–no-dereference,–preserv=links | 不追蹤符號鏈接 |
–preserve[=ATTR_LIST] | ATTR_LIST - - - - mode:權限 - - - - ownership:從屬關係(屬主屬組) - - - - timestamps:時間戳 - - - - links:鏈接屬性 - - - - xattr:擴展屬性 - - - - context:安全上下文 - - all:以上所有 |
-L, --dereference | always follow symbolic links,複製鏈接指向的文件(默認如此) |
-P, --no-dereference | never follow symbolic links in SOURCE ,保持鏈接 |
-d | same as --no-dereference --preserve=links,當源文件爲連接文件時,複製鏈接文件本身而非其指向的源文件 |
如,複製/etc目錄下所有以p開頭,以非數字結尾的文件或目錄到/tmp/mytest1目錄中
[root@localhost /]# mkdir /tmp/mytest1
[root@localhost /]# ls -d /etc/p*[^[:digit:]]
/etc/pam.d /etc/pbm2ppa.conf /etc/plymouth /etc/popt.d /etc/prelink.conf.d /etc/profile.d /etc/python
/etc/passwd /etc/pinforc /etc/pm /etc/postfix /etc/printcap /etc/protocols
/etc/passwd- /etc/pki /etc/pnm2ppa.conf /etc/ppp /etc/profile /etc/pulse
[root@localhost /]# cp -r /etc/p*[^[:digit:]] /tmp/mytest1/
[root@localhost /]# ls /tmp/mytest1/
pam.d passwd- pinforc plymouth pnm2ppa.conf postfix prelink.conf.d profile protocols python
passwd pbm2ppa.conf pki pm popt.d ppp printcap profile.d pulse
mv
mv意爲move,即移動,可用於移動文件位置,或文件重命名。使用格式如下:
mv [OPTION]... SOURCE... DIRECTORY
如果源和目標的路徑相同,只是文件名不同,則爲重命名
[OPTION]
-i prompt before overwrite 提示覆蓋(默認管理員命令別名中存在)
-f do not prompt before overwriting 強制覆蓋,不提示
-t, --target-directory=DIRECTORY
格式: mv -t DEST SRC
mv可以直接移動目錄,而無需-r選項
install
install即安裝,可用於複製文件並定製其屬性,常用格式
單文件複製
install [OPTION]... [-T] SOURCE DEST
把多個文件複製到一個目錄中:
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
創建目錄
install [OPTION]... -d DIRECTORY...
[OPTION]
-m=MODE 指定權限,默認爲755
-o=OWNER 指定屬主
-g=GROUP 指定屬組
mktemp
mktemp意爲make temporary,可創建臨時文件或目錄。常見用法如下:
mktemp [OPTION]... [TEMPLATE]
[OPTION]
-d 創建臨時目錄
[TEMPLATE]
指定要創建的臨時文件或目錄的名稱,需要至少包含3個“X”
如:
[root@localhost ~]# mktemp /tmp/mytmp
mktemp: too few X's in template ‘/tmp/mytmp’
[root@localhost ~]# mktemp /tmp/mytmpXXXX
/tmp/mytmp8wQ7
[root@localhost ~]# mktemp /tmp/mytmpXXXXXXXXX
/tmp/mytmp6CwrEUrFN
[root@localhost ~]# mktemp /tmp/mytmpX2X3X4X5X6X
mktemp: too few X's in template ‘/tmp/mytmpX2X3X4X5X6X’
mkdir
mkdir即make directory,創建空目錄,用法如下:
mkdir [OPTION]... DIRECTORY...
[OPTION]
-p, --parents
no error if existing, make parent directories as needed
參數中路徑的最後一個節點纔是要創建的目錄,即路徑基名才爲命令的作用對象
基名之前的路徑須存在,若路徑不存在可使用該選項創建
-v, --verbose
print a message for each created directory
-m MODE 創建目錄時直接指定權限
如,使用命令行展開功能,創建/tmp/a1, /tmp/a2, /tmp/a1/a, /tmp/a1/b,在/tmp目錄下創建目錄:x_y, x_z, q_y, q_z
[root@localhost /]# mkdir -p /tmp/a{1/{a,b},2}
[root@localhost /]# mkdir /tmp/{x,q}_{y,z}
rmdir
rmdir意爲remove directory,用於移除一個空目錄
rmdir [OPTION]... DIRECTORY...
[OPTION]
-p, --parents Remove DIRECTORY and its ancestors
刪除某目錄後,若其父目錄爲空,則一併刪除,依次類推
-v 顯示詳細信息
tree
tree意爲樹,我們通常將Linux目錄結構稱爲倒置的樹狀結構,使用該命令可展示該結構,命令參數:
參數 | 說明 |
---|---|
-L level | 指定顯示層級數目 |
-d | 只顯示目錄 |
-P pattern | 只顯示由指定的pattern匹配到的路徑 |
如:
[root@localhost ~]# tree -dL 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
19 directories
rm
rm爲remove,可移除文件或目錄,該命令常用選項較少,但非常危險,請謹慎操作:
- -r, -R, --recursive:遞歸刪除
- f, --force:強制刪除
- -i:交互模式,在刪除每一個文件前詢問是否刪除
由於管理員使用該命令風險較高,故mv、rm、cp等默認都爲管理員用戶設置了命令別名,用作提醒。
另外,建議所有不用的文件建議不要直接刪除,而是移動至某個專用目錄(模擬回收站)
三、bash基礎特性
1. 命令歷史
使用方式
bash會保存的過去曾經執行過的命令,在當前shell進程中,保存在內存緩衝區中;
在用戶的家目錄下有一個**.bash_history**的隱藏文件,在用戶正常退出時,內存緩衝區中的命令歷史會追加到該文件中
- Linux文件系統的另一特性:以點號開頭的文件爲隱藏文件,使用ls -a查看
用戶在登陸時,系統會讀取 ~/.bash_history 文件中記錄下的命令
使用上下箭頭鍵可以翻看此前曾經執行過的命令
可通過使用history命令查看命令歷史
調用命令歷史列表中的命令
按鍵 | 操作 |
---|---|
!n | 執行命令歷史中的第n條命令 |
!-n | 執行命令歷史中倒數第n條命令 |
!! | 執行上一條命令 |
!STRING | 執行命令歷史中最近一個以STRING開頭的命令(命令的重複執行有時候需要依賴於冪等性) |
!$ | 引用上一個命令的最後一個參數 |
ESC, . | (按下ESC後,鬆開按.),引用上一個命令的最後一個參數 |
Alt+. | 引用上一個命令的最後一個參數(遠程終端可能不支持) |
命令:history
history,即歷史,Display the history list with line numbers,用法:
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]
參數
-c 清空命令歷史
-r 從文件讀取命令歷史到歷史列表中
-w 把歷史列表中的命令追加到歷史文件中
-d OFFSET [n] 刪除指定位置的命令
-a 追加當前會話的命令歷史到歷史文件中
# 顯示歷史中最近的#條命令
相關環境變量
- PATH:命令搜索路徑
- HISTSIZE:命令歷史緩衝區大小
- 在RedHat系統上默認是1000
- HISTFILE:命令歷史文件
- HISTFILESIZE:命令歷史文件中可以保存的命令的個數
- HISTCONTROL:控制命令歷史的記錄方式
- ignoredups 忽略重複的命令,連續相同的命令才爲重複
- ignorespace 以空格開頭的命令不會被記錄
- ignoreboth 同時具有以上兩個值的特性
2. bash的補全特性
我們在bash中輸入時,可以通過敲Tab鍵來對我們的鍵入進行補全操作。
路徑補全
按Tab可以補全以當前輸入字符串開頭的路徑,若有多個,按兩次Tab可以顯示所有以該字符串開頭的路徑,若沒有指出路徑,則爲當前目錄。
該操作由bash搜索文件系統實現
命令補全
shell程序在接受到用戶執行命令的請求,分析完成後,最左側的字符串會被當做命令。在其搜索命令時,先搜索內部命令,而後將根據PATH壞境變量這設定的目錄,自左而右逐個搜索目錄下的文件名。
按Tab可以補全以當前輸入字符串開頭的命令,若有多個,按兩次Tab可以顯示所有以該字符串開頭的命令,在PATH環境變量下搜索補全。
PATH環境變量是一組有冒號分隔的路徑:
[root@localhost ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
由於進程在發起之前,其程序文件都是保存於計算機上的某位置,而我們之所以在鍵入命令時不必每次都輸入命令的完整路徑(即位置)就可以將其發起爲一個進程(即運行命令),就是因爲PATH環境變量。
3. 命令行展開
花括號展開
bash的*花括號展開特性可承載一個以逗號分隔的路徑列表,並能夠將其展開爲多個,如:
[root@localhost ~]# mkdir -pv /mnt/test/{x/m,y}
mkdir: created directory ‘/mnt/test’
mkdir: created directory ‘/mnt/test/x’
mkdir: created directory ‘/mnt/test/x/m’
mkdir: created directory ‘/mnt/test/y’
以上命令同
[root@localhost ~]# mkdir -p /mnt/test/x/m
[root@localhost ~]# mkdir -p /mnt/test/y
[root@localhost ~]# mkdir -p /mnt/test/z
再如,使用展開用創建/tmp/test/a_b,a_c,d_b,d_c四個目錄:
mkdir -pv /mnt/test/{a,d}_{b,c}
波浪線展開
- ~:展開爲用戶的主目錄
- ~[USERNAME]:展開爲指定用戶的主目錄
4. 快捷鍵
bash光標跳轉的常用快捷鍵
按鍵 | 說明 |
---|---|
Ctrl+a | 跳到命令行首 |
Ctrl+e | 跳到命令行尾 |
Ctrl+u | 刪除光標至命令行首的內容 |
Ctrl+k | 刪除光標至命令行尾的內容 |
Ctrl+← | 向左跳轉一個單詞 |
Ctrl+→ | 向右跳轉一個單詞 |
Ctrl+l | 清屏,相當於clear命令 |
Ctrl+c | 取消或終止 |
Ctrl+z | 將當前命令送至後臺,使用fg命令調回上次送至後臺的進程 |
5. 命令別名
在我們經常使用某些冗長或不變記憶的命令時,可爲其定義命令別名。
如在Windows中,cls爲清空屏幕命令,而在Linux中爲clear,若更習慣使用“cls”,則可將cls定義爲clear的別名,如此,在執行cls時,bash將執行clear;
再如,我們若需要經常編輯/etc/sysconfig/network-scripts/ifcfg-eno16777736文件時,在輸入時比較繁瑣,可將其定義爲別名,使用alias命令:
alias
[root@localhost ~]# alias vimnet='vim /etc/sysconfig/network-scripts/ifcfg-eno16777736'
如此,在運行vimnet後,將等同於鍵入了vim /etc/sysconfig/network-scripts/ifcfg-eno16777736。
不帶參數的alias命令可用於查看當前shell已經生效的名別名:
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias vimnet='vim /etc/sysconfig/network-scripts/ifcfg-eno16777736'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
上文有提到,rm等命令已經默認爲管理員用戶設置了命令別名,這裏可以查詢。
若命令別名設置的與原命令相同,可在命令前加“\”(反斜線)來執行原命令。
unalias
若要撤銷設定的命令別名,可使用unalias命令:
unalias COMMAND_ALIAS
撤銷命令別名時只需指定別名即可
常用選項
- -a:撤銷所有別名
相關配置
使用alias設定的命令別名進隊當前shell進程有效,可以在shell的配置文件中定義,使別名永久有效:
- 僅對當前用戶有效:~/.bashrc
- 對所有用戶有效:/etc/bashrc
若要使其立即生效,指定bash重新讀取配置文件即可:
source /PATH/TO/CONFIG_FILE
該命令也可簡寫爲.
. /PATH/TO/CONFIG_FILE
6. bash中的引號
引號,即爲引用之意,bash中支持3種引用類型。
命令引用
使用反引號(``)引起來的內容將被當做命令執行,並將執行結果返回。
如,欲查看vim命令的課執行文件的類型:
[root@localhost ~]# which vim
/usr/bin/vim
[root@localhost ~]# file `which vim`
/usr/bin/vim: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked(uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x530e3b1a3084847f35bfddc8527f432c028b7ca0, stripped
另外,使用 $(COMMAND) 也可實現相同的效果。
強引用
使用單引號(’’)可進行強引用,即引號中的內容將會按字符返回,不會被解析爲其他意義(轉義字符除外),所見即所得,如:
[root@localhost ~]# var1=1
[root@localhost ~]# echo $var1
1
[root@localhost ~]# echo '$var1'
$var1
弱引用
使用雙引號("")爲若引用,引號中的內容將會被解析爲變量,如:
[root@localhost ~]# var1=1
[root@localhost ~]# echo "$var1"
1
[root@localhost ~]# echo $var1
1
[root@localhost ~]# echo '$var1'
$var1
如上所示,我們一般可以省略雙引號。
7. 變量
變量(Variable) 相信大家並不陌生,其實質上就是一段命名的內存空間。而在bash中,同樣支持變量的概念。
bash中的變量類型
變量類型 | 說明 |
---|---|
環境變量 | 作用域爲當前shell進程及其子進程 |
本地變量 | 作用域爲整個bash進程 |
局部變量 | 作用域爲當前代碼段(通常指函數) |
位置變量 | $1,$2,…用於讓腳本在腳本代碼中調用通過命令行傳遞給它的參數 |
特殊變量 | 保存某些特殊數據 |
- 特殊變量
- $0: 腳本名稱本身
- $?: 上一條命令的執行狀態
- 狀態用數字表示:0-255
- 成功:0
- 失敗:1-255
- $$:腳本運行的當前進程ID
- $!:Shell最後運行的後臺進程的PID
- $#: 參數數量
- $*: 所有參數的一個字符串
- $@:所有參數單獨作爲每個字符串
- $1、$2…:位置變量,對應第一、第二個參數
- 關於$@與$*的區別:
- 只有在雙引號中體現出來。假設在腳本運行時寫了三個參數(分別存儲在$1 $2 $3)則"$*" 等價於 “$1 $2 $3"(傳遞了一個參數);而“$@" 等價於 “$1” “$2” “$3”(傳遞了三個參數)
變量聲明
bash中變量的命名規則同其他語言類似,變量名只能包含數字、字母和下劃線,而且不能以數字開頭,另外,變量賦值時不能使用$。
本地變量的聲明
bash爲弱類型,故在聲明變量時不必指定變量類型(但這不代表這些變量沒有類型),可直接使用如下形式聲明變量:
[set] VARNAME=VALUE
set可省略
使用不帶參數的set命令可查看系統已定義的所有變量
只讀變量的聲明
readonly VARNAME
或
declare -r VARNAME
在聲明時指定readonly,或使用declare -r,可聲明只讀變量(常量),由於其在聲明後不可更改內容,需要在聲明時進行初始化。
環境變量的聲明
export VARNAME=VALUE
或
VARNAME=VALUE; export VARNAME
或
declare -x VARNAME
- 環境變量的查看
- printenv
- env
- export
環境變量對當前shell及其子shell都有效
局部變量的聲明
local VARNAME=VALUE
僅對局部代碼生效
變量的引用
- ${VARNAME} 不會引起混淆的話,{}可省略
- “” 弱引用,其中的變量引用會被替換爲變量值
- ‘’ 強引用,其中的變量引用不會被替換爲變量值,而保持原字符串
8. 重定向與管道
I/O重定向
Linux中一切皆文件,打開的文件都有一個FD(File Description)。即文件描述符,這裏特別說明一下特殊的I/O文件:
- 默認輸出設備:標準輸出,STDOUT,默認爲monitor,描述符爲1
- 默認輸入設備:標準輸入,STDIN,默認爲keyboard,描述符爲0
- 標準錯誤輸出:錯誤信息,STDERR,默認爲monitor,描述符爲2
默認設備
- 標準輸入:鍵盤
- 標準輸出和錯誤輸出:顯示器
而I/O重定向就是改變數據輸入來源或輸出目標的操作。
輸出重定向與錯誤輸出重定向
-
> 覆蓋輸出
- set -C : 禁止對已存在文件使用覆蓋重定向
- >|: 強行覆蓋輸出(即使設置了set -C)
- set +C : 關閉上述功能
- set命令可以使用+或-來設置或取消相關選項
- set -C : 禁止對已存在文件使用覆蓋重定向
-
>> 追加輸出
-
2> 重定向錯誤輸出(覆蓋輸出)
-
2>> 重定向錯誤輸出(追加方式)
-
&> 覆蓋重定向(標準輸出與錯誤輸出)
-
&>> 追加重定向(標準輸出與錯誤輸出)
如
[root@localhost ~]# echo 'hello world' > hello.out
[root@localhost ~]# cat hello.out
hello world
[root@localhost ~]# echo 'how are you' > hello.out
[root@localhost ~]# cat hello.out
how are you
[root@localhost ~]# echo 'new line' >> hello.out
[root@localhost ~]# cat hello.out
how are you
new line
[root@localhost ~]# ls /err 2> hello.out
[root@localhost ~]# cat hello.out
ls: cannot access /err: No such file or directory
[root@localhost ~]# lss /tmp 2>> hello.out
[root@localhost ~]# cat hello.out
ls: cannot access /err: No such file or directory
-bash: lss: command not found
[root@localhost ~]# ls / &>> hello.out
[root@localhost ~]# cat hello.out
ls: cannot access /err: No such file or directory
-bash: lss: command not found
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
- 標準輸出和錯誤輸出各自定向值不同位置
- COMMAND > /path/to/file.out 2> /path/to/error.out
- 合併標準輸出和錯誤輸出爲同一個數據流進行重定向
- &> 覆蓋重定向
- &>> 追加重定向
- COMMAND > /path/to/file.out 2> &1
- COMMAND >> /path/to/file.out 2> &1
- 程序的執行狀態返回值
- Linux中的程序或指令在執行完成後,不只有執行結果(有的不會顯示),還會有一個執行狀態返回值(Return Code),用於標識該指令執行成功與否。
- 0表示執行成功,否則標識執行不成功,該值保存於變量$?中
輸入重定向
- < 輸入重定向
- << Here Document 在此處生成文檔
- <<後的爲文檔結束符,如:cat >> /tmp/myfile.txt << EOF
管道
管道(pipe)的作用爲連接程序,實現將前一個命令的輸出直接定向後一個程序當作輸入數據流,即前一個命令的輸出作爲後一個命令的輸入。用法格式爲
COMMAND1 | COMMAND2 | COMMAND3 | ...
如:
[root@localhost ~]# echo 'hello world' | tr 'a-z' 'A-Z'
HELLO WORLD
- Tips
-
- 最後一個命令會在當前shell進程的子shell進程中執行
相關命令
tr
tr爲translate的前2個字母,可用於轉換或刪除字符
tr [OPTION]... SET1 [SET2]
將SET1中的字符替換爲SET2的字符
[OPTION]
-d delete characters in SET1, do not translate
該命令在執行時一般使用重定向,如:
tr 'ab' 'AB' < /etc/passwd # 將/etc/passwd文件中的a或b轉換成A或B
tr 'a-z' 'A-Z ' < /etc/passwd # 將/etc/passwd文件中的小寫字母轉換成大寫
將當前系統登錄用戶的信息轉換爲大寫後保存至/tmp/who.out文件中
[root@localhost /]# id `whoami` | tr 'a-z' 'A-Z'
UID=0(ROOT) GID=0(ROOT) GROUPS=0(ROOT)
[root@localhost /]# id `whoami` | tr 'a-z' 'A-Z' >> /tmp/who.out
[root@localhost /]#
tee
如圖,tee命令可將數據流分爲“兩份”,一份發送到標準輸出,另一份可通過重定向輸出到文件。
/dev/zero
/dev/null是使用軟件模擬的特殊的設備文件
該設備被稱爲bit bucket,它就像一個垃圾桶,丟進去的數據都會消失。那這個設備有什麼用呢?
我們知道程序的執行結果又兩種,一種是正常的返回結果,另一種是程序的執行狀態結果,用於標識程序是否正常執行。例如我們想知道用戶“user1”是否存在,可以使用id命令2,而我們並不關心其本身信息,只是通過id命令的執行狀態返回值判斷其是否存在:
[root@localhost ~]# id user1 &> /dev/null
[root@localhost ~]# echo $?
1
[root@localhost ~]# useradd user1
[root@localhost ~]# id user1 &> /dev/null
[root@localhost ~]# echo $?
0
四、獲取幫助
1. 內部命令獲取幫助
內部命令幫助的獲取可通過help命令獲取,格式爲:
# help COMMAND
2. 外部命令獲取幫助
外部命令爲文件系統上的某位置的與命令名稱對應的可執行文件,一般會有一個參數–help,使用該參數可以查看基本幫助:
# COMMAND --help
另一種獲取幫助的方式就是查看命令手冊(manual),接下來將介紹。
3. 命令手冊
通過man命令可查看命令手冊:
# man COMMAND
手冊文件的一般位置爲:/usr/share/man/
對於內部命令,使用man時,查看的是當前shell的使用手冊(內部命令一般使用–help選項查看)
查看命令在使用手冊中的哪些章節出現過
whatis KEYWORD 精確查找
其執行過程是查詢數據庫進行的
如果whatis的數據庫尚未生成,可以使用makewhatis手動生成
man –f KEYWORD 作用同whatis
man -k KEYWORD 模糊查找
apropos KEYWORD 作用同man -k
man NUMBER COMMAND
查看指定章節的命令使用手冊
- 命令手冊的章節:
- 1、 用戶命令(/bin, usr/bin, usr/local/bin)
- 2、 系統調用
- 3、 庫調用
- 4、 特殊文件以及設備文件
- 5、 配置文件格式:解釋某一個命令的配置文件的語法
- 6、 遊戲
- 7、 雜項:Miscellanea
- 8、 管理命令(/sbin, /usr/sbin, usr/local/sbin)及守護進程
- 9、 內核有關的文件
man命令的配置文件:/etc/man.config
# man -M /PATH/TO/SOMEWHERE COMMAND
到指定的位置下搜索COMMAND命令的手冊頁並顯示之
使用q退出
命令手冊的分段:
分段 | 說明 |
---|---|
NAME | 命令名稱以及功能簡要說明 |
SYNOPSIS | 用法說明包括可用的選項 |
DESCRIPTION | 命令功能的詳盡說明,可能包括每一個選項的意義 |
MANUAL SECTIONS | 幫助手冊段 |
OPTIONS | 說明每一個選項的意義 |
ENVIRONMENT | 環境變量 |
FILES | 次命令相關的配置文件 |
BUGS | 報告bug的對象 |
TIPS | 提示 |
EXAMPLES | 使用示例 |
SEE ALSO | 另外參照 |
- SYNOPSIS:使用幫助中命令格式中的字符意義:
- []:可選的
- <>:必選的
- |:多選一
- … :同類內容可以出現多次
- {}:分組,無特殊意義
- 翻屏操作
- 向後翻一屏:SPACE, ^F3, ^V
- 向前翻一屏:B, ^B
- 向後翻一行:ENTER, ^N, E, ^E, J, ^J
- 向前翻一行:K, ^K, Y, ^Y, P
- 向後翻半屏:D, ^D
- 向前翻半屏:U,^U
- 定位到當前屏幕的指定行:#
- 定位到文件指定的行:#G
- 定位到文件最後一行:G
- 查找操作
-
- /KEYWORD: 向文件尾部搜索,不區分字符大小寫
- n:下一個
- N:前一個
-
- ?KEYWORD: 向文件首部搜索,不區分字符大小寫
- n:下一個(與查找命令方向相同)
- N:前一個(與查找命令方向相反)
man命令實質上是調用less命令進行輸出,以上用法與less命令相同。
4. 在線文檔
info COMMAND
使用Page Up與Page Down來翻頁
Tab切換超鏈接,按ENTER可實現頁面間的跳轉
5. 程序幫助文檔
很多應用程序自帶有文檔,位於/usr/share/doc/APP-VERSION
一般有以下文件:
- README:程序的相關信息
- INSTALL:安裝幫助
- CNANGES:版本迭代時的改動信息
此外,Google也是一個很好的獲取資料的途徑。
五、時間戳
1. 基礎概念
數據是以文件的形式存儲在磁盤上,除了文件的數據(Data)本身,在存儲時還會保存一些其他信息,即元數據(Metadata)4,時間戳信息就是其中之一。
Linux中的時間戳有三個,即
- 最近一次的訪問時間(Access Time),atime
- 最近一次的修改時間(Modify Time),mtime
- 最近一次的改變時間(Change Time),ctime
這裏說明一下mtime與ctime的區別,前面提到,文件在存儲時,有Data與Metadata,他們存儲在不同的區域
- mtime爲修改時間,指的是修改了文件Data區域的時間
- ctime爲改變時間,指的是修改了Metadata區域的時間(如文件名)
需要注意的是,文件的mtime改變後,ctime一定會改變,因爲mtime存儲在Metadata中
2. 相關命令
stat
stat意爲狀態,可查看文件或文件系統的狀態,如:
[root@ ~]# cp /etc/fstab ./
[root@ ~]# stat fstab
File: ‘fstab’
Size: 541 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 206917765 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2018-12-30 11:15:58.721775819 +0800
Modify: 2018-12-30 11:15:58.721775819 +0800
Change: 2018-12-30 11:15:58.721775819 +0800
Birth: -
可以看到文件的相關元數據信息,其中的Access、Modify、Change即爲其時間戳信息。
touch
touch意爲觸摸,用於改變文件的時間戳信息,用法如下:
touch [OPTION]... FILE...
[OPTION]
-a change only the access time 只改變訪問時間
-c do not create any files 如果文件不存在也不創建
-m change only the modification time 只改變修改時間
-t STAMP
use [[CC]YY]MMDDhhmm[.ss] instead of current time
沒有隻修改改變時間的選項,因爲對文件做的任何修改(包括時間戳)都會改變文件的屬性(改變時間)
若FILE不存在,touch命令會自動創建該文件,故可使用該命令來創建文件,使用-c指定若文件不存在也不創建。
如:在/tmp目錄下創建以tfile開頭,後跟當前日期和時間的文件,文件名形如:tfile-2016-05-27-09-32-22
[root@localhost /]# touch /tmp/tfile-`date +"%F-%H-%M-%S"`
六、Globbing
Globbing,通配,即通用匹配之意,是指用一些特殊的字符,使其不標識其本來的字面意義,而標識某一類字符集合,以此爲 模式(Pattern) 進行字符匹配。
通配符 | 描述 |
---|---|
* | 任意長度的任意字符 |
? | 任意單個字符 |
[] | 匹配指定字符範圍內的任意單個字符 |
[^] | 指定範圍以外的任意單個字符 |
關於範圍,可使用如下方式表示,如
範圍 | 描述 |
---|---|
[abc] | 從abc中匹配,注意:此通配不區分大小寫 |
[a-m] | 從a-m範圍內匹配,注意:此通配不區分大小寫 |
[0-9] | 數字 |
[a-zA-Z] | 字母 |
[[:space:]] | 空白字符 |
[[:punct:]] | 標點符號 |
[[:lower:]] | 小寫字符 |
[[:upper:]] | 大寫字母 |
[[:alpha:]] | 大小寫字母 |
[[:digit:]] | 數字 |
[[:alnum:]] | 數字和大小寫字母 |
- Tips
-
- 指定範圍是不區分大小寫,而指定單個字母時區分
-
- 外層[]表示匹配任意單個字符,裏面爲集合;
-
- 也支持^,如[^[:digit:]]表示非數字;
-
- 使用man 7 glob可查看相關幫助
- 例
-
字母開頭,字母結尾,中間有空白字符:
[[:alpha:]]*[[:space:]]*[[:alpha:]]
-
顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的文件或目錄;
# ls -d /var/l*[0-9]*[[:lower:]]
-
顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄;
# ls -d /etc/[0-9]*[^0-9]
-
顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現一位任意字符的文件或目錄;
# ls -d /vat/l?[[:lower:]]
-
顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄;
# ls -d /etc/[0-9]*[^0-9]
-
顯示/etc目錄下,以非字母開頭,後面跟一個字母及其它任意長度任意字符的文件或目錄;
# ls -d /etc/[^[:alpha:]][a-z]*
-
複製/etc目錄下,所有以m開頭,以非數字結尾的文件或目錄至/tmp/brahming目錄;
# cp -r /etc/m*[^0-9] /tmp/brahming
-
複製/usr/share/man目錄下,所有以man開頭,後跟一個數字結尾的文件或目錄至/tmp/man/目錄下;
# cp -r /usr/share/man/man*[0-9] /tmp/man
-
複製/etc目錄下,所有以.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/conf.d/目錄下;
# cp -r /etc/[mnrp]*.com /tmp/conf.d
七、用戶管理
1. 什麼是用戶
現代的計算機都是多任務(Multi-Tasks)與多用戶(Multi-Users) 的,早期的計算機由於各種原因,並不是每個人獨立擁有一臺計算機,而計算機用戶的概念就可以用戶標識每一位使用者。如今,這一概念已經普遍使用。
對於Linux系統而言,用戶是系統進行資源分派的單位,其主要關注:
- 認證(Authentication)
- 授權(Authorization)
- 審計(Accounting)
2. Linux用戶
UID
UID(User ID),即用戶ID,UID是系統用於標識用戶的字符,用戶輸入的登錄名(即用戶名)也將會映射爲UID進而有系統處理。
用戶分類
- 管理員:UID爲0
- 普通用戶:UID:1-65535
- 系統用戶:UID:1-999
- 在CentOS6中UID爲1-499
- 系統用戶對守護進程獲取系統資源進行權限分配,不允許登陸系統
- 系統用戶:UID:1-999
- 一般用戶:1000-60000
- 在CentOS7中爲500-60000
- 交互式登錄
UID的範圍規定在 /etc/login.defs文件中
UID與用戶名的映射關係保存於文件 /etc/fstab中
3. 組
什麼是組
組(Group) 是用戶的容器,若幾個用戶屬於一個組,就有了這個組擁有的權限,可以說組是一個權限設定的容器。
GID
和UID相同,GID(Grou ID) 即組ID,用於標識一個組。
組的分類
- 用戶組類別①
- 管理員組:GID爲0
- 普通組:GID:1-65535
- 系統組:GID:1-499,在CentOS7中GID爲1-999
- 一般組:GID:500-60000,在CentOS7中GID爲1000-60000
- 用戶組類別②
- 基本組(主組):用戶的默認組
- 附加組,額外組:默認組以外的其他組
- 用戶組類別③
- 私有組:創建用戶時,如果沒有爲其指定所屬的組,系統會自動爲其創建一個僅包含當前用戶的且與當前用戶同名的組,只包含一個用戶
- 公共組:組內包含多個用戶
4. 用戶管理相關命令
useradd
useradd以爲用戶添加,用法如下:
useradd [options] USERNAME
[options]
-u UID 指定UID,其他用戶尚未使用的
-g GID 指定GID(基本組),組要事先存在,可爲組名,也可爲GID
-G GID,... 指定GID(附加組),組要事先存在,可爲組名,也可爲GID,多個組之間使用逗號分隔
-c "COMMENT" 指定註釋信息
-d, --home /PATH/TO/SOMEDIRECTORY
指定家目錄
通過複製/etc/skel目錄並重命名的方式實現
若指定的目錄事先存在,則不會爲用戶複製環境配置文件
-s SHELL 指定shell
/etc/shells指定了當前系統可用的安全shell
默認爲/etc/default/useradd 中的 SHELL 變量中指定的shell
-m -k 強制爲用戶創建家目錄,並且當-k選項啓用時,將/etc/skel/下的文件複製到當前用戶的家目錄
-M 不爲用戶創建家目錄,即使/etc/login.defs中允許創建
-r 添加一個系統用戶
不會用用戶創建家目錄
默認shell爲/sbin/nologin
-D 顯示創建用戶的默認配置
-D[options] 修改選項的值
修改的結果保存於/etc/default/useradd文件中
-f 指定賬戶非活動期限,指定-1則永不禁用
關於配置文件,後文將介紹
另外,也可使用adduser命令,該命令爲useradd命令的符號鏈接
[root@ ~]# file `which adduser`
/usr/sbin/adduser: symbolic link to `useradd'
userdel
userdel即User Delete,刪除用戶,該命令用法較爲簡單:
userdel [options] USERNAME
[options]
-r 同時刪除家目錄,默認不會刪除
usermod
usermod爲User Modify,可用於更改用戶的屬性,用法爲:
usermod [options] USERNAME
[options]
-u 修改UID
-g 修改基本組
-G 修改附加組,如果用戶此前已經有附加組,修改後會覆蓋此前的附加組
-a -G 追加(append)附加組
-c 修改註釋信息
-d 修改家目錄,默認不會遷移用戶的家目錄,也不會創建指定目錄
-d -m 修改家目錄並且將原來目錄中的文件移動至修改後的目錄
-s 修改用戶shell
-l 修改用戶登錄名
-L 鎖定賬號,鎖定後無法登錄
-U 解鎖賬號
passwd命令也可以鎖定與解鎖賬戶
-e YYYY-MM-DD
指明用戶賬號過期日期
-f INACTIVE
設定賬戶非活動期限
passwd
passwd即Password,密碼之意,可用於更新用戶的認證信息(如密碼),用法如下:
passwd [OPTION] [USERNAME]
[OPTION]
--stdin 從標準輸入讀取用戶密碼
例:
echo "redhat" | passwd --stdin user3
-l 鎖定賬號
-u 解鎖賬號
賬戶鎖定後,/etc/shadow文件該賬戶對應條目密碼字段前會多一個感嘆號(!),可手動加上,以鎖定用戶
-e DATE 過期期限
-n mindays 指定最短使用期限
-x maxdays 最大使用期限
-w warndays 提前多少天開始警告
-i inactivedays 非活動期限
-d 刪除用戶密碼
紅帽系統會禁止空密碼用戶登錄
- 不帶參數的passwd命令可用於修改自己的密碼
- 只有管理員可以不輸入原始密碼而修改其他用戶的密碼
- 密碼複雜性策略
- 1、 使用4中類型字符(大寫字母,小寫字母,數字,特殊字符)中至少3種;
- 2、 足夠長,建議大於8位;
- 3、 使用隨機字符串;
- 4、 定期更換;
- 5、 循環週期要足夠大;
id
前文有提到,可使用id命令查看用戶信息:
id [OPTION]... [USER]
[OPTION]
-u 僅顯示有效的UID
-g 僅顯示基本組ID
-G 所有組的GID(包括基本組可附加組)
-r 顯示真實ID
-n 以上命令統與-n一起使用,則顯示名稱,而不是ID號
不帶參數的id命令可用於查看自己的信息,如:
[root@ ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
su
su即switch user,可用於切換用戶,在介紹命令用法之前,先介紹一下Shell類型。
站在用戶的角度,Shell分爲登錄式Shell與非登錄式Shell
- 登錄式Shell:正常通過某終端登錄
- 非登錄式Shell:圖形終端下打開的命令窗口(僞終端)、自動執行的shell腳本
su的選項:
su [options...] [-] [user [args...]]
[options]
-l:“su -l UserName”相當於“su - UserName”
-c 'COMMAND':僅以指定用戶的身份運行此處指定的命令
- 切換用戶的方式
- su UserName:非登錄式切換,即不會讀取目標用戶的配置文件;
- su - UserName:登錄式切換,會讀取目標用戶的配置文件;完全切換;
- Tips
- root su至其他用戶無須密碼;非root用戶切換時需要密碼;
- 換個身份執行命令
- su [-] UserName -c ‘COMMAND’
chage
chage以爲change age,可修改用戶的賬號過期信息
chage [options] USER
[options]
-d 最近一次修改時間(YYYY-MM-DD)
-E 賬號的過期(禁用)時間(YYYY-MM-DD)
-I 非活動時間,即用戶鎖定後允許用戶修改密碼的時間
-m 密碼最短使用期限
-M 密碼最長使用期限
-W 警告時長
-l 顯示用戶密碼過期信息
chsh
該命令可修改用戶的默認shell
whoami
查看自己的用戶名
pwck
驗證密碼文件的完整性
grpck
驗證組文件的完整性
chfn
修改用戶的註釋信息
5. 組管理相關命令
groupadd
groupadd可用於創建一個新組,用法爲:
groupadd [options] group
[options]
-g GID 指定GID,如不指定,則爲系統中最高GID+1
-r 添加爲系統組
如,創建用戶tom,指定UID爲5001,指定家目錄爲/tmp/tom, 指定shell爲/bin/zsh, 指定基本組爲tom,附加組爲jack
[root@localhost /]# groupadd jack
[root@localhost /]# groupadd tom
[root@localhost /]# useradd -u 5001 -d /tmp/tom -s /bin/zsh -g tom -G jack tom
創建用戶gentoo,附加組爲bin和root,默認shell爲/bin/csh,註釋信息爲“Gentoo Distribution”
[root@localhost /]# useradd -G bin,root -s /bin/csh -c "Gentoo Distribution" gentoo
groupdel
groupdel用於刪除用戶組
groupmod
groupmod可修改組信息,用法有groupadd相似:
groupmod [options] GROUP
[options]
-g GID 修改GID
-n GRPNAME 修改組名
gpasswd
gpasswd擁有給組添加密碼,用法:
gpasswd [OPTIONS] GROUPNAME
[OPTIONS]
-a USER 將USER添加至指定組中
-d USER 刪除用戶USER的以當前組爲組名的附加組
-A user1,user2,... 設置有管理權限的用戶列表
-M Set the list of group members.
- 說明:
- 1、 用戶創建的文件的屬組爲當前用戶的基本組
- 2、 用戶可以使用newgrp命令,將用戶的基本組臨時更換爲其他組
- newgrp GRPNAME
- 使用exit,可以退出臨時切換過去的組
- 如果用戶本不屬於此組,則需要組密碼
- 3、 若用戶的附加組中沒有該組,則需要輸入組密碼
newgrp
newgrp即new group,可臨時切換指定組爲用戶的基本組
nwegrp [-] [group]
-:會模擬用戶重新登錄以實現重新初始化其工作環境
6. 相關文件或目錄
用戶相關
/etc/passwd
該文件是用戶信息數據庫,每一行定義一個用戶。以root爲例,內容爲:
[root@ ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
該文件的每一行有7個字段,用於共同指定一個用戶的相關信息,中間使用半角冒號(:)分隔,依次爲用戶名、密碼、用戶ID、用戶私有組ID、用戶註釋、家目錄、用戶默認shell程序,即:
account:password:UID:GID:GECOS:directory:shell
字段 | 說明 |
---|---|
account | 登陸名 |
password | 可以是加密的密碼,也可以是佔位符(man 8 pwconv查看) |
UID | the numerical user ID |
GID | 基本組(私有組)ID |
GECOS | 可選的,用戶的註釋(comment)信息 |
directory | the user’s $HOME directory |
shell | 用戶的默認shell(/etc/shells指定了當前系統可用的安全shell) |
可使用man 5 passwd查看文件格式信息
/etc/shadow
該文件爲真正的密碼文件,主要保存認證口令,依然是每一行用於記錄一個用戶的信息,以root爲例,內容爲:
[root@ ~]# head -1 /etc/shadow
root:$6$ZoCI8lk/jgp94iAd$DoJAlzqhNm4rkITOB4Dk/C9xZIw2nyv6AwT6YFosfidI6g9bpEx1YrrRncQEpR9a97Z/m0WBuNer5ukS7znHc0:17884:0:99999:7:::
另外該文件還記錄了用戶密碼的使用時間,如用戶密碼的最長使用天數、用戶當前密碼已經使用的天數、賬戶的失效時間、密碼的非活動時間等,文件格式爲:
login name:encrypted password:date of last password change:minimum password age:maximum password age:password warning period:password inactivity period:account expiration date:reserved field
各部分說明如下
字段 | 說明 |
---|---|
login name | 登錄名 |
encrypted password | 加密後的密碼 |
date of last password change | 自1970.1.1至上次修改密碼經過的天數 |
minimum password age | 密碼最短使用天數 |
maximum password age | 密碼最長使用天數 |
password warning period | 密碼警告區間,即自上次修改密碼至密碼有效天數前的時間(天) |
password inactivity period | 密碼非活動區間,及在用戶密碼過期之後、禁用之前的天數 |
account expiration date | 賬戶過期時間,自1970.1.1至賬戶禁用的天數 |
reserved field | 保留字段 |
- 關於加密後的密碼(encrypted password)字段的說明:
- 該字段由3個$隔開,前兩個$中間的1表示使用md5加密,第二個與第三個$中間爲爲加密的密碼加的隨機字符串(salt,即雜質),第三個$後面的爲密碼
- 用戶在登登陸時,系統將用戶輸入的密碼中加入該雜質,計算後與passwd中的比較
加密方式的標識5
ID | Method |
---|---|
1 | MD5 |
2a | Blowfish (not in mainline glibc; added in some Linux distributions) |
5 | SHA-256 (since glibc 2.7) |
6 | SHA-512 (since glibc 2.7) |
可使用man 5 shadow查看該文件格式信息
加密算法介紹
- 對稱加密:加密和解密使用同一個密碼
- DES(data encryption standard),3DES,AES(Advanced Encryption Standard)
- 公鑰加密:每個密碼都成對出現,一個爲公鑰(public key),一個爲私鑰(secret key)
- DSA(Digital Signature Algorithm),RSA
- 單向加密,散列加密:也叫指紋加密,提取數據特徵碼,只能由明文(數據)得到密文,不可逆。常用於數據完整性校驗
- MD5,Message-Digest Algorithm 5,信息摘要
- SHA1,Secure Hash Algorithm,安全hash算法
此處簡單說明單向加密
- 單項加密特點:
- 1、 雪崩效應:即初始條件的微小改變,將會引起結果的巨大變化;
- 2、 定長輸出;注意:輸出的是16進制數字,而不是字符
- 常用的單項加密:
- MD5: Message Digest,128位定長輸出,由麻省理工學院人工智能實驗室研發
- SHA1: Secure Hash Algorithm,160 位定長輸出
- SHA224: 224位定長輸出
- SHA256: 256位定長輸出
- SHA384: 384位定長輸出
- SHA512: 512位定長輸出
/etc/default/useradd
在/etc/default/useradd中定義了useradd命令的相關默認信息,以下爲該文件內容:
[root@ ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
useradd使用-D選項修改的內容將保存於該文件中
用戶的當前shell保存在環境變量SHELL中
/etc/skel/目錄
/etc/skel/中有一些環境配置文件
- .bash_profile 登錄時應用的用戶配置文件
- .bashrc 切換shell時應用的用戶配置文件
- .bash_logout 註銷時應用的用戶配置文件
/etc/login.defs
/etc/login.defs文件中有PASS_MAX_DAYS, PASS_MIN_DAYS, PASS_MIN_LEN, PASS_WARN_AGE, UID與GID的最大最小數等默認參數
用戶管理相關配置文件總結
File | Description6 |
---|---|
/etc/passwd | User account information. |
/etc/shadow | Secure user account information. |
/etc/group | Group account information. |
/etc/gshadow | Secure group account information. |
/etc/default/useradd | Default values for account creation. |
/etc/skel/ | Directory containing default files. |
/etc/login.defs | Shadow password suite configuration. |
組相關
/etc/group
該文件存儲了組名與GID的映射關係,依然是使用冒號分隔,每行定義一個組,格式爲:
- group_name:password:GID:user_list
- group_name:組名
- password:密碼,一般爲密碼佔位符
- GID:組ID
- user_list:以此組爲附加組的用戶列表(用戶的基本在保存於/etc/passwd)
/etc/gshadow
該文件與/etc/shadow類似,保存加密後的組密碼,使用冒號分隔,每行定義一個組:
group name:encrypted password:administrators:members