su命令

1
su cqd

表示切换到cqd用户模式,需要输入该用户密码。如果是root用户使用该命令,则不需要输入密码,因为root权限高。

1
su

只输入su后面不加账户名称时,系统默认切换到root账户,需要知道root的密码。没有时间限制。
1
su -

表示申请切换root用户,需要申请root用户密码。

有些Linux发行版,例如ubuntu,默认没有设置root用户的密码,所以需要我们先使用sudo passwd root设置root用户密码。

su和su -区别

  • [su]只是切换了root身份,但Shell环境仍然是普通用户的Shell;

  • [su -]连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误,报command not found的错误。

  • [su]切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用[su -]命令切换以后,工作目录变成root的工作目录了。

  • 用echo $PATH命令看一下su和su - 后的环境变量已经变了。

实际例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cqd@cqd:~$ su -
Password:
root@cqd:~# pwd
/root
root@cqd:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
root@cqd:~# exit
logout
cqd@cqd:~$ pwd
/home/cqd
cqd@cqd:~$ su
Password:
root@cqd:/home/cqd# pwd
/home/cqd
root@cqd:/home/cqd# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
root@cqd:/home/cqd# exit
exit

sudo命令

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。
这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。

是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。

特性

  1. sudo能够限制用户只在某台主机上运行某些命令。

  2. sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。默认的安全策略记录在 /etc/sudoers 文件中,属性必须为0440

  3. sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。

    当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限

    1
    2
    root@cqd:/home/cqd# ll /etc/sudoers
    -r--r----- 1 root root 755 Feb 3 2020 /etc/sudoers

    sudoers主要内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    格式:授权用户/组 主机  =[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...

    字段1:
    不以%号开头的表示"将要授权的用户" root
    以%号开头的表示"将要授权的组" %wheel

    字段2:表示允许登录的主机
    ALL表示所有; 如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令
    eg:jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
    表示: 普通用户jack在主机(或主机组)mycomputer上, 可以通过sudo执行reboot和shutdown两个命令

    字段3:
    如果省略, 相当于(root:root),表示可以通过sudo提权到root; 如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)。
    注意:如果没省略,必须使用( )双括号包含起来

    字段4:
    可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码
    eg:lucy ALL=(ALL) NOPASSWD: /bin/useradd
    表示: 普通用户lucy可以在任何主机上, 通过sudo执行/bin/useradd命令, 并且不需要输入密码

    字段5:授权给用户的操作
    逗号分开一系列命令或者ALL表示允许所有操作

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    15  # User privilege specification
    16 root ALL=(ALL:ALL) ALL

    17 # Members of the admin group may gain root privileges
    18 %admin ALL=(ALL) ALL

    19 # Allow members of group sudo to execute any command
    20 %sudo ALL=(ALL:ALL) ALL
  4. sudo暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码。不过有时间限制,Ubuntu默认为一次时长15分钟。

  5. 由于不需要超级用户的密码,部分类Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、[Mac OS X]。

    系统默认创建了一个名为 sudo 的组。只要把用户加入这个组,用户就具有了 sudo 的权限。
    至于如何把用户加入 sudo 组,您可以直接编辑 /etc/group 文件,当然您得使用一个有 sudo 权限的用户来干这件事:

    1
    2
    3
    4
    5
    cqd@cqd:~$ cat /etc/group
    root:x:0:
    lxd:x:117:cqd
    systemd-coredump:x:999:
    cqd:x:1000:
  6. 在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。当我们执行 sudo 命令时,相关日志都是会被记录下来的。root@cqd:/home/cqd# cat /var/log/auth.log

    1
    2
    3
    4
    5
    root@cqd:/home/cqd# cat /var/log/auth.log
    Apr 19 21:06:01 cqd useradd[1068]: new group: name=cqd, GID=1000
    Apr 19 21:06:01 cqd useradd[1068]: new user: name=cqd, UID=1000, GID=1000, home=/home/cqd, shell=/bin/bash, from=none
    Apr 19 21:06:01 cqd useradd[1068]: add 'cqd' to group 'adm'
    Apr 19 21:06:01 cqd useradd[1068]: add 'cqd' to group 'cdrom'

sudo su

根据以上的解释,sudo su就很容易理解了。

sudo su是当前用户暂时申请root权限,所以输入的不是root用户密码,而是当前用户的密码。

sudo是用户申请管理员权限执行一个操作,而此处的操作就是变成管理员。

[sudo -l]列出目前的权限。 从以下例子中就看出此用户的权限。

1
2
3
4
5
6
root@cqd:/home/cqd# sudo -l
Matching Defaults entries for root on cqd:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User root may run the following commands on cqd:
(ALL : ALL) ALL