系統基礎-用戶管理

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。

image

查看ID

id

查看組

groups

配置文件

記錄用戶和用戶的配置文件

image

新增用戶

useradd UserName

對于系統來說,完成這個命令需要在后臺執行很多行為。

  • 將用戶信息記錄在 /etc/passwd 中,一般會在 /etc/password 和 /etc/shadow 兩個配置文件末尾追加一條記錄,同時會分配給該用戶一個UID。
image
  • 接著,要為該用戶自動創建家目錄。家目錄以創建的用戶名為目錄名,創建的路徑在/home 目錄中。
image
  • 然后,復制 /etc/skel 下所有的文件至 /home/john 。說明一下,如果你使用ls -l /etc/skel 命令查看,可以發現這個目錄下,什么也沒有,但事實上,該目錄下有很多隱藏文件,用戶 ls -la /etc/skel 可以查看。
image
  • 最后,新建一個與該用戶名一樣的用戶組,也就是說創建一個用戶的同時,也創建了一個與用戶名相同的用戶組,而用戶默認屬于這個用戶組。

可以說,/etc/skel 實際上是創建用戶時的"模板"。

可以在創建用戶的時候指定UID和GID

useradd -u UID UserName
useradd -g GroupName UserName

還可以使用-d參數指定該用戶的家目錄,而不是使用系統默認的家目錄。

useradd -d /home/DirName UserName

設置密碼

passwd UserName
image

更改用戶信息

更改家目錄

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 文件來記錄用戶組。

image

刪除用戶組

groupdel GroupName

這里需要注意的是,如果已有用戶屬于這個試圖刪除的組,該操作會失敗。

檢查用戶信息

查看用戶

users       // 查看當前系統有哪些用戶
image

從截圖中發現有多個 ROOT 在當前機器中登錄。實際上, Linux會把來自不同終端的活動定義為一個會話,從 who 命令的輸出,可以看出 root 用戶是通過不同的終端登錄到系統中的。users 命令相對比較簡單,所以列出的信息也比較少,可以使用命令 who 來看到更多的信息。

image

命令顯示的結果有3列,第一列是登錄用戶的用戶名,第二列是用戶登錄的終端,第三列是用戶登錄的時間。如果是通過遠程網絡登錄,則同時會顯示遠程主機的主機名或IP地址。還可以使用命令 w 看到更詳細的信息。

image
解釋
1 登錄用戶的用戶名
2 用戶登錄的終端
3 如果用戶從網絡登錄,則顯示遠程主機的主機名或IP地址
4 用戶登錄的時間
5 用戶閑置的時間
6 與終端用戶的當前所有運行進程消耗的CPU時間總量
7 當前WHAT列所對應的進程所消耗的CPU時間總量
8 用戶當前運行的進程

調查用戶

finger
image

如果發現沒有該命令,需要安裝:

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 身份執行命令
image

運行該命令的時候,系統首先檢查 /etc/sudoers,判斷該用戶是否有執行 sudo 的權限,在確認有執行權限之后,系統要求用戶輸入自己的密碼,如果密碼輸入正確,則會使用 root 用戶的身份運行 passwd UserName 命令。

使用 visudo 命令來修改 /etc/sudoers 配置文件,它可以自動檢查語法。

image

加入 "username ALL =(ALL)ALL" 這一行代表的意思是,john 這個用戶可以從任何地方登陸后執行任何人的任何命令。還可以定義某一組的 sudo 權限,比如 "%username ALL=(ALL)ALL" 可以讓所有屬于 john 用戶組的用戶從任何地方登陸后執行任何人的任何命令。

假設用戶由于工作需要,經常要重啟或者關閉服務器,那么就可以進行如下設置:

username ALL=(ALL) NOPASSWD:/sbin/shutdown,/usr/bin/reboot

嚴格來說,sudo 并不是真的切換了用戶,而是使用其他用戶的身份和權限執行了命令。

執行任務管理

日常生活中常會有例行性的事情,比如說每周工作日的鬧鐘、每年一次的生日提醒等。還有一些事情是偶發性的,比如突然需要處理一封緊急的郵件等。在Linux中也有處理這兩種任務的方法。**如果任務是周期性執行的,其命令為 cron;如果只是在某一個特定的時間執行一次,其命令為 at **。

單一時刻執行一次任務

定時關機

image

第一行是定義從現在開始計算,30分鐘后安排一個任務;

第二行是到了時間后執行關機操作;

第三行是<EOT>,這不是鍵盤輸入的,而是使用了組合鍵 Ctrl+D ,表示輸入結束。

第四行是系統提示有一個任務將于該時間執行。

atq         // 查看當前使用 at 命令調度的任務列表
image

也可以使用如下命令刪除已經進入任務隊列的任務

atrm id 
image

使用 at 還可以安排在具體的時間執行任務

image

默認情況下,所有用戶都可以使用 at 命令來調度自己的任務,如果由于特殊的原因需要禁止某些用戶使用這個功能,可以將該用戶的用戶名添加至 /etc/at.deny 中。

image

周期性執行任務 cron

首先要確定crond進程在運行,如果沒有運行,需要先啟動該進程。

image

該命令的執行環境為 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 。

image
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容