FHS、bash與用戶權限

本文主要內容:FHS,文本查看、文件與目錄管理命令,Bash特性,包括管道、重定向、命令歷史、別名、變量等,以及Globbing,用戶與權限管理。

文章目錄

一、FHS

0. 文件系統概念

計算機實質上就是處理數據的設備,這些數據在存儲介質中是以文件(File)的形式存在的,而具體該如何保存,以及如何對硬件進行邏輯抽象管理,使其可以保存,就是文件系統的功能之一。

計算機的文件系統是一種存儲和組織計算機數據的方法,它使得對其訪問和查找變得容易,文件系統使用文件和樹形目錄的抽象邏輯概念代替了硬盤和光盤等物理設備使用數據塊的概念,用戶使用文件系統來保存數據不必關心數據實際保存在硬盤(或者光盤)的地址爲多少的數據塊上,只需要記住這個文件的所屬目錄和文件名。在寫入新數據之前,用戶不必關心硬盤上的那個塊地址沒有被使用,硬盤上的存儲空間管理(分配和釋放)功能由文件系統自動完成,用戶只需要記住數據被寫入到了哪個文件中。

廣義角度來講,Linux系統是有底層的Kernel與上層Application組成。其在計算機啓動之前也是以文件的形式存在於外存中,而這些文件保存在外存(以下稱爲磁盤)的何處位置,Linux的衆多發行組織均可以自定義。如此對於用戶的學習和使用而言是極爲不便的,亦不利於其傳播。鑑於此,Linux Foundation(Linux基金會)定義了Linux發行版中,文件所應該遵從的組織方式,即FHS(Filesystem Hierarchy Standard,文件系統層級標準) 1

1. 根文件系統

該規範說明了系統上應該存在哪些目錄,以及不同文件所應該保存的位置,以下爲簡要說明

目錄 說明
/bin 所有用戶可用的基本命令程序文件
/boot 引導加載器必須用到的各靜態文件,如kernel、ramfs(initrd),以及grub(bootloader)等
/dev 設備文件與特殊文件
/etc 系統程序的靜態配置文件
/home 普通的家目錄的集中位置;一般每個普通用戶的家目錄默認爲此目錄下與用戶名同名的子目錄
/lib 爲系統啓動或根文件系統上的應用程序(/bin,/sbin等)提供共享庫,以及爲內核提供內核模塊
/lib64 特定字長系統上的庫文件,如64位系統上爲/lib64
/media 掛載點目錄,通常用來掛載移動設備
/mnt 掛載點目錄,通常掛載額外的臨時文件系統
/opt, /options 附加應用程序的安裝位置,可選
/proc 虛擬文件系統,用於爲內核及進程存儲其相關信息
/root 管理員的家目錄,可選
/run 存放動態的,不持久的應用程序運行數據
/sbin 供管理員使用的工具程序
/srv 系統上運行的服務用到的數據
/sys sysfs虛擬文件系統提供了一種比proc更爲理想的訪問內核數據的途徑;其主要作用在於爲管理Linux設備提供一種統一模型的的接口
/tmp 臨時文件
/usr 全局共享的只讀數據路徑
/var 頻繁發生變化的文件
/misc 備用目錄,可選
/selinux SELinux(Security Enhanced Linux)相關的安全策略等信息的存儲位置
[root@localhost ~]# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

2. /usr目錄層級

usr意爲universal shared read-only file,全局共享只讀文件,即該目錄可以在所有遵循FHS的主機間共享(只讀)

目錄 說明
/usr/include C程序頭文件
/usr/bin 普通用戶命令
/usr/sbin 供管理員使用的命令
/usr/lib 庫文件
/usr/lib<qual> 特定字長系統上的庫文件,如64位系統上爲/usr/lib64
/usr/share 命令手冊也和自帶文檔等架構特有的文件的存儲位置,例如doc, man等
/usr/X11R6 X-Window程序的安裝位置(可選)
/usr/src 程序源碼文件的存儲位置
/usr/local 第三方軟件的安裝路徑,也是一個獨立層級
/usr/games 遊戲或教育程序

/usr/local:local目錄層級

該目錄也是一個獨立的層級,其中有bin,sbin等目錄,如下內容引用自 https://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html#USRLOCALLOCALHIERARCHY

The /usr/local hierarchy is for use by the system administrator when installing software locally. It needs to be safe from being overwritten when the system software is updated. It may be used for programs and data that are shareable amongst a group of hosts, but not found in /usr.
Locally installed software must be placed within /usr/local rather than /usr unless it is being installed to replace or upgrade software in /usr.

Directory Description
bin Local binaries
etc Host-specific system configuration for local binaries
games Local game binaries
include Local C header files
lib Local libraries
man Local online manuals
sbin Local system binaries
share Local architecture-independent hierarchy
src Local source code

3. /var目錄層級

/var contains variable data files. This includes spool directories and files, administrative and logging data, and transient and temporary files.
Some portions of /var are not shareable between different systems. For instance, /var/log, /var/lock, and /var/run. Other portions may be shared, notably /var/mail, /var/cache/man, /var/cache/fonts, and /var/spool/news.
/var is specified here in order to make it possible to mount /usr read-only. Everything that once went into /usr that is written to during system operation (as opposed to installation and software maintenance) must be in /var.
If /var cannot be made a separate partition, it is often preferable to move /var out of the root partition and into the /usr partition. (This is sometimes done to reduce the size of the root partition or when space runs low in the root partition.) However, /var must not be linked to /usr because this makes separation of /usr and /var more difficult and is likely to create a naming conflict. Instead, link /var to /usr/var.
Applications must generally not add directories to the top level of /var. Such directories should only be added if they have some system-wide implication, and in consultation with the FHS mailing list.2

目錄 說明
/var/log 日誌目錄及文件
/var/lock 鎖文件
/var/run 運行中的進程相關的數據,通常用於存放進程的PID文件
/var/cache 應用程序緩存數據目錄
/var/lib 應用程序狀態信息數據
/var/local 專用於爲/usr/local下的應用程序存儲可變數據
/var/opt 專用於爲/opt下的應用程序存儲可變數據
/var/spool 應用程序數據池
/vat/tmp 保存系統兩次重啓之間產生的臨時數據

4. /sys目錄內容

/sys 下的子目錄 所包含的內容
/sys/devices 這是內核對系統中所有設備的分層次表達模型,也是 /sys 文件系統管理設備的最重要的目錄結構,下文會對它的內部結構作進一步分析;
/sys/dev 這個目錄下維護一個按字符設備和塊設備的主次號碼(major:minor)鏈接到真實的設備(/sys/devices下)的符號鏈接文件,它是在內核 2.6.26 首次引入;
/sys/bus 這是內核設備按總線類型分層放置的目錄結構, devices 中的所有設備都是連接於某種總線之下,在這裏的每一種具體總線之下可以找到每一個具體設備的符號鏈接,它也是構成 Linux 統一設備模型的一部分;
/sys/class 這是按照設備功能分類的設備模型,如系統所有輸入設備都會出現在 /sys/class/input 之下,而不論它們是以何種總線連接到系統。它也是構成 Linux 統一設備模型的一部分;
/sys/block 這裏是系統中當前所有的塊設備所在,按照功能來說放置在 /sys/class 之下會更合適,但只是由於歷史遺留因素而一直存在於 /sys/block, 但從 2.6.22 開始就已標記爲過時,只有在打開了 CONFIG_SYSFS_DEPRECATED 配置下編譯纔會有這個目錄的存在,並且在 2.6.26 內核中已正式移到 /sys/class/block, 舊的接口 /sys/block 爲了向後兼容保留存在,但其中的內容已經變爲指向它們在 /sys/devices/ 中真實設備的符號鏈接文件;
/sys/firmware 這裏是系統加載固件機制的對用戶空間的接口,關於固件有專用於固件加載的一套API,在附錄 LDD3 一書中有關於內核支持固件加載機制的更詳細的介紹;
/sys/fs 這裏按照設計是用於描述系統中所有文件系統,包括文件系統本身和按文件系統分類存放的已掛載點,但目前只有 fuse,gfs2 等少數文件系統支持 sysfs 接口,一些傳統的虛擬文件系統(VFS)層次控制參數仍然在 sysctl (/proc/sys/fs) 接口中中;
/sys/kernel 這裏是內核所有可調整參數的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的 slab 分配器等幾項較新的設計在使用它,其它內核可調整參數仍然位於 sysctl (/proc/sys/kernel) 接口中 ;
/sys/module 這裏有系統中所有模塊的信息,不論這些模塊是以內聯(inlined)方式編譯到內核映像文件(vmlinuz)中還是編譯爲外部模塊(ko文件),都可能會出現在 /sys/module 中:
● 編譯爲外部模塊(ko文件)在加載後會出現對應的 /sys/module/<module_name>/, 並且在這個目錄下會出現一些屬性文件和屬性目錄來表示此外部模塊的一些信息,如版本號、加載狀態、所提供的驅動程序等;
● 編譯爲內聯方式的模塊則只在當它有非0屬性的模塊參數時會出現對應的 /sys/module/<module_name>, 這些模塊的可用參數會出現在 /sys/modules//parameters/<param_name> 中,
●● 如 /sys/module/printk/parameters/time 這個可讀寫參數控制着內聯模塊 printk 在打印內核消息時是否加上時間前綴;
●● 所有內聯模塊的參數也可以由 “<module_name>.<param_name>=” 的形式寫在內核啓動參數上,如啓動內核時加上參數 “printk.time=1” 與 向 “/sys/module/printk/parameters/time” 寫入1的效果相同;
● 沒有非0屬性參數的內聯模塊不會出現於此。
/sys/power 這裏是系統中電源選項,這個目錄下有幾個屬性文件可以用於控制整個機器的電源狀態,如可以向其中寫入控制命令讓機器關機、重啓等。
/sys/slab (對應 2.6.23 內核,在 2.6.24 以後移至 /sys/kernel/slab) 從2.6.23 開始可以選擇 SLAB 內存分配器的實現,並且新的 SLUB(Unqueued Slab Allocator)被設置爲缺省值;如果編譯了此選項,在 /sys 下就會出現 /sys/slab ,裏面有每一個 kmem_cache 結構體的可調整參數。對應於舊的 SLAB 內存分配器下的 /proc/slabinfo 動態調整接口,新式的 /sys/kernel/slab/<slab_name> 接口中的各項信息和可調整項顯得更爲清晰。3

5. 其他說明

設備文件

  • 塊設備(b)
  • 字符設備(c)
  • 設備號:對設備文件使用ls -l查看時,顯示文件大小的位置顯示爲2個數字,即主設備號(major number)與次設備號(minor number)
    • 主設備號,用於標識設備類型,進而確定要加載的驅動程序
    • 次設備號,用於標識同一類型中的不同的設備;

如:

[root@localhost ~]# ls -l /dev
total 0
crw-rw----. 1 root video    10, 175 Dec 28 22:21 agpgart
crw-------. 1 root root     10, 235 Dec 28 22:21 autofs
drwxr-xr-x. 2 root root         180 Dec 28 22:21 block
drwxr-xr-x. 2 root root          80 Dec 28 22:21 bsg
crw-------. 1 root root     10, 234 Dec 28 22:21 btrfs-control
drwxr-xr-x. 3 root root          60 Dec 28 22:21 bus
lrwxrwxrwx. 1 root root           3 Dec 28 22:21 cdrom -> sr0
drwxr-xr-x. 2 root root         100 Dec 28 22:21 centos
drwxr-xr-x. 2 root root        3060 Dec 28 22:21 char
crw-------. 1 root root      5,   1 Dec 28 22:21 console
lrwxrwxrwx. 1 root root          11 Dec 28 22:21 core -> /proc/kcore
drwxr-xr-x. 6 root root         140 Dec 28 22:21 cpu

/etc中常見目錄

  • /etc/opt:/opt下程序的配置文件
  • /etc/sysconfig: 系統級別應用配置
  • /etc/init.d: 系統服務腳本
  • /etc/X11:X協議相關配置文件
  • /etc/sgml:SGML相關配置文件
  • /etc/xml:XML相關配置文件

庫文件

  • 在/lib與/lib64中保存有共享庫文件
  • 靜態庫:.a文件,直接鏈接到程序的地址空間中,作爲程序的一部分額運行,便於程序單獨管理
  • 動態庫:.so(shared object)文件,即使有多個程序要使用,在內存中也只有一份
  • libc.so.*:動態鏈接的C庫
  • ld*:運行時鏈接器/加載器
  • modules:內核模塊文件存儲目錄

Linux上的應用程序的組成部分總結

  • 二進制程序: /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
  • 庫文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, usr/local/lib64
  • 配置文件:/etc, /etc/DIRECTORY, /usr/local/etc
  • 幫助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc

二、一些基礎命令

1. 目錄與文件管理命令

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,當源文件爲連接文件時,複製鏈接文件本身而非其指向的源文件

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		創建目錄時直接指定權限

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等默認都爲管理員用戶設置了命令別名4,用作提醒。

另外,建議所有不用的文件建議不要直接刪除,而是移動至某個專用目錄(模擬回收站)

2. 文本查看命令

cat、tac

這兩個命令之前已有介紹,這裏爲了內容完整在此處列出,詳見 https://blog.csdn.net/xiyangyang410/article/details/85043737#cat_458

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	顯示文件尾部,不退出,等待顯示後續追加至此文件的新內容,通常用來監視日誌

more

more意爲更多的,其命令手冊解釋爲: file perusal filter for crt viewing,可用於顯示文本文件,命令使用方式同man命令。與之不同的是,該命令在文件顯示至尾部後,將會自動退出。

less

less命令的同發與man命令相同,這裏不再贅述。

  • less與more的不同之處在於less命令在顯示到文件尾部後不會自動退出,而more將會自動退出

三、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,…用於讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
特殊變量 保存某些特殊數據5
特殊變量
$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文件中的小寫字母轉換成大寫

tee

tee

如圖,tee命令可將數據流分爲“兩份”,一份發送到標準輸出,另一份可通過重定向輸出到文件。

/dev/zero

/dev/null是使用軟件模擬的特殊的設備文件

該設備被稱爲bit bucket,它就像一個垃圾桶,丟進去的數據都會消失。那這個設備有什麼用呢?

我們知道程序的執行結果又兩種,一種是正常的返回結果,另一種是程序的執行狀態結果,用於標識程序是否正常執行。例如我們想知道用戶“user1”是否存在,可以使用id命令6,而我們並不關心其本身信息,只是通過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. 基礎概念

數據是以文件的形式存儲在磁盤上,除了文件的數據(Data)本身,在存儲時還會保存一些其他信息,即元數據(Metadata)7,時間戳信息就是其中之一。

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指定若文件不存在也不創建。

五、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			添加爲系統組

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中的比較

加密方式的標識8

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 Description9
/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. 基礎概念

進程的安全上下文(Secure Context)

進程是用戶操作計算機的代理,進程運行時,是以發起者的身份運行,進程能範圍內那些文件,取決於進程本身的權限以及發起者的權限

權限應用模型

  • 進程的屬主,是否與文件的屬主相同:若相同,進程則以文件屬主的權限來訪問文件,否則
  • 進程的屬主所屬的組,是否其中之一與文件的屬組相同,若相同,進程則以文件屬組的權限來訪問文件,否則
  • 進程則以文件的其他用戶的權限來訪問文件

權限

Linux權限有三種

讀(Read),以r標識

寫(Write),以w標識

執行(eXecute),以x標識

應用方式
文件
r: 可獲取文件的數據,如可以使用類似cat等內容查看命令查看文件內容;
w: 可修改文件的數據,如可以使用編輯器修改其內容;
x: 可以在命令提示符下當做命令提交給內核運行,即可以將其發起一個進程;
目錄
r: 可以對此目錄執行ls以列出內部的所有文件;
w: 可修改此目錄下的文件列表,即可以在此目錄中創建、刪除文件;
x: 可以使用cd切換進此目錄,也可以使用ls -l查看目錄內容的文件信息;
表示方式

在使用ls -l查看文件信息時,可以看到文件權限有三組10,分別對應屬主、數組、其他用戶。每一組有三位,用於標識是否具有該權限,即每一位的變化有兩種,如此每一位可以使用一位二進制數字表示,每一組可以使用一位8進制數字表示,對應關係如下

權限位 二進制 八進制 意義
--- 000 0 無權限
--x 001 1 執行
-w- 010 2
-wr 011 3 寫,執行
r-- 100 4
r-x 101 5 讀,執行
rw- 110 6 讀,寫
rwx 111 7 讀,寫,執行

該位上有對應權限則爲1,沒有則爲0,遂用三組八進制數字表示,分別表示屬主、屬組、其他用戶的權限,如:

字符表示 二進制表示 八進制表示
rw-r----- 110100000 640
rwxr-xr-x 111101101 755
rw-rw---- 110110000 660
rwxrwxr-x 111111101 775

2. 權限掩碼

什麼是權限掩碼

我們知道,一個文件(或目錄)若所有用戶都有權限進行所有操作,則爲777,若所有用戶都沒有權限進行任何操作,則爲000,然而在創建文件的時候,權限爲644,這是爲什麼呢?

在我們進行創建的時候,系統將待創建對象的所有權限位置爲1,而由於默認給一個文件執行權限是非常危險的,故在創建目錄與文件時,默認給定的最大權限不同:

  • 文件:666
  • 目錄:777

但是如此的默認權限給定方式顯然也是不合適的,故有了權限掩碼(Mode Mask) 的概念。掩碼,也叫遮罩碼,即爲遮擋之意。

  • 創建文件時,默認權限爲666 - 權限掩碼
  • 創建目錄時,默認權限爲777 - 權限掩碼

由於管理員與普通用戶的權限不同,其默認的權限掩碼也不相同,可使用umask命令查看

umask

umask是一個內部命令,用於顯示或設置用戶的權限掩碼

由於設置權限掩碼的命令名爲umask,故我們也將權限掩碼稱爲umask

不帶參數的umask命令可以查看當前用戶的umask

[root@localhost ~]# umask
0022
[root@localhost ~]# useradd user1
[root@localhost ~]# su user1
[user1@localhost ~]$ umask
0002
[user1@localhost ~]$ exit
logout
[root@localhost ~]# groupadd group1
[root@localhost ~]# useradd -g group1 user2
[root@localhost ~]# su user2
[user2@localhost root]$ umask
0022

返回4位數字,最高位爲特殊權限的掩碼,這裏暫且不論11

由直接結果可知,管理員的umask默認爲022,普通用戶的默認umask:

  • 若用戶名與其基本組組名相同,umask爲002
  • 若用戶名與其基本組組名不同,umask爲022

有如下例子:

[user1@localhost ~]$ clear
[user1@localhost ~]$ id
uid=1000(user1) gid=1000(user1) groups=1000(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[user1@localhost ~]$ umask 023
[user1@localhost ~]$ touch test.file
[user1@localhost ~]$ ll test.file
-rw-r--r--. 1 user1 user1 0 Dec 30 20:27 test.file
問題描述
umask設定爲023,而普通用戶在創建文件時,應使用666-023,故默認權限應爲643,而此處爲644?
原因
文件創建時,默認沒有執行權限,若通過umask計算出來有,則爲其權限+1

3. 權限管理命令

chown

chown意爲change owner,可用於修改文件的屬主或屬組,用法如下:

# chown USERNAME file,...			修改屬主

# chown :GRPNAME file,...			修改屬組
# chown .GRPNAME file,...			修改屬組

# chown USERNAME:GRPNAME file,...	修改屬主屬組
# chown USERNAME.GRPNAME file,...	修改屬主屬組

參數
	-R		遞歸修改,修改目錄及其內部文件的屬主
	--reference=/PATH/TO/SOMEFILE file,...
			reference,參考,將file的屬主屬組設置爲與/PATH/TO/SOMEFILE相同

只有管理員纔可以執行此命令

chgrp

chgrp爲change group之意,用於修改文件的屬組,用法爲:

chgrp [OPTION]... GROUP FILE...
	[OPTION]
		--reference=RFILE
			參考目標文件的屬組設定

chmod

chmod意爲change mode,用於修改文件的權限信息,用法爲:

chmod [OPTION]... MODE[,MODE]... FILE...
	操作三類用戶的權限,使用8進制形式
		例:	chmod 775 /tmp/abc
				(75==075, 5==005)
	
chmod [OPTION]... OCTAL-MODE FILE...
	操作指定類別用戶的權限,使用u,g,o,a來賦權,可以基於=或+/-來進行
	
[OPTION]... 
	--reference=RFILE FILE...
		參照其他文件的權限爲當前文件賦權
			
	-R: 遞歸修改,修改目錄及其內部文件的權限(目錄下的符號鏈接除外)

chmod [USER_TYPE]+|-|=MODE file,...
	修改某類用戶或某些用戶權限
		[USER_TYPE]
			u: owner 屬主
			g: group 屬組
			o: other 其他用戶
			a: all 所有用戶

		=:操作指定類別用戶的權限
		+/-:操作指定類別用戶的單個權限
	例:
		chmod o=rx /tmp/abc	 修改其他用戶的權限爲r-x
		chmod gu=rx /tmp/abc 修改屬主屬組的權限爲r-x
		chmodu-x /tmp/abc 去掉屬主的執行權限
		chmod u+x,g-x /tmp/abc
		chmod a+x /tmp/abc 修改三類用的權限(此處爲加執行權限)
			a可以省略,寫成chmod +x /tmp/abc 

  1. 目前的最新版爲FHS3.0,詳見 https://refspecs.linuxfoundation.org/fhs.shtml ↩︎

  2. 引用自 https://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html#THEVARHIERARCHY ↩︎

  3. 表格內容引用自 https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/ ↩︎

  4. 後文會詳細介紹命令別名 ↩︎

  5. 關於特殊變量後續會詳細介紹 ↩︎

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

  7. 後續將詳細介紹 ↩︎

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

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

  10. 詳見 https://blog.csdn.net/xiyangyang410/article/details/85043737#ls_387 ↩︎

  11. 後續將介紹 ↩︎

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