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的所有权限的

下面是我的配置步骤

  1. visudo

  2. 在root后添加 wenchao ALL=(ALL)      ALL

  3. 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权限才可以看到的文件

下面是我的操作步骤

  1. 首先:在普通用户下看/etc/sudoers

    [wenchao2@centosTest ~]$ more /etc/sudoers
    /etc/sudoers: Permission denied
    [wenchao2@centosTest ~]$


  2. 切换到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   #增加的


  3. 切换到wenchao2

    [root@centosTest ~]# su - wenchao2


  4. 看看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 ~]$


  5. 检查权限是否赋予成功

    [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;