su和sudo這兩個命令是linux運維必須要會的,通常在生產環境中都是使用普通帳號來登錄,再使用su或sudo來執行一些管理命令。
su命令
su:run a shell with substitute user and group ids
-,-l,--login 切換后使用指定用戶的的shell。
[root@ns2 ~]# su - user4
[user4@ns2 ~]$ // 這里的shell環境是user4的
[user4@ns2 ~]$ exit
logout
[root@ns2 ~]# su -l user4
[user4@ns2 ~]$
[user4@ns2 ~]$ exit
logout
[root@ns2 ~]#
-c,--command=COMMAND 可以在不切換當前shell的情況下,用指定的用戶來執行一個命令;
[root@ns2 ~]# su user4 -c 'whoami'
user4
[root@ns2 ~]#
如果在su的時候沒有加”-“或“-l”或“--login”那么默認的會使用當前用戶的shell來執行;
sudo命令
sudo的配置文件是:/etc/sudoers,該文件可以定義哪個用戶可以在哪個機器上以哪個用戶的身份來執行哪些命令;
在配置sudo時必須使用visudo來編輯配置文件,因為使用visudo可以檢查修改后的文件的語法是否正確;
who where=(run_as) /path/to/command1,…
可以將上面的配置行分成四部分:part1 part2 part3 part4
- part1:表示哪個用戶
- part2:表示運行該sudo命令的機器,也就是用戶執行命令的機器;可以使用ALL來匹配所有;
- part3:表示該用戶要切換到的目標用戶;
- part4:表示要執行的命令;這里的命令必須使用絕對路徑,如果只指定了一個目錄的話,那么該用戶就可以執行該目錄下的所有的文件;
例如:
xfzhou 192.168.1.0/24=(root) /usr/sbin/useradd,/usr/sbin/usermod
xfzhou ALL=(root) /usr/sbin/setup
那么如果用戶的數量過多的時候是不是要為每個用戶來創建一個條目呢,很顯示這樣做是不科學的。所以sudo就引入了別名的概念,其實和組也差不多;
sudoers中定義了四種alias:
- User_Alias
- Runas_Alias
- Host_Alias
- Cmnd_Alias
alias定義的語法:
Alias_Type NAME = item1,item2,…
要注意的是,這個Alias的名稱一定要大寫;
User_Alias ADMIN = user1,%user2
user1是一個用戶,user2是一個組,所以user2的前面要加上%
Host_Alias PERMIT = www.xfzhou.com,192.168.10.40,192.168.20.0/24
可以使用主機名,IP地址,網段(網段的掩碼可以寫成255.255.255.0,也可以寫成/24)
Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/user/sbin/usermod
命令必須使用絕對路徑。如果只指定了一個目錄,那么用戶就可以執行該目錄下的所有的文件;上面的“=”右邊的都可以使用“!”來取反。表示除了xxx以外;
例子:請允許user1,user2,user3在192.168.20.44和192.168.10.0/24網段的機器上使用sudo切換到root用戶來執行useradd和setup命令;
#test for sudo
User_Alias TEST_USERS = user1,user2,user3
Host_Alias PERMIT_HOST = 192.168.10.0/24,192.168.20.44
Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/usr/sbin/setup
TEST_USERS PERMIT_HOST=(root) CREATEUSER
然后就可以使用user1,user2,user3這三個用戶去測試了;
普通用戶查看自己可以使用的sudo命令:
[user1@ns2 ~]$ sudo -l
Matching Defaults entries for user1 on this host:
requiretty, !visiblepw, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS MAIL PS1 PS2
QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME
LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Runas and Command-specific defaults for user1:
User user1 may run the following commands on this host:
(root) /usr/sbin/useradd, /usr/sbin/setup
[user1@ns2 ~]$
注意:當用戶第一次執行sudo命令的時候是需要用戶輸入自己的密碼的。當第一次輸入正確后,這個密碼就會被緩存5分鐘,在5分鐘內用戶再次使用sudo來切換身份執行命令的時候就不需要再次輸入自己的密碼。
這樣呢有些時候會有一個安全隱患,所以為了去掉這個5分鐘,可以在使用sudo命令的時候加上“-k”參數,這樣用戶在每次執行sudo命令的時候都會讓用戶輸入自己的密碼。
sudo無密碼執行命令
如果想讓某個用戶在執行sudo的時候不需要輸入自己的密碼,那么可以在命令的前面添加NOPASSWD。/etc/sudoers的內容如下:
#test for sudo
User_Alias TEST_USERS = user1,user2,user3
Host_Alias PERMIT_HOST = 192.168.10.0/24,192.168.20.44
Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/usr/sbin/setup
TEST_USERS PERMIT_HOST=(root) NOPASSWD:CREATEUSER
這樣的話,user1,user2,user3這三個用戶在執行指定的命令的時候就不需要輸入自己的密碼了。
如果其中的命令有的需要輸入密碼,有的不需要輸入密碼的話,那就把PASSWD:寫在那些命令的前面。或是把NOPASSWD:寫在最后一個命令中;
user1 192.168.10.44=(root) NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/usermod
例子:讓用戶user4使用passwd來管理用戶的密碼,但是不能給root用戶設置密碼:
user4 ALL=(root) /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
注意:如果最后不加上!/usr/bin/passwd root的話,那么會有很大的漏洞,user4可以修改root用戶的密碼;當添加上后,user4再次執行sudo passwd root的時候就會提示:
[user4@ns2 ~]$ sudo passwd root
[sudo] password for user4:
Sorry, user user4 is not allowed to execute '/usr/bin/passwd root' as root on ns2.xfzhou.com.
[user4@ns2 ~]$