五、用户身份切换
1.su命令
语法:su [-lm] [-c 命令] [username]
参数:
[- ]:单纯使用- 表示使用login-shell的变量文件读取式来登录系统,如果没有用户名,则表示切换为root身份。
[-l]:与 - 类似,但后面需要接欲切换的用户账号,也是login-shell的方式
[-m]:表示使用目前的环境设置,而不读取新用户的配置文件
[-c]:仅进行一次命令,后面接需要执行的命令
注意:若要完整地切换到新用户的变量,必须使用“us - username”或者“su -l username”的方式,并且使用root切换成为任何用户时,并不需要输入新用户名。
2.sudo命令
sudo可以以其它用户的身份执行命令(通常是使用root的身份来执行命令),但并非所有人都能够执行sudo,仅有/etc/sudoers内的用户才能执行sudo命令。
语法:sudo [-b] [-u 新用户账号]
参数:
[-b]:将后面的命令让系统自行执行,而不与目前的shell产生影响
[-u]:后面可以接欲切换的用户,若无此项则代表切换身份为root
root用户使用sudo命令以user1的身份在/home/user1/下面创建的test.txt文件所属用户为user1:
[root@hs-uf21 ~]# sudo -u user1 touch/home/user1/test.txt
[root@hs-uf21 ~]# ll -a /home/user1/test.txt
-rw-r--r-- 1 user1 user1 0 Apr 23 22:29 /home/user1/test.txt
3.visudo与/etc/sudoers
若想要除了root之外的其他账号使用sudo命令执行属于root的权限命令,则root需要先使用visudo去修改/etc/sudoers文件,让该账号能够使用全部或部分的root的命令功能。也可以直接使用vi或者vim编辑,但sudoers文件有自己的语法结构,如果设置错误会导致sudo命令无法使用。
系统默认只有root用户才可以执行sudo命令:
[Oracle@hs-uf21 ~]$ sudo -u user1 touch/home/user1/test.txt
Password:
oracle is not in the sudoers file. This incident will be reported.
使用visudo命令修改/etc/sudoers文件,使oracle使用可以使用sudo执行root用户的全部命令:
[root@hs-uf21 ~]# visudo
# sudoers file.
root ALL=(ALL) ALL
oracle ALL=(ALL) ALL <<==增加此行
[root@hs-uf21 ~]# su - oracle
[oracle@hs-uf21 ~]$ sudo -u user1 touch/home/user1/test2.txt
[oracle@hs-uf21 ~]$ sudo ls -al /home/user1/test2.txt
-rw-r--r-- 1 user1 user1 0 Apr 23 22:43 /home/user1/test2.txt
说明:
root ALL=(ALL) ALL
[用户账号][登录者的来源主机名][(可切换的身份)][可执行的命令]
[用户账号]:系统的那个账号可以使用sudo命令,默认账号只有root。
[登录者的来源主机名]:这个账号由那台主机连接到本Linux主机,默认root可以来自任何一台网络主机。
[(可切换的身份)]:这个账号可以切换成什么身份来执行后续的命令,默认root可以切换成使用用户。
[可执行的命令]:这个命令必须使用绝对路径,默认root可以切换任何身份,且执行任何命令。
用oracle用户查看/etc/shadow文件会提示没有权限,但使用sudo可以查看:
[oracle@hs-uf21 ~]$ head -n 10 /etc/shadow
head: cannot open `/etc/shadow' for reading:Permission denied
[oracle@hs-uf21 ~]$ sudo head -n 10 /etc/shadow
Password:
root:$1$yI2Xb6os$9C5hnN3POy6sdl0TY8FZv.:15805:0:99999:7:::
.........
利用用户组以及免密码的功能处理visudo:
[root@hs-uf21 ~]# visudo
# sudoers file.
# %wheel ALL=(ALL) ALL
%user1 ALL=(ALL) ALL <<==增加此行,使用用户组可以使用用户组user1下面的用户可以使用sudo命令
[user1@hs-uf21 ~]$ head /etc/shadow
head: cannot open `/etc/shadow' for reading:Permission denied
[user1@hs-uf21 ~]$ sudo head /etc/shadow
Password:
root:$1$yI2Xb6os$9C5hnN3POy6sdl0TY8FZv.:15805:0:99999:7:::
bin:*:15805:0:99999:7:::
使用visudo编辑/etc/sudoers文件,可以让用户免输出密码执行sudo命令:
[root@hs-uf21 ~]# visudo
# sudoers file.
# %wheel ALL=(ALL) NOPASSWD: ALL
%user1 ALL=(ALL) NOPASSWD: ALL
[root@hs-uf21 ~]# su user1
[user1@hs-uf21 root]$ sudo head /etc/shadow
root:$1$yI2Xb6os$9C5hnN3POy6sdl0TY8FZv.:15805:0:99999:7:::
注意:本次使用sudo执行命令没有输入密码。
有限制的操作命令:
[root@hs-uf21 ~]# visudo
# User privilege specification
root ALL=(ALL) ALL
oracle ALL=(ALL) ALL
adminpwd ALL=(root) /usr/bin/passwd
[adminpwd@hs-uf21 ~]$ sudo passwd user1
Changing password for user user1.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updatedsuccessfully.
只执行sudopasswd时提示更改root用户的密码:
[adminpwd@hs-uf21 ~]$ sudo passwd
Changing password for user root.
New UNIX password:
使用visudo命令修改/etc/sudoers文件,全adminpwd用户只能使用除了root的之外的其它用户的密码:
[root@hs-uf21 ~]# visudo
# User privilege specification
root ALL=(ALL) ALL
oracle ALL=(ALL) ALL
#adminpwd ALL=(root) /usr/bin/passwd <<==此行更改为下面的写法
adminpwd ALL=(root) !/usr/bin/passwd,!/usr/bin/passwdroot,/usr/bin/passwd [A-Za-z]*
[root@hs-uf21 ~]# su - adminpwd
[adminpwd@hs-uf21 ~]$ sudo passwd
Sorry, user adminpwd is not allowed to execute'/usr/bin/passwd' as root on hs-uf21.
通过别名设置visudo:
[root@hs-uf21 ~]# visudo
# sudoers file.
# User alias specification
User_Alias ADMINPWD = oracle, adminpwd,user1
# Cmnd alias specification
Cmnd_Alias ADMINCMD =!/usr/bin/passwd,!/usr/bin/passwd root,/usr/bin/passwd [A-Za-z]*
# User privilege specification
root ALL=(ALL) ALL
#oracle ALL=(ALL) ALL
#adminpwd ALL=(root) !/usr/bin/passwd,!/usr/bin/passwdroot,/usr/bin/passwd [A-Za-z]*
ADMINPWD ALL=(root) ADMINCMD
[root@hs-uf21 ~]# su oracle
[oracle@hs-uf21 root]$ sudo head /etc/shadow
Password:
Sorry, user oracle is not allowed to execute'/usr/bin/head /etc/shadow' as root on hs-uf21.
[oracle@hs-uf21 root]$ sudo passwd
Sorry, user oracle is not allowed to execute'/usr/bin/passwd' as root on hs-uf21.
[oracle@hs-uf21 root]$ sudo passwd user3
Changing password for user user3.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updatedsuccessfully.
注意:User_Alias,Cmnd_Alias,Host_Alias的名称一定要使用大写。
