一天一點學習Linux之使用者身份的查看與切換(su+sudo)

來源:互聯網
上載者:User

我們在前面兩節的課程內容中,給大家介紹了使用者和使用者組的基礎知識與如何系統管理使用者和使用者組。下面我們就來看看使用者的其他相關命令。
finger       查看使用者資訊工具
chfn         更改使用者資訊工具
id             查看使用者的UID、GID及所歸屬的使用者組
su            使用者切換工具
sudo        sudo 是通過另一個使用者來執行命令(execute a command as another user),su 是用來切換使用者,然後通過切換到的使用者來完成相應的任務,但sudo 能後面直接執行命令,比如sudo 不需要root 密碼就可以執行root 賦與的執行只有root才能執行相應的命令;但得通過visudo 來編輯/etc/sudoers來實現;
visudo        visodo 是編輯 /etc/sudoers 的命令;也可以不用這個命令,直接用vi 來編輯 /etc/sudoers 的效果是一樣的;


sudoedit    和sudo 功能差不多;

使用者身份資訊的查看
finger
先來看個例子
[root@yufei ~]# finger -s root
Login     Name       Tty      Idle  Login Time   Office     Office Phone
root      root       pts/0          Jan 11 13:45 (192.168.6.1)

-s的參數就是列出使用者的一些登陸資訊(登陸時間及終端,還包括使用者的office相關資訊)

[root@yufei ~]# finger -l root
Login: root                       Name: root
Directory: /root                        Shell: /bin/bash
On since Tue Jan 11 13:45 (CST) on pts/0 from 192.168.6.1
No mail.
No Plan.

-l參數,是指列出使用者的詳細資料(如全名、家目錄、SHELL、登陸資訊、郵件資訊、使用者的計劃任務等等)
註:這裡的Plan不是計劃任務,你可以理解成使用者的排程等等。這個其實就是使用者家目錄裡面的.plan檔案裡面的內容。看下面的示範。
[root@yufei ~]# echo “I will study RHEL6 during this year.” > ~/.plan
[root@yufei ~]# finger -l root
Login: root                       Name: root
Directory: /root                        Shell: /bin/bash
On since Tue Jan 11 13:45 (CST) on pts/0 from 192.168.6.1
No mail.
Plan:
I will study RHEL6 during this year.

註:如果finger後面不加使用者名稱的話,就是查詢所有登陸系統的使用者資訊情況

我們在上面的例子中,發現使用者資訊中還有Office與Office Phone這個資訊,我們在前面的內容也沒有講到,那麼這個資訊是如何寫入系統的呢?這就是我們下面要講的命令。
chfn #可以理解成change finger
[root@yufei ~]# chfn –help
Usage: chfn [ -f full-name ] [ -o office ] [ -p office-phone ] [ -h home-phone ] [ --help ] [ --version ]
看個例子就明白了
[root@yufei ~]# chfn -f adminstrator
Changing finger information for root.
Finger information changed.
[root@yufei ~]# finger -l root
Login: root                       Name: adminstrator
Directory: /root                        Shell: /bin/bash
On since Tue Jan 11 13:45 (CST) on pts/0 from 192.168.6.1
No mail.
Plan:
I will study RHEL6 during this year.
在Name:後面就有了剛才加入的資訊了,很簡單啊。

註:
1、如果chfn後面不加任何的參數,那麼系統會一個個來提示你輸入,預設的情況就直接斷行符號,看官自己試一下吧。
2、這個命令也是在我們的/etc/passwd中的第五個欄位中增加了相應的內容並用,號分開而已。

和chfn相似的命令還有chsh
[root@yufei ~]# chsh –help
Usage: chsh [ -s shell ] [ --list-shells ] [ --help ] [ --version ] [ username ]
是不是一看就明白了。這裡就不給大家來例子了,我相信大家也都能看懂。

id #查看與UID、GID相關的資訊(UID、GID中都有id,難道這就是這個命令的由來嗎?哈哈……)
[root@yufei ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
可以查看使用者的UID、GID和他所在的其它使用者組groups,還包括了我們後面會講到的SELinux。
註:這個命令的參數有幾個,不過,不需要記啊,不帶參數的時候,把所有的資訊全部列出來了。

使用者的身份切換
我們知道,在很多版本的Linux系統中,預設是禁止了ROOT帳戶的,為什麼呢?我們知道,這個ROOT的許可權是最大的,什麼事都能幹,如果他哪天一個不小心執行了rm -rf /(絕對不能用ROOT來執行些命令),那麼你的系統就到頭了,就等著重新安裝吧!如果系統中沒有什麼重要資料還好辦,要是裡面有很多的重要資料的話,那就懷具了!
所以說,一般在進行系統管理的時候,是用一般的帳戶,還非ROOT帳戶,只有在只能由ROOT來操作的時候,才切換成ROOT。這也是平時的一個好習慣。
有時候,我們在安裝軟體的時候也需要一般的使用者來執行。
因此,我們需要用到使用者身份的切換。

從一般使用者轉換成root,主要有兩種方式:
su -        直接將身份變成root,前提是需要知道root的密碼
sudo 命令    執行root的命令,但sudo需要事先設定。sudo只需要輸入使用者自己的密碼就能執行命令

su的用法
su
- :代表用某個使用者在登陸時候的環境變數登陸系統。
若後面沒有加任何的使用者的話,則代表切換為root的身份。
-l:和-是一樣的意思
-m: 正好與上面的-相反,使用目前使用者的環境變數,而不切換到新使用者的環境變數
-p: 和-m是一樣的意思
-c: 只執行一次命令
註:我們最常用的就是一個”-”和不帶”-”的參數。-c使用的時機也是相對比較多的。
我們來看個例子
先從root使用者切換到一般的使用者
[root@yufei ~]# pwd
/root
[root@yufei ~]# su yufei
[yufei@yufei root]$ pwd
/root
注意上面的狀態,使用者的名字是yuifei,所在的目錄是/root目錄,也就是root使用者的家目錄。這就是沒有帶”-”參數的狀況,沒有更換成我們使用者自己的環境變數。
我們來看看yufei使用者的環境變數
[yufei@yufei root]$ env |grep yufei
HOSTNAME=yufei.opsers.org
USER=yufei
HOME=/home/yufei
LOGNAME=yufei
那下面我們返回root使用者的狀態
[yufei@yufei root]$ exit
exit
[root@yufei ~]#
這時候就回到了root的狀態了。

我們再把“-”這個加上,看看效果
[root@yufei ~]# su – yufei
[yufei@yufei ~]$ pwd
/home/yufei
[yufei@yufei ~]$
這裡發生了明顯的變化,已經切換到使用者的家目錄了。當然他的環境變數也了之生效了!
[yufei@yufei ~]$ env |grep yufei
HOSTNAME=yufei.opsers.org
USER=yufei
MAIL=/var/spool/mail/yufei
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yufei/bin
PWD=/home/yufei
HOME=/home/yufei
LOGNAME=yufei
這個和上面的明顯不同,PATH這個是最重要的環境變數啊!

通過上面的對比,我想已經讓你明白了他們的區別了,可能您對這個環境變數還不明白,不過,沒有關係,這裡你只需要瞭解。在後面的課程中,我們還會講到這個環境變數的。

如果從普通使用者切換到root使用者,也是很簡單的
[yufei@yufei ~]$ su
Password:
[root@yufei yufei]# env |grep root
HOME=/root
雖然已經換成了root使用者的身份,但是root的環境變數沒有生效,很多命令是不能被執行的。普通使用者換成root使用者的時候需要輸入root使用者的密碼的。
[root@yufei yufei]# su -
[root@yufei ~]# env |grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
XAUTHORITY=/root/.xauthHE4blf
上面為什麼沒有輸入root密碼呢?因為我已經切換成了root使用者,只是環境變數沒有生效,再執行一次su -就把root使用者的環境變數給生效了。

註:要離開su的環境,用exit就能實現了。

再來示範一個-c參數
我們知道,普通使用者是看不到/etc/shadow的。下面我們就來用-c這個參數來實現普通使用者執行root使用者權限命令。
[yufei@yufei ~]$ tail -n 3 /etc/shadow
tail: cannot open `/etc/shadow’ for reading: Permission denied
[yufei@yufei ~]$ su -c “tail -n 3 /etc/shadow”
Password:
opser_1:$6$cIFPSKDr$rQV1fCHYfpUBSqgtpUGcO5A.Wp0feoaMxAQn9QgBWTW7outyIsSN6baVCxhlfAnCZD0GDfDWiaV/UWHFgKuqx/:14981:0:99999:7::15006:
test_user1:$6$EL8UBf7P$gZL3N9GJDL6JhBJnwTZYyiOO8d2zu7Ti9B5eDTP7Hb17AT6Xe4/BuiNVBszO/UoycYIBZZygIH3oA3aKDOSA11:14982:0:99999:7:::
test_user2:$6$tTs0BG90$7LLaUwF9pP/g0h4/IPAwH1x4JE.rSXjYP/wbUq2kxPsXM4/7AaniQdi6G85QIfH6.cspo7OTutqPZblbRUUVT/:14982:0:99999:7:::
[yufei@yufei ~]$
最後yufei使用者的身份還是沒有變的,但我們已經看到了不該看的內容了,前提是,你要知道root使用者的密碼,這個就是su最大的缺點。為了彌補這個不足,於是就有了另外一個命令,那就是sudo。我們在前面也說過 ,這個sudo只需要知道使用者自己的密碼,這樣要安全很多。下面就來看看這個sudo的使用吧!

sudo的用法
這個sudo的參數有很多,下面介紹兩個常用的
-u 後面接切換的使用者,如果沒有帶使用者,則預設為root使用者。他的目的就是使用-u後面的使用者身份。
-s 後面接想要執行的shell

[root@yufei ~]# sudo -u yufei -s “touch /home/yufei/file”
[root@yufei ~]# ls -l /home/yufei/file
-rw-r–r–. 1 yufei yufei 0 Jan 12 11:20 /home/yufei/file
雖然我是用root使用者建立的檔案,但通過sudo -u,使得root使用者建立的檔案許可權和所有者發生了改變

[root@yufei ~]# touch /home/yufei/file1
[root@yufei ~]# ls -l /home/yufei/file*
-rw-r–r–. 1 yufei yufei 0 Jan 12 11:20 /home/yufei/file
-rw-r–r–. 1 root  root  0 Jan 12 11:21 /home/yufei/file1
這個關於檔案許可權的問題,後面再來學習。
下面我們用普通使用者執行sudo命令
第一次會給個提示(略過),不過沒有關係,再執行一次就OK了,
[yufei@yufei ~]$ sudo -s “touch file2″
[sudo] password for yufei:
yufei is not in the sudoers file.  This incident will be reported.

上面的提示說yufei這個使用者不在sudoers檔案裡面,這是為什麼呢?
我們通過man sudo會發現/etc/sudoers是需要自己來配置的。
這個檔案的配置可以有兩種方法,一是能vi/vim,二是用visudo,其實這個visudo就是調用了vi來編輯這個檔案而已,但這個visudo還會檢測你編輯的文法是否正確。所以建議大家用visudo
我們來看看這個檔案的內容

sudo使用者執行root使用者所有命令

visudo就會開啟我樣想編輯的檔案/etc/sudoers,其實這個檔案裡面的內容還算一看就能明白的,而且還有相應的說明。
[root@yufei ~]# visudo
……
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
……

格式說明
root                        ALL=(ALL)            ALL
可以使用sudo命令的使用者        主機=可切換的身份    可以執行的命令

上面的意思就是:root使用者可以進行sudo操作,root使用者可以從任何的機器串連過來,可以切換成任何的使用者,並可以執行任何的命令。
註:
1、這個命令必需是絕對路徑
2、visudo只能由root來執行

如果我想讓yufei這個使用者可以像root一樣執行任何的命令,那麼就可以在設定檔中加入下面一句
yufei    ALL=(ALL)       ALL
儲存退出後,我們來看效果
[root@yufei ~]# su – yufei
[yufei@yufei ~]$ tail -n 3 /etc/shadow
tail: cannot open `/etc/shadow’ for reading: Permission denied
[yufei@yufei ~]$ sudo tail -n 3 /etc/shadow
[sudo] password for yufei:
opser_1:$6$cIFPSKDr$rQV1fCHYfpUBSqgtpUGcO5A.Wp0feoaMxAQn9QgBWTW7outyIsSN6baVCxhlfAnCZD0GDfDWiaV/UWHFgKuqx/:14981:0:99999:7::15006:
test_user1:$6$EL8UBf7P$gZL3N9GJDL6JhBJnwTZYyiOO8d2zu7Ti9B5eDTP7Hb17AT6Xe4/BuiNVBszO/UoycYIBZZygIH3oA3aKDOSA11:14982:0:99999:7:::
test_user2:$6$tTs0BG90$7LLaUwF9pP/g0h4/IPAwH1x4JE.rSXjYP/wbUq2kxPsXM4/7AaniQdi6G85QIfH6.cspo7OTutqPZblbRUUVT/:14982:0:99999:7:::
yufei這個使用者原本沒有許可權查看shadow的,但通過sudo後,就能查看這個檔案了,就是因為我們給了yufei這個相應的許可權。
註:
1、用sudo的時候,需要輸入使用者本身的密碼哦,而不是root的密碼。
2、你要給某個使用者佈建這麼大的許可權,你要確保這個使用者對你的機子,不會造成損失

sudo使用者組執行root的命令

如果說我想對某幾個使用者,都給同樣的許可權,那要怎麼做呢?難道要一個個的來增加嗎?當然不是,sudoers這個檔案裡面也有類似使用者組的寫法。
[root@yufei ~]# visudo
……
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
……
這裡面的wheel就是一個使用者組,我們可以把使用者先加入到這個組,然後再把設定檔改成如下
%wheel        ALL=(ALL)       ALL
也就是把前面的#號去掉
這個操作自己來實踐,順便可以回顧一下我們前面講的內容!
這些操作,都需要輸入使用者自己的密碼,能不能不讓使用者輸入密碼呢?當然可以,就在
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
的下面,
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
我們只要把上面的ALL前面加個NOPASSWD:就能實現了。

限制sudo使用者執行命令

這上面都是給了使用者最大的許可權,如果要限制使用者使用的命令的話,那麼要如何?呢?
其實那個檔案中就有例子,我們也來看看
[root@yufei ~]# visudo
加入下面一行
yufei   ALL=(ALL)       NOPASSWD: /sbin/shutdown
進入測試
[root@yufei ~]# su – yufei
[yufei@yufei ~]$ shutdown -r now
shutdown: Need to be root
提示需要用root使用者來執行
[yufei@yufei ~]$ sudo shutdown -r now

Broadcast message from root@yufei.opsers.org
    (/dev/pts/0) at 15:49 …

The system is going down for reboot NOW!
[yufei@yufei ~]$
Connection closed by foreign host.

Type `help’ to learn how to use Xshell prompt.
看到了吧,沒有輸入密碼,普通使用者同樣可以執行我們的重新啟動命令。

系統中有個passwd的更改密碼的命令,如果說你要把普通使用者通過sudo可以執行passwd的話,那麼會出現問題
我們先在sudo設定檔中加入下面的內容
yufei   ALL=(ALL)       NOPASSWD:/usr/bin/passwd
下面切換成yufei使用者,通過sudo來執行passwd命令,
[yufei@yufei ~]$ sudo passwd
Changing password for user root.
你會發現,這裡是改root的使用者密碼,如果普通使用者把你的root密碼改掉了,那麼你不就懷具了啊!為了避免這樣的情況發生,我們可以通過下面這樣來限制。
yufei   ALL=(ALL)       NOPASSWD:/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd,!/usr/bin/passwd root
上面的意思就是,讓yufei這個使用者可以執行/usr/bin/passwd [A-Za-z]*(也就是可以修改其他所有人的命令)。但是不能執行/usr/bin/passwd和/usr/bin/passwd root這兩個命令。
如果你再執行一次的話,就會出現下面的提示
[yufei@yufei ~]$ sudo passwd
Sorry, user yufei is not allowed to execute ‘/usr/bin/passwd’ as root on yufei.opsers.org.

這就提醒我們,在我們給sudo使用者權限的時候,一定要注意,不要給所有的許可權啊,特別是一些特殊的命令要考慮周全。

通過別名配置sudo的設定檔

我們在/etc/sudoers的檔案中看到最多的是Alias,這個Alias就是別名的意思,他就是把我們所需要的一組(使用者名稱、命令、主機名稱)內容,通過別名方式來實現。
User_Alias
Host_Alias
Cmnd_Alias
這三個別名的格式在檔案中已經有例子,也很清楚。我們通過下面的例子來給大家做個示範。
[root@yufei ~]# visudo
增加下面三行
User_Alias ADMPWD = user1,user2,user3
Cmnd_Alias ADMCMD = /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd,!/usr/bin/passwd root
ADMPWD ALL=(root) ADMCMD

註:
1、上面的user1,user2,user3都要是系統上面的使用者。
2、別名後面接的是大寫的別名,等號後面是別名裡面的內容。
3、增加別名後,要配置別我能幹什麼或不能幹什麼,就像第三句一樣。
4、兩次執行sudo的間隔在五分鐘之內,第二次就無需輸入密碼。

sudo+su的組合使用
通過上面的講解,大家可能會想到這樣一種情況,就是通過sudo+su,是不是能完成普通使用者切換成root使用者,而不需要輸入root密碼呢?答案是肯定的,那麼下面就來看看如何?吧。
同樣是編輯sudo的設定檔
[root@yufei ~]# visudo
加入下面的內容
yufei   ALL=(root)      /bin/su -
這樣就能讓在不泄露root密碼的情況下,通過sudo使普通使用者能切換到root使用者了。
[root@yufei ~]# su – yufei
[yufei@yufei ~]$ sudo su -
[sudo] password for yufei:
[root@yufei ~]#
看到[root@yufei ~]# 這個就知道,我們已經成功了!

摘自:羽飛部落格

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.