Linux 是一個多用戶分時系統,想要使用系統資源,就必須在系統中有合法的賬號,每個賬號都有一個唯一的用戶名,同時必須設置密碼。
Linux 用戶和用戶組
UID 和 GID
事實上,Linux 系統采用一個 32 位的整數記錄和區分不同的用戶,這意味著系統可以記錄多達40億個不同的用戶。這個用來區分不同用戶的數字被稱為 User ID ,簡稱 UID。系統會自動記錄“用戶名”和“UID” 的對應關系。
Linux 系統中的用戶分為3類,即普通用戶、根用戶、系統用戶。
用戶登錄 | 權限 |
---|---|
普通用戶 | 只能在其家目錄、系統臨時目錄或其他經過授權的目錄中操作,以及屬于該用戶的文件,通常普通用戶的UID大于500,從500開始編號。 |
根用戶 | 即ROOT用戶,它的ID是0,也被稱為超級用戶,擁有對系統的完全控制權。 |
系統用戶 | 系統用戶指系統運行時必須有的用戶,但并不是指真的使用者。比如在RedHat 或 CentOS 下運行網站服務時,需要使用系統用戶 Apache 來運行 httpd 進程,而運行 Mysql 數據庫服務時,需要使用系統用戶 mysql 來運行 mysql 進程。系統用戶的ID范圍是 1-499。 |
用戶組
在Linux系統中除了有用戶之外,還有“用戶組”的概念,不同的用戶組同樣也是用數字來區分的,這種用于區分不同用戶組的ID被稱為Group ID ,也就是GID。
查看ID
id
查看組
groups
配置文件
記錄用戶和用戶的配置文件
新增用戶
useradd UserName
對于系統來說,完成這個命令需要在后臺執行很多行為。
- 將用戶信息記錄在 /etc/passwd 中,一般會在 /etc/password 和 /etc/shadow 兩個配置文件末尾追加一條記錄,同時會分配給該用戶一個UID。
- 接著,要為該用戶自動創建家目錄。家目錄以創建的用戶名為目錄名,創建的路徑在/home 目錄中。
- 然后,復制 /etc/skel 下所有的文件至 /home/john 。說明一下,如果你使用
ls -l /etc/skel
命令查看,可以發現這個目錄下,什么也沒有,但事實上,該目錄下有很多隱藏文件,用戶ls -la /etc/skel
可以查看。
- 最后,新建一個與該用戶名一樣的用戶組,也就是說創建一個用戶的同時,也創建了一個與用戶名相同的用戶組,而用戶默認屬于這個用戶組。
可以說,/etc/skel 實際上是創建用戶時的"模板"。
可以在創建用戶的時候指定UID和GID
useradd -u UID UserName
useradd -g GroupName UserName
還可以使用-d
參數指定該用戶的家目錄,而不是使用系統默認的家目錄。
useradd -d /home/DirName UserName
設置密碼
passwd UserName
更改用戶信息
更改家目錄
usermod -d NewDir -m UserName
鎖定/解鎖用戶
usermod -L UserName
usermod -U UserName
其實 usermod 命令就是對 /etc/passwd 和 /etc/shadow 文件做一些修改而已。明白了這個道理之后,就算不實用這個命令依然可以手工對用戶進行修改操作。
刪除用戶
userdel UserName
使用這個命令可以刪除用戶在 /etc/passwd 和 /etc/shadow 中的記錄。但是從數據安全方面考慮,默認情況下,刪除用戶并不會刪除用戶的家目錄和郵件信息。可以使用-r參數刪除用戶家目錄和用戶的郵件。
一旦執行了這條命令,該用戶的相關文件就會被全部刪除。
新增和刪除用戶組
新增用戶組
groupadd GroupName
在Linux中,使用 /etc/group 文件來記錄用戶組。
刪除用戶組
groupdel GroupName
這里需要注意的是,如果已有用戶屬于這個試圖刪除的組,該操作會失敗。
檢查用戶信息
查看用戶
users // 查看當前系統有哪些用戶
從截圖中發現有多個 ROOT 在當前機器中登錄。實際上, Linux會把來自不同終端的活動定義為一個會話,從 who 命令的輸出,可以看出 root 用戶是通過不同的終端登錄到系統中的。users 命令相對比較簡單,所以列出的信息也比較少,可以使用命令 who 來看到更多的信息。
命令顯示的結果有3列,第一列是登錄用戶的用戶名,第二列是用戶登錄的終端,第三列是用戶登錄的時間。如果是通過遠程網絡登錄,則同時會顯示遠程主機的主機名或IP地址。還可以使用命令 w 看到更詳細的信息。
列 | 解釋 |
---|---|
1 | 登錄用戶的用戶名 |
2 | 用戶登錄的終端 |
3 | 如果用戶從網絡登錄,則顯示遠程主機的主機名或IP地址 |
4 | 用戶登錄的時間 |
5 | 用戶閑置的時間 |
6 | 與終端用戶的當前所有運行進程消耗的CPU時間總量 |
7 | 當前WHAT列所對應的進程所消耗的CPU時間總量 |
8 | 用戶當前運行的進程 |
調查用戶
finger
如果發現沒有該命令,需要安裝:
yum install finger
切換用戶
在使用Linux的過程中,很多時候由于實際需要可能要在不同的用戶之間切換。比如原本是使用普通用戶登錄的,但是在操作的過程中由于權限原因必須使用 root 用戶來做一些操作,這時就需要臨時切換成 ROOT 用戶。操作完成之后,再推出切換成普通用戶。涉及到兩種方法:su 和 sudo 。
切換成其他用戶
su - UserName
如果不加參數,默認切換到 root 用戶。完成操作之后,使用 exit 命令可以退出root切換到用來的用戶。
su 命令后面還可以加上一個"-" 參數,就是鍵盤上的中橫線。加上這個參數之后,切換成 root 的用戶環境。所謂"用戶環境"就是 /etc/passwd 中定義的家目錄、使用的 Shell,以及關于這個用戶的個性化設置等。
su 命令雖然方便,但還是有明顯的缺陷,就是切換成其他用戶要知道其密碼。如果需要切換成 root ,那就要知道 root 的密碼。我們知道,root 是系統中權限最高的用戶,如果讓太多人知道 root 密碼,必然是很不安全的。為解決這個問題,我們可以使用 sudo 命令。
用其他用戶的身份執行命令
sudo command // 使用 root 身份執行命令
運行該命令的時候,系統首先檢查 /etc/sudoers,判斷該用戶是否有執行 sudo 的權限,在確認有執行權限之后,系統要求用戶輸入自己的密碼,如果密碼輸入正確,則會使用 root 用戶的身份運行 passwd UserName 命令。
使用 visudo 命令來修改 /etc/sudoers 配置文件,它可以自動檢查語法。
加入 "username ALL =(ALL)ALL" 這一行代表的意思是,john 這個用戶可以從任何地方登陸后執行任何人的任何命令。還可以定義某一組的 sudo 權限,比如 "%username ALL=(ALL)ALL" 可以讓所有屬于 john 用戶組的用戶從任何地方登陸后執行任何人的任何命令。
假設用戶由于工作需要,經常要重啟或者關閉服務器,那么就可以進行如下設置:
username ALL=(ALL) NOPASSWD:/sbin/shutdown,/usr/bin/reboot
嚴格來說,sudo 并不是真的切換了用戶,而是使用其他用戶的身份和權限執行了命令。
執行任務管理
日常生活中常會有例行性的事情,比如說每周工作日的鬧鐘、每年一次的生日提醒等。還有一些事情是偶發性的,比如突然需要處理一封緊急的郵件等。在Linux中也有處理這兩種任務的方法。**如果任務是周期性執行的,其命令為 cron;如果只是在某一個特定的時間執行一次,其命令為 at **。
單一時刻執行一次任務
定時關機
第一行是定義從現在開始計算,30分鐘后安排一個任務;
第二行是到了時間后執行關機操作;
第三行是<EOT>,這不是鍵盤輸入的,而是使用了組合鍵 Ctrl+D ,表示輸入結束。
第四行是系統提示有一個任務將于該時間執行。
atq // 查看當前使用 at 命令調度的任務列表
也可以使用如下命令刪除已經進入任務隊列的任務
atrm id
使用 at 還可以安排在具體的時間執行任務
默認情況下,所有用戶都可以使用 at 命令來調度自己的任務,如果由于特殊的原因需要禁止某些用戶使用這個功能,可以將該用戶的用戶名添加至 /etc/at.deny 中。
周期性執行任務 cron
首先要確定crond進程在運行,如果沒有運行,需要先啟動該進程。
該命令的執行環境為 CentOS 7
用戶可以使用 crontab 來設置自己的計劃任務,并使用-e參數來編輯任務。在這之前需要先了解一下設置的語法,但使用 crontab -e 進入編輯模式時,需要編輯執行的時間和執行的命令。
在下面的示例中,前面5個*
可以用來定義時間:
序號 | 含義 | |
---|---|---|
1 | 分鐘 | 1-59 |
2 | 小時 | 0-23 |
3 | 日期 | 1-31 |
4 | 月份 | 1-12 |
5 | 星期幾 | 0-6 |
舉例
crontab -e
// 以下兩種寫法其實是一致的,都是每分鐘重啟 httpd 進程。
* * * * * systemctl restart httpd.services
*/1 * * * * systemctl restart httpd.services
// 每小時重啟 httpd 進程
* 23-3/1 * * * systemctl restart httpd.services
// 每天晚上23點30分重啟 httpd 進程
30 23 1 * * systemctl restart httpd.services
刪除所有的任務
crontab -r
禁止某用戶使用該功能
vim /etc/cron.deny
root 可以使用 -u 查看指定用戶的任務
crontab -u UserName -l
/etc/crontab 的管理
用戶可以通過 crontab -e 命令來編輯定義自己的任務,事實上,系統也有自己的例行任務,而其配置文件是 /etc/crontab 。