1. 程式人生 > 程式設計 >linux建立和切換使用者遇到事兒了

linux建立和切換使用者遇到事兒了

使用版本: CentOS 7

[root@azfdbdfsdf230lqdg1ba91 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@azfdbdfsdf230lqdg1ba91 ~]# uname -a
Linux azfdbdfsdf230lqdg1ba91 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@azfdbdfsdf230lqdg1ba91 ~]#
複製程式碼

遇到事兒了

最近在測試環境部署新專案,QA過來說jenkins打包報錯。於是去打包機上看打包情況,QA使用的是新賬號打包的,也就是說原來其他賬號的打包目錄他沒有許可權,所以報錯。這是需要給這個賬號賦予目錄許可權。才發現切換賬號和賦許可權有很多細節,於是操作一番記錄下來

為了方便,先建立了兩個使用者skyler4,skyler5。以下命令在root賬戶下執行

$ groupadd skyler //建立一個組,名稱為skyler
$ cat /etc/group //檢視組資訊
$ useradd -g skyler -p skyler4 skyler4 //建立一個使用者,名稱為skyler4,並關聯上組,同時設定密碼為skyler4
$ useradd -g skyler -p skyler5 skyler5 //建立一個使用者,名稱為skyler5,並關聯上組,同時設定密碼為skyler5
$ cat /etc/passwd // 檢視所有使用者密碼
複製程式碼

建立使用者後,執行cat /etc/shadow可以看到效果如下

20190918203407.png

於是,我從root切換到skyler4,結果如下圖

20190918202611.png

可以看到,現在已經在skyler4賬號下了。我再次切換,這次想切換到skyler5賬號下

20190918202757.png
可以看到,提示我授權失敗,原因是啥的?我輸入的skyler5的密碼是對的啊,為啥不能切換呢。於是我切換回root賬號並執行passwd skyler5,輸入密碼skyler5後,再次使用cat /etc/shadow檢視

[skyler4@azfdbdfsdf230lqdg1ba91 ~]$ su -
Password:
Last login: Wed Sep 18 20:12:20 CST 2019 on pts/0
[root@azfdbdfsdf230lqdg1ba91 ~]# passwd skyler5
Changing password for user skyler5. New password: BAD PASSWORD: The password contains the user name in some form Retype new password: passwd: all authentication tokens updated successfully. [root@azfdbdfsdf230lqdg1ba91 ~]# cat /etc/shadow root:mJw/b3Nd.:17634:0:99999:7::: ... skyler3:skyler3:18157:0:99999:7::: skyler4:skyler4:18157:0:99999:7::: skyler5:$64jZARp6ewjTNXzVUpOq3xpX9M2zERCaa7Mc6/r61Kr41Yg0qK/:18157:0:99999:7::: [root@azfdbdfsdf230lqdg1ba91 ~]# 複製程式碼

可以看到,兩次cat /etc/shadow檢視skyler5賬號的密碼是不同的,雖然我輸入的都是skyler5,但是後一次是加密的。現在我切換到skyler4,再使用su - skyler5並輸入密碼skyler5,以切換到skyler5賬號。效果見下圖

20190918204155.png

可以看到這次切換成功了。不禁問起,1.useradd設定的密碼不好使嗎,2.passwd命令又做了什麼呢

原因

在root許可權下,useradd只是建立了一個使用者名稱,如 (useradd 使用者名稱 ),它並沒有在/home目錄下建立同名資料夾,也沒有建立密碼,因此利用這個使用者登入系統,是登入不了的。這是網上的說法,但我覺得不是這個原因,因為useradd建立的使用者是有家目錄的,通過root賬號下執行 cat /etc/passwd可以看到是有家目錄的
[root@azfdbdfsdf230lqdg1ba91 ~]# useradd -p skyler80 skyler80
[root@azfdbdfsdf230lqdg1ba91 ~]# cat /etc/passwd
skyler4:x:1003:1000::/home/skyler4:/bin/bash
skyler5:x:1004:1000::/home/skyler5:/bin/bash
skyler80:x:1010:1010::/home/skyler80:/bin/bash
複製程式碼

解決

  1. 在root許可權下執行passwd 使用者名稱。如passwd skyler5,並按照提示輸入密碼

另 網上有說使用useradd -m 使用者名稱,嘗試後發現不起作用。還有說使用adduser這個命令,同樣不起作用

skyler5可以切換使用者了,但是skyler4還不可以,需要給skyler4執行 passwd skyler4來設定密碼,我們直接在skyler5賬戶下操作,結果如下圖

20190919080314.png

第一個結果提示sudo命令只能root賬號下使用,第二個結果提示skyler5不在sudoers檔案中。所以,需要在sudoers中配置skyler5資訊,步驟如下

[root@azfdbdfsdf230lqdg1ba91 ~]# ll /etc/sudoers
-r--r----- 1 root root 3962 9月  19 13:09 /etc/sudoers
[root@azfdbdfsdf230lqdg1ba91 ~]# chmod u+w /etc/sudoers //賦值這個檔案寫許可權
[root@azfdbdfsdf230lqdg1ba91 ~]# ll /etc/sudoers
-rw-r----- 1 root root 3962 9月  19 13:09 /etc/sudoers
[root@azfdbdfsdf230lqdg1ba91 ~]# visudo // 編輯/etc/sudoers檔案
複製程式碼

輸入skyler*的內容後 按下Esc,然後Shift + double z ,如下圖

20190919184254.png

現在我們再來在skyler5賬號下設定skyler4的密碼,可以發現可以設定了,效果如下圖

20190919201928.png

adduser與useradd的區別

網上說adduser和useradd是不同的,但是在CentOS 7上通過info/man adduser/useradd,他倆是相同的

su含義

su為switch user,即切換使用者的簡寫
格式:su -l USERNAME(-l為login,即登陸的簡寫)。-l可以將l省略掉,所以此命令常寫為su - USERNAME
如果不指定USERNAME(使用者名稱),預設即為root,所以切換到root的身份的命令即為:su -root或是直接 su -
複製程式碼

su與su -的區別

通過su切換使用者還可以直接使用命令su USERNAME,與su - USERNAME的不同之處如下:
   su - USERNAME切換使用者後,同時切換到新使用者的工作環境中
   su USERNAME切換使用者後,不改變原使用者的工作目錄,及其他環境變數目錄
如下圖,顯示兩個命令的執行結果:家目錄顯然不同
複製程式碼

20190919203336.png

你可能會覺得使用 su - 登入更有意義。但是, su 命令也是有用的,那麼大家可能會想知道它在什麼時候用到。以下內容摘自 ArchLinux wiki 網站 - 關於 su 命令的好處和壞處:

  • 有的時候,對於系統管理員(root)來講,使用其他普通使用者的 Shell 賬戶而不是自己的 root Shell 賬戶更會好一些。尤其是在處理使用者問題時,最有效的方法就是是:登入目標使用者以便重現以及除錯問題。
  • 然而,在多數情況下,當從普通使用者切換到 root 使用者進行操作時,如果還使用普通使用者的環境變數的話,那是不可取甚至是危險的操作。因為是在無意間切換使用普通使用者的環境,所以當使用 root 使用者進行程式安裝或系統更改時,會產生與正常使用 root 使用者進行操作時不相符的結果。例如,以普通使用者安裝程式會給普通使用者意外損壞系統或獲取對某些資料的未授權訪問的能力。

sudo

sudo為'superuser do'

使用su切換使用者時需知曉要切換使用者的登陸密碼,即若切換成root使用者身份,需知道root使用者的登陸密碼。作為root使用者管理員,如何授權其他普通使用者,在不需要知曉root密碼的情況下,執行root許可權的命令操作?此時即可使用sudo。

sudo是一種許可權管理機制,依賴於/etc/sudoers,其定義了授權給哪個使用者可以以管理員的身份能夠執行什麼樣的管理命令;

格式:sudo -u USERNAME COMMAND

當普通使用者通過sudo以root使用者執行命令時,sudo後面的 -u USERNAME可省略,即sudo COMMAND 即意為sudo以root使用者執行

預設情況下,系統只有root使用者可以執行sudo命令。需要root使用者通過使用visudo命令編輯sudo的配置檔案/etc/sudoers,才可以授權其他普通使用者執行sudo命令。如下圖
複製程式碼

20190919184254.png

sudo與su的區別

  • 相同點 兩個命令都可以切換使用者: sudo -u USERNAME COMMAND; su - USERNAME

  • sudo與su的區別

1. 兩個命令的最大區別是:切換到root使用者時
sudo COMMAND // 以root許可權執行COMMAND,此時需要輸入當前賬號的密碼
su -         // 切換到root使用者,此時需要輸入root賬戶的密碼

如:
skyler5賬號下執行 `sudo passwd skyler4`,此時需要你輸入skyler5的密碼
skyler5賬號下執行 `su -' ,此時需要你輸入root的密碼

2. 日誌記錄
儘管 sudo 命令是以目標使用者(預設情況下是 root 使用者)的身份執行命令,但是它們會使用 sudoer 所配置的使用者名稱來記錄是誰執行命令。而 su 命令是無法直接跟蹤記錄使用者切換到 root 使用者之後執行了什麼操作。

3. 靈活性
sudo 命令比 su 命令靈活很多,因為你甚至可以限制 sudo 使用者可以訪問哪些命令。換句話說,使用者通過 sudo 命令只能訪問他們工作需要的命令。而 su 命令讓使用者有許可權做任何事情

4. man檔案中su和sudo的解釋:
su - run a shell with substitute user andgroup IDs
sudo - excute a command as another user. sudo allows a permitted user to execute acommand as the superuser or another user,as specified by security policy.
複製程式碼

sudo bash與sudo su與sudo sh的區別

20190919235925.png

  1. sudo sh
複製程式碼
  1. sudo bash bash命令是sh命令的擴充套件和升級
sudo allows users to run programs with the security privileges of another user (normally the superuser,or root).
bash starts a new bash shell.
So,sudo bash starts a new bash shell with the security privilege of root user.

If sudo bash is allowed to any user,that user is root simply by virtue of knowing his own password.
複製程式碼
  1. sudo su 切換到root使用者
使用者必須有/usr/bin/su命令的sudo許可權。一旦切換成功,使用者可以以root身份執行任何命令。
複製程式碼

新使用者執行sudo su時,可能會提示

[skyler5@azfdbdfsdf230lqdg1ba91 ~]$ sudo su
[sudo] password for skyler5:
Sorry,user skyler5 is not allowed to execute '/bin/su' as root on azfdbdfsdf230lqdg1ba91.

這是因為skyler5沒有sudo su的許可權,需要在/etc/sudoers檔案中配置,具體如下
切換到root賬號
[skyler5@azfdbdfsdf230lqdg1ba91 ~]$ su -
賦給root賬號對/etc/sudoers檔案的寫許可權
[root@azfdbdfsdf230lqdg1ba91 ~]# chmod u+w /etc/sudoers
[root@azfdbdfsdf230lqdg1ba91 ~]# ll /etc/sudoers
-rw-r----- 1 root root 4210 Sep 19 18:45 /etc/sudoers
編輯/etc/sudoers,新增內容如下圖
[root@azfdbdfsdf230lqdg1ba91 ~]# visudo

複製程式碼

20190921164958.png
編輯好後儲存退出,切換到skyler5賬號,然後再次執行sudo su -

[skyler5@azfdbdfsdf230lqdg1ba91 ~]$ sudo su - //執行這行你會發現:直接切換都沒有root賬號,沒有輸入root賬號密碼直接切換了
Last login: Sat Sep 21 16:44:41 CST 2019 on pts/0
複製程式碼

對比sudo su -su -的效果。你會發現前者不需要輸入root密碼,後者需要輸入root密碼。這就是sudo命令的好處和'壞處'。特別指出:sudo su -是一段時間內不需要輸入密碼,超過時間同樣需要輸入密碼,但這個密碼是skyler5賬號的密碼,非root的密碼

[skyler5@azfdbdfsdf230lqdg1ba91 ~]$ su -
Password:
[root@azfdbdfsdf230lqdg1ba91 ~]# 
複製程式碼

同理,skyler5賬號需要執行sudo bashsudo sh都需要root先賦給許可權,設定方式同sudo su的方式

sudo bash與sudo su與sudo sh的區別

從賬號切換效果來看 sudo su - = sudo bash = sudo sh,都是切換到root賬號的環境下

參考:cn.linux.vbird.org/linux_basic…