前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >疑问易答 | su与 sudo 命令你真的会用?

疑问易答 | su与 sudo 命令你真的会用?

作者头像
读懂原理
发布2023-02-28 13:45:02
5610
发布2023-02-28 13:45:02
举报
文章被收录于专栏:给点知识

旭哥

读完需要

12 分钟

速读仅需 4 分钟

/ su 与 sudo 命令你真的会用? /

1

1 su:切换用户

1.1

背景说明

在 Linux 中有多个用户,比如 root、master、worker 等,那我想从一个用户切换到另一个用户如何切换呢?比如登录 master 用户后,突然想去切换到 worker 用户执行一个命令,操作一个 worker 用户下的文件。这个时候切换用户有多个方法

  • 退出当前用户,然后登录到 worker 用户
  • 第二个就是通过 su 命令进行切换

1.2

命令格式

代码语言:javascript
复制
su 切换用户
# 例如从root用户切换为master用户
[root@test /]$ su master

2

2 sudo:以其他用户的身份执行命令

2.1

命令出现原因

代码语言:javascript
复制
su 的确为用户切换带来方便,通过切换到root下,能完成所有系统管理工具,只要把root的密码交给任何一个普通用户,他都能切换到root来完成所有的系统管理工作;

但通过su切换到root后,也有不安全因素;
比如系统有10个用户,而且都参与管理。
如果这10个用户都涉及到超级权限的运用,做为管理员如果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;

如果这10个用户都有root权限,通过root权限可以做任何事,这在一定程度上就对系统的安全造成了威协。
因此sudo产生了。

sudo可以在不切换用户的情况下以其他用户的身份执行命令。

2.2

命令参数详解

代码语言:javascript
复制
-V 显示版本编号

-h 会显示版本编号及指令的使用方式说明

-l 显示出自己(执行 sudo 的使用者)的权限

-v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码

-k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)

-b 将要执行的指令放在背景执行

-p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称

-u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)

-s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell

-H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )

command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

2.3

命令使用

问:如何使用命令呢?

答:那就要有以下 2 步:

  • 配置文件
  • 授权用户

详解:

说完了 sudo 命令的作用,那如果我想使用 sudo 特殊权限命令该如何使用?

其中就要去配置一下这个文件:/etc/sudoers

代码语言:javascript
复制
[root@test ~]$ ls -al /etc/sudoers
-r--r----- 1 root root 4027 Aug 16 10:43 /etc/sudoers

如何编辑这个文件呢?(有的同学会说使用 vi 即可。这个也是一种方法)

以下推荐两种方式编辑配置文件

(不推荐)vi /etc/sudoers 使用 vi 要注意,我们看到该文件是只读的,所以这里要首先授权可写才可以编辑

代码语言:javascript
复制
   [root@test ~]$ chmod u+w /etc/sudoers
   [root@test ~]$ vi /etc/sudoers
   [root@test ~]$ chmod u-w /etc/sudoers
   

(推荐)visudo 命令:该命令可以直接打开编辑

代码语言:javascript
复制
   [root@test ~]$ visudo
   

测试场景 1:

授权命令这里以 worker 用户为例,对 worker 用户授权命令/sbin/shutdown -c

  1. 未授权之前,在 worker 用户下执行命令:
代码语言:javascript
复制
[worker@linux1 ~]$ shutdown -c
Failed to talk to shutdownd, shutdown hasn't been cancelled: Permission denied
  1. 使用 visudo(root 用户下)编辑软件授权:添加如下两行 授权用户/组 主机名=(允许转换至的用户) NOPASSWD:命令动作 master ALL=(ALL) NOPASSWD:ALL
代码语言:javascript
复制
## Allows members of the users group to mount and unmount the
# %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
#授权用户/组    主机名=(允许转换至的用户)     NOPASSWD:命令动作
master    ALL=(ALL)       NOPASSWD:ALL
worker    ALL=(master)    /sbin/shutdown -c,/bin/sudo
# 不需要密码
# worker    ALL=(ALL)     NOPASSWD:/sbin/shutdown -c
  1. 授权后:当执行命令时,可以看到会提示让输入密码

解释下为什么会让输入密码:这里的密码是输入 sudo 命令的密码,而我们给 worker 的权限是 /sbin/shutdown -c 和/bin/sudo 命令,而且这两个命令都需要输入密码才可以使用,因为没有配置 NOPASSWD:/bin/sudo。

  • 因为 sudo 是 worker 的命令(worker ALL=(master) /sbin/shutdown -c,/bin/sudo)这个命令没有授权不输入密码(NOPASSWD),所以这里需要输入密码。
  • 而 shutdown -c 是 master 执行的,它没有要求输入密码,所以这里会直接执行不用输入密码
代码语言:javascript
复制
# sudo使用-u 以master用户身份执行shutdown -c
[worker@linux1 ~]$ sudo -u master sudo shutdown -c
Password: 
[worker@linux1 ~]$ 
Broadcast message from root@bsa161 (Thu 2023-02-02 13:29:37 CST):

The system shutdown has been cancelled at Thu 2023-02-02 13:30:37 CST!

测试场景 2:

说明:在 worker 用户下以 wilson 的身份执行编辑属于 wilson 用户的文件 aaa.txt

用户:worker:/home/worker 目录下没有文件

用户:wilson:/home/wilson 目录下有文件 aaa.txt

用户:root

不授权 sudo 给用户 worker 和 wilson

登录 worker 用户,执行命令 vi 编辑/home/wilson/aaa.txt 文件

第二步行不通的话再执行 sudo -u wilson vi /home/wilson/aaa.txt

第三步无法编辑,就可以授权 vi 命令,两个用户都需要密码,配置如下

代码语言:javascript
复制
  wilson ALL=(ALL) ALL
  worker ALL=(wilson) /bin/vi
  

执行结果

代码语言:javascript
复制
# 目录显示
[root@linux1 ~]# ls /home/worker/
[root@linux1 ~]# ls /home/wilson/
aaa.txt  aa.txt  bbb.txt
[worker@linux1 ~]$ sudo -u wilson vi /home/wilson/aaa.txt
[sudo] worker 的密码:

2.4

配置文件格式介绍

  1. 定义别名 比如我有好多命令有关/bin/chown, /bin/chmod,等这个时候如果写在授权哪里比较长,我们可以进行归类。所以就有别名,这个可以理解为命令组。 例如: Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root(注意这里的!)
  2. 具体使用案例
代码语言:javascript
复制
# 1. 定义别名
User_Alias SYSADER=beinan,linuxsir,%beinan
User_Alias DISKADER=lanhaitun
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root(注意这里的!)
Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 注:定义命令别名DSKCMD,下有成员parted和fdisk 
   SYSADER  ALL= SYDCMD,DSKCMD
   DISKADER ALL= (OP) DSKCMD

# 注解:
# 第一行:定义用户别名SYSADER 下有成员 beinan、linuxsir和beinan用户组下的成员,用户组前面必须加%号;

# 第二行:定义用户别名 DISKADER ,成员有lanhaitun

# 第三行:定义Runas用户,也就是目标用户的别名为OP,下有成员root

# 第四行:定义SYSCMD命令别名,成员之间用,号分隔,最后的!/usr/bin/passwd root 表示不能通过passwd 来更改root密码;

# 第五行:定义命令别名DSKCMD,下有成员parted和fdisk ;

# 第六行:表示授权SYSADER下的任何成员,在任何可能存在的主机名的主机下运行或禁止 SYDCMD和DSKCMD下定义的命令。
# 更为明确遥说,beinan、linuxsir和beinan用户组下的成员能以root身份运行 chown 、chmod 、adduser、passwd,但不能更改root的密码;
        也能够以root身份运行 parted和fdisk ,
        本条规则的等价规则是;
        
    beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk

# 第七行:表示授权DISKADER 下的任何成员,能以OP的身份,来运行 DSKCMD ,无需密码;更为明确的说 lanhaitun 能以root身份运行 parted和fdisk 命令;其等价规则是:
    lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk
# 如果我想不输入用户的密码就能转换到root并运行 SYDCMD 和 DSKCMD 下的命令,那应该把把NOPASSWD:加在哪里为好?参考下面例子;
    SYSADER ALL= NOPASSWD: SYDCMD, NOPASSWD: DSKCMD

2.5

授权用户组

命令格式,组前面需要添加%

代码语言:javascript
复制
   # %组名   ALL=(主机来源)  命令绝对路径
   %gourp  ALL=(ALL)       /usr/bin/yum
   

测试

代码语言:javascript
复制
   wilson ALL=(ALL) /bin/ls
   # worker ALL=(wilson) /bin/ls,/bin/vi
   %worker ALL=(wilson) /bin/ls,/bin/vi
   

用户 worker2 所属组 worker2

用户 worker 所属组 worker

用户 wilson 所属组 wilson

执行步骤:

第一步:登录用户执行 sudo -u wilson vi /home/wilson/aaa.txt

代码语言:javascript
复制
   [worker2@linux1 root]$ sudo -u worker2 vi /home/worker/aaa.txt
   worker2 不在 sudoers 文件中。此事将被报告。
   

第二步:配置用户组权限

代码语言:javascript
复制
   wilson ALL=(ALL) /bin/ls
   # worker ALL=(wilson) /bin/ls,/bin/vi
   %worker ALL=(wilson) /bin/ls,/bin/vi
   

第三步:修改 worker2 所属组为 worker

代码语言:javascript
复制
   [root@linux1 ~]# usermod -g worker worker2
   

第四步:执行命令

代码语言:javascript
复制
   [worker2@linux1 root]$ sudo -u wilson vi /home/worker/aaa.txt
   
   我们信任您已经从系统管理员那里了解了日常注意事项。
   总结起来无外乎这三点:
   
       #1) 尊重别人的隐私。
       #2) 输入前要先考虑(后果和风险)。
       #3) 权力越大,责任越大。
   
   [sudo] worker2 的密码:
   
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 给点知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档