Linux基礎命令

本文主要內容爲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連接

由於這裏使用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,則此處爲+,否則爲.
  • 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 控制符結束
    • 多個控制符使用分號隔開

如:

[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

echo

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命令可以使用+或-來設置或取消相關選項
  • >> 追加輸出

  • 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

如圖,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
      • 系統用戶對守護進程獲取系統資源進行權限分配,不允許登陸系統
  • 一般用戶: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


  1. 這裏暫不考慮特殊權限,關於特殊權限後續將詳細介紹 ↩︎

  2. 關於用戶管理類命令後文將介紹 ↩︎

  3. 這部分的“^”意爲Ctrl鍵,如^F表示Ctrl+F。 ↩︎

  4. 後續將詳細介紹 ↩︎

  5. 可使用man 3 crypt查看 ↩︎

  6. 表格摘自USERADD(8)-FILES ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章