su与sudo

一、用户身份切换

   Linux系统中root用户具有超级管理员的权限,由于权限较大,稍不注意可能造成安全隐患,所以在工作中一般的使用普通用户来完成一些工作,但是如果涉及到的任务需要root用户的权限又该如何呢?

  此时,可以使用两个重要的命令即su和sudo命令。

二、su命令

(一)介绍

  su命令是用户身份切换的命令,假如当前如果是普通用户,但是需要root权限来完成某件工作时,你可以选择退出当前用户,重新以root用户登录;另一种方式就是无需重新登陆只需要使用su命令进行切换即可。

  超级用户向普通用户切换时无需密码验证,当时普通用户向超级用户或者普通用户都需要密码验证。su命令的使用可以通过man su查看详细用法,下面是重要的参数说明:

参数选项 说明
-l,--login 登录shell设置
-c,--command 在一个shell下执行一个命令
-m,--preserve-environment 切换用户时,不重置用户环境变量
-s,--shell=SHELL 如果/etc/shells允许,则运行指定的shell

su命令比较常用的是"-"和“-c”参数,其中“-”参数是切换用户后将其环境变量带过来,避免环境变量不一致的情况,"-c"参数上面已经详细说明了。

[root@localhost ~]# su - xiaoshen -c ls -l /project

(二)实例

1、用户切换

su命令切用户用户后,如果不加任何参数,这样并没有改变用户的登陆环境,所以需要使用“su -”。

[root@localhost ~]# who am i
root     pts/0        2021-01-02 10:34 (192.168.159.1)
[root@localhost ~]# su - xiaoshen
Last login: Sat Jan  2 10:44:57 CST 2021 on pts/0

如果普通用户进行切换时需要使用密码:

su: Authentication failure
[xiaoshen@localhost ~]$ su -
Password: 
Last login: Sat Jan  2 10:34:18 CST 2021 from 192.168.159.1 on pts/0
Last failed login: Sat Jan  2 12:12:44 CST 2021 on pts/0
There was 1 failed login attempt since the last successful login.

2、普通用户执行服务

为了安全起见一般以普通用户来启动服务,所以一般可以在服务器启动时执行对应的脚本即可,在/etc.rc.local文件中设置:

# 分用户方案启动服务
su -xiaoshen -c '/bin/sh /project/script/run.sh'

(三)su命令优缺点

  使用改命令确实操作方便,但是同时也会带来一些问题,如果过多的人同时切换到root,并且如果有一个人由于个人的失误,如修改密码等,将会造成其他人无法正常使用。所以此时可以使用sudo命令来解决。

  这样超级用户的密码掌握在少数管理员的手中,通过sudo来实现其他人对高级别权限的需求。

三、sudo命令 

sudo命令用来解决超级用户滥用,而且能让普通用户拥有一定的超级权限来管理系统。它的运行流程如下:

其中时间戳的位置位于/var/db/sudo目录下:

[root@localhost ~]# ll /var/db/sudo/
total 0
drwx------. 2 root test 15 Oct 13 21:20 test

  sudo比较重要的是它的配置文件/etc/sudoers,通过visudo工具来完成sudo的配置,使用这个工具会在添加规则后自动检查语法是否正确。当授权成功后可以切换到被授权的用户下通过sudo -l命令查看那些超级权限命令是被分配的。

  /etc/sudoers配置文件中的每一行就是一个规则,前面带#号的为注释说明内容,规则超过一行使用""续行。

  /etc/sudoers的规则分为两类:

  • 别名定义
  • 授权规则

 下面是主要的别名定义,通过visudo可以查看配置文件:

# 定义主机别名,在定义授权规则时可以使用ALL来匹配所有的的主机
## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

#定义用户别名,别名成员可以是用户、用户组(用户组前加%)
## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem

#命令别名就是定义一个包含一堆命令的别名,即一组相关命令的集合
## Command Aliases
## These are groups of related commands...
...

上述别名在系统中有多个用户,并且用户需要进行分组管理,给予不同的权限时可以使用。对于授权,加入test用户授予与root用户相同的权限:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
test    ALL=(ALL)      NOPASSWD:ALL
原文地址:https://www.cnblogs.com/shenjianping/p/14209156.html