得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

su 和 sudo 的差别

接触过 shell 的人多少应该指定 su 和 sudo,当需要提权的时候,sudo 是我们常常使用的一个命令。此外,su 也应该是一个比较常听说的命令,虽然个人电脑其实还蛮少用 su 的

接触过 su 的人,应该也看到过 su - 这种写法,那这和 su 有什么区别呢?

使用 su 切换到 root,读取变量的方式是 non-login shell,这样的方式下非常多的变量都不会改变,尤其是 PATH,所以 root 用的非常多的命令都仅仅能用绝对路径来运行,这样的方式仅仅是切换到 root 的身份

使用 su -,是 login shell 方式,是先以 root 身份登录然后再运行别的操作

假设仅仅要切换到 root 做一次操作就好,那么可以在 su 后面加个 -c,运行完这次操作后,又会自己切换回原来的身份

sudo 的运行有这样一个流程

  1. 当用户运行 sudo 时,系统于 /etc/sudoers 文件里查找该用户是否有运行 sudo 的权限

  2. 若用户具有可运行 sudo 的权限,则让按配置确定是否需要验证当前账户的 password

再来看看 /etc/sudoers 这个配置文件

  1. 单个用户

    假设要 username 这个用户能运行 root 的全部操作

    1
    2
    username ALL=(ALL) ALL
    username ALL=(ALL) NOPASSWD:ALL # 不需要输入当前账户的密码
  2. 用户组

    假设要 usergroup 这个用户组能运行 root 的全部操作

    1
    %usergroup ALL=(ALL) ALL
  3. 限制用户权限

    实际中常常不需要用户有那么大的权限,仅仅要让其具有负责范围的权限就能够了,比如管理 password 的人,就仅仅让其能进行 password 的管理,而没有别的权限,这就需要权限的控制了

    假设需要当前用户来管理 password,即 username 这个用户能使用 passwd 这个命令来帮 root 改动用户 password

    1
    username ALL=(root) /usr/bin/passwd

    假设仅仅是运行 sudo passwd 命令,改动的就是 root 的password,当然不希望普通用户能具有改动 root password 的权限,那么在 visudo 的时候就需要将命令的參数限制好,比如改成这样:

    1
    username ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
  4. 通过别名设置 visudo

    查看 sudoers 这个文件的时候,会看见一些别名,User_Alias 表示具有 sudo 权限的用户列表,Host_Alias 表示主机的列表,Cmnd_Alias 表示同意运行命令的列表,Runas_Alias,表示用户以什么身份登录。别名需要大写字母开头

    假设有几个 password 管理员,加上如下配置:

    1
    2
    3
    User_Alias PWMNG = manager1, manager2, manager3
    Cmnd_Alias PWCMD = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
    PWMNG ALL=(root) PWCMD
  5. sudo 搭配 su

    不难看出,sudo 仅仅是切换到别的用户然后运行命令,接着切回原来的账户,假设想要像 su 那样直接切换到 root,然后干自己想干的,这个时候就要将命令改成 /bin/su -,例如以下配置:

    1
    username    ALL=(root)    /bin/su -

    当然这个是需要小心的,因为这样配置后,username 就直接切换到 root 了

  6. sudo 输入密码的过期时间设置

    当希望 sudo 输入过一次密码以后,后续一段时间内都可以不再验证,就需要如下配置了:

    1
    Defaults env_reset, timestamp_timeout=20  # 20 分钟内不验证密码

be yourself, everyone else is already taken.