su和su -
联系:都是切换到root
区别:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误。su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。用echo $PATH命令看一下su和su -以后的环境变量有何不同。以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令。
[root@centosTest wenchao]# pwd /home/wenchao [root@centosTest wenchao]# su - [root@centosTest ~]# su wenchao [wenchao@centosTest root]$ pwd /root [wenchao@centosTest root]$ exit exit [root@centosTest ~]# pwd /root [root@centosTest ~]# su - wenchao [wenchao@centosTest ~]$ pwd /home/wenchao [wenchao@centosTest ~]$
查看环境变量:
[wenchao@centosTest ~]$ env|egrep "USER|MAIL|LOGNAME|PWD" USER=wenchao MAIL=/var/spool/mail/wenchao PWD=/home/wenchao LOGNAME=wenchao [wenchao@centosTest ~]$ su Password: [root@centosTest wenchao]# env|egrep "USER|MAIL|LOGNAME|PWD" USER=wenchao MAIL=/var/spool/mail/wenchao PWD=/home/wenchao LOGNAME=wenchao [root@centosTest wenchao]# [root@centosTest wenchao]# exit exit [wenchao@centosTest ~]$ su - Password: [root@centosTest ~]# env|egrep "USER|MAIL|LOGNAME|PWD" USER=root MAIL=/var/spool/mail/root PWD=/root LOGNAME=root [root@centosTest ~]#
su的优缺点:
su 的确为管理带来方便,通过切换到root下,能完成所有系统管理工具,只要把root的密码交给任何一个普通用户,他都能切换到root来完成所有的系统管理工作;但通过su切换到root后,也有不安全因素;比如系统有10个用户,而且都参与管理。如果这10个用户都涉及到超级权限的运用,做为管理员如果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;如果这10个用户都有root权限,通过root权限可以做任何事,这在一定程度上就对系统的安全造成了威协;想想Windows吧,简直就是恶梦;“没有不安全的系统,只有不安全的人”,我们绝对不能保证这 10个用户都能按正常操作流程来管理系统,其中任何一人对系统操作的重大失误,都可能导致系统崩溃或数据损失;所以su 工具在多人参与的系统管理中,并不是最好的选择,su只适用于一两个人参与管理的系统,毕竟su并不能让普通用户受限的使用;超级用户root密码应该掌握在少数用户手中,这绝对是真理!所以集权而治的存在还是有一定道理的;
此时sudo诞生了
sudo的优点:
由于su 对切换到超级权限用户root后,权限的无限制性,所以su并不能担任多个管理员所管理的系统。如果用su 来切换到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成与其相关的工作,这时我们就有必要用到 sudo。
通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外sudo 是需要授权许可的,所以也被称为授权许可的su;
sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;
它的特性主要有这样几点:
§ sudo能够限制用户只在某台主机上运行某些命令。
§ sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
§ sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。
§ sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0411。
sudo的配置文件/etc/sudoer配置说明..
sudo的配置详见《sudo配置文件详解》http://fuwenchao.blog.51cto.com/6008712/1340722
范例:我的机器的文件配置(略)
root ALL=(ALL) ALL wenchao ALL=(ALL) ALL ## Allows members of the 'sys' group to run networking, software, ## service management apps and more. # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS ## Allows people in group wheel to run all commands # %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL ## Allows members of the users group to mount and unmount the ## cdrom as root # %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom ## Allows members of the users group to shutdown this system # %users localhost=/sbin/shutdown -h now
实例1:
上面可以看到wenchao用户也是具有root的所有权限的
下面是我的配置步骤
visudo
在root后添加 wenchao ALL=(ALL) ALL
wenchao用户登陆之后,执行 sudo su -,然后输入wenchao的登录密码就可以了
[wenchao@centosTest ~]$ sudo su - [sudo] password for wenchao: [root@centosTest ~]#
实例2:
让普通用户support只能在某几台服务器上,执行root能执行的某些命令
首先需要配置一些Alias,这样在下面配置权限时,会方便一些,不用写大段大段的配置。Alias主要分成4种
Host_Alias
Cmnd_Alias
User_Alias
Runas_Alias
1) 配置Host_Alias:就是主机的列表
Host_Alias HOST_FLAG = hostname1, hostname2, hostname3
2) 配置Cmnd_Alias:就是允许执行的命令的列表
Cmnd_Alias COMMAND_FLAG = command1, command2, command3
3) 配置User_Alias:就是具有sudo权限的用户的列表
User_Alias USER_FLAG = user1, user2, user3
4) 配置Runas_Alias:就是用户以什么身份执行(例如root,或者oracle)的列表
Runas_Alias RUNAS_FLAG = operator1, operator2, operator3
5) 配置权限
配置权限的格式如下:
USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
如果不需要密码验证的话,则按照这样的格式来配置
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG
配置示例:
############################################################################ # sudoers file. # # This file MUST be edited with the 'visudo' command as root. # # See the sudoers man page for the details on how to write a sudoers file. # # Host alias specification Host_Alias EPG = 192.168.1.1, 192.168.1.2 # User alias specification # Cmnd alias specification Cmnd_Alias SQUID = /opt/vtbin/squid_refresh, /sbin/service, /bin/rm # Defaults specification # User privilege specification root ALL=(ALL) ALL support EPG=(ALL) NOPASSWD: SQUID # Uncomment to allow people in group wheel to run all commands # %wheel ALL=(ALL) ALL # Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL # Samples # %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom # %users localhost=/sbin/shutdown -h now ###############################################################
实例3:
普通用户想看只有root权限才可以看到的文件
下面是我的操作步骤
首先:在普通用户下看/etc/sudoers
[wenchao2@centosTest ~]$ more /etc/sudoers /etc/sudoers: Permission denied [wenchao2@centosTest ~]$
切换到root下对wenchao2进行授权
[root@centosTest ~]# visudo ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL wenchao ALL=(ALL) ALL wenchao2 ALL=/bin/more #增加的
切换到wenchao2
[root@centosTest ~]# su - wenchao2
看看wenchao2能执行哪些命令
[wenchao2@centosTest ~]$ sudo -l [sudo] password for wenchao2: Matching Defaults entries for wenchao2 on this host: requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User wenchao2 may run the following commands on this host: (root) /bin/more [wenchao2@centosTest ~]$
检查权限是否赋予成功
[wenchao2@centosTest ~]$ more ^C [wenchao2@centosTest ~]$ more /etc/sudoers /etc/sudoers: Permission denied [wenchao2@centosTest ~]$ sudo more /etc/sudoers ## Sudoers allows particular users to run various commands as ## the root user, without needing the root password. ## ## Examples are provided at the bottom of the file for collections ## of related commands, which can then be delegated out to particular ## users or groups. ##
对于wenchao用户查看和读取所有系统文件中,我只想把/etc/shadow 的内容可以让他查看;可以加入下面的一行;
wenchao ALL=/bin/more /etc/shadow
题外话:有的弟兄会说,我通过su 切换到root用户就能看到所有想看的内容了,哈哈,对啊。但咱们现在不是在讲述sudo的用法吗?如果主机上有多个用户并且不知道root用户的密码,但又想查看某些他们看不到的文件,这时就需要管理员授权了;这就是sudo的好处;
实例4:
练习用户组在/etc/sudoers中写法;
如果用户组出现在/etc/sudoers 中,前面要加%号,比如%wenchao ,中间不能有空格;%wenchao ALL=/usr/sbin/*,/sbin/*
如果我们在 /etc/sudoers 中加上如上一行,表示wenchao用户组下的所有成员,在所有可能的出现的主机名下,都能切换到root用户下运行 /usr/sbin和/sbin目录下的所有命令;
实例5:
练习取消某类程序的执行:
取消程序某类程序的执行,要在命令动作前面加上!号; 在本例中也出现了通配符的*的用法;
wenchao ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk
[wenchao@localhost ~]?$ sudo -l
Password: 注:在这里输入wenchao用户的密码;
User beinan may run the following commands on this host:(root) /usr/sbin/*(root) /sbin/*(root) !/sbin/fdisk[wenchao@localhost ~]?$ sudo /sbin/fdisk -lSorry, user beinan is not allowed to execute '/sbin/fdisk -l' as root on localhost.
注:不能切换到root用户下运行fdisk 程序;
如果有sudo 的权限而没有su的权限: sudo su;