一、su
1.命令详解
su
是switch user的缩写,用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户切换为 root 用户,从 root 用户切换为普通用户,以及普通用户之间的切换。
普通用户之间切换、普通用户切换至 root 用户,都需要知晓对方的密码,只有正确输入密码,才能实现切换。
从 root用户切换至其他用户,无需知晓对方密码,直接可切换成功。
su 用于临时切换身份到另一个指定的用户,未指定用户名默认为 root。
2.语法格式
su [options] [-] [user [argument...]]
su [选项] - [用户]
3.选项描述
-m, -p, --preserve-environment do not reset environment variables
#执行 su 时不改变环境变数
-g, --group <group> specify the primary group
#指定主组,此选项仅对 root 用户可用。
-G, --supp-group <group> specify a supplemental group
#指定一个附加组。此选项仅对 root 用户可用。
-, -l, --login make the shell a login shell
#将 shell 作为登录 shell 启动
-c, --command <command> pass a single command to the shell with -c
--session-command <command> pass a single command to the shell with -c
and do not create a new session
变更为帐号为 USER ,并执行指令(command)后再变回原来使用者。
仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。
-f, --fast pass -f to the shell (for csh or tcsh)
#适用于csh与tsch,使shell不用去读取启动文件。
-s, --shell <shell> run shell if /etc/shells allows it
#适用于csh与tsch,使shell不用去读取启动文件。
4.命令示例
1)切换用户 su 和 su -
su
和su -
不加用户,默认直接切到root,普通用户切换需要输入root密码。
su : 切换用户,环境变量不变,路径不变。
su - : 切换用户,环境变量随切换用户发生改变,回到家目录。
总结:
-
代表连带环境变量一起切换,不能省略。
环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。
①测试 su 命令:
[root@centos7 ~]#whoami
root
[root@centos7 ~]#pwd
/root
[root@centos7 ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos7 ~]#su cyan 切换用户
[cyan@centos7 root]$ whoami
cyan
[cyan@centos7 root]$ pwd
/root 路径未改变
[cyan@centos7 root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PATH环境变量未改变
②测试 su - 命令:
[root@centos7 ~]#whoami
root
[root@centos7 ~]#pwd
/root
[root@centos7 ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos7 ~]#su - cyan 使用 su - 切换
Last login: Wed Mar 8 22:18:29 CST 2023 on pts/1
[cyan@centos7 ~]$ whoami
cyan
[cyan@centos7 ~]$ pwd
/home/cyan 路径已更改
[cyan@centos7 ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/cyan/.local/bin:/home/cyan/bin
PATH环境变量已更改
可以看到 su cyan
只是切换了cyan身份,但是工作目录仍然是root的工作目录,而用su - cyan
命令切换后工作目录变成cyan的工作目录,同时环境变量也发生变化。
2)切换用户并执行命令su -c ls root
临时切换帐号为 root 并在执行 ls 命令,输入root密码执行命令,执行完成后回到原用户。
[cyan@centos7 ~]$ su -c ls root
Password:
Desktop Documents Downloads Music Pictures Public Templates Videos
[cyan@centos7 ~]$
二、sudo
1.命令详解
su 切换到超级权限用户root后,超级权限的无限制,增加了系统安全性问题。这时我们就有必要用到 sudo。
通过sudo
,把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su来说,还是比较安全。
sudo 也能被称为受限制的su。
sudo执行命令的流程:
当前用户切换到root(或其它指定切换到的用户),需要输入当前用户的密码,然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户。
而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权。
2.语法格式
sudo [options] [-] [user [argument...]]
sudo [选项] - [用户]
3.选项描述
-A, --askpass use a helper program for password prompting
#使用辅助程序(可能是图形化界面的程序)读取用户的密码并将密码输出到标准输出。
-b, --background run command in the background
#把 sudo 所要运行的命令放到后台运行
-E, --preserve-env preserve user environment when running command
--preserve-env=list preserve specific environment variables
#向安全策略指示用户希望保存他们现有的环境变量。
-e, --edit edit files instead of running a command
#编辑文件,而不是运行命令
-g, --group=group run command as the specified group name or ID
#使用指定的组名或ID执行命令
-H, --set-home set HOME variable to target user’s home dir
#设置HOME变量为目标用户的HOME目录
-i, --login run login shell as the target user; a command may
also be specified
#以目标用户运行login shell;还可以指定命令
-K, --remove-timestamp remove timestamp file completely
#完全删除时间戳文件
-k, --reset-timestamp invalidate timestamp file
#失效时间戳文件
-l, --list list user’s privileges or check a specific
command; use twice for longer format
列出用户的特权或检查特定命令;使用两次是较长的格式
-n, --non-interactive non-interactive mode, no prompts are used
#非交互模式,不使用提示
-p, --prompt=prompt use the specified password prompt
#使用指定的密码提示符
-r, --role=role create SELinux security context with specified role
创建SELinux安全上下文规则
-S, --stdin read password from standard input
-s, --shell run shell as the target user; a command may also
be specified
#以目标用户运行shell;命令还可以被指定
-u, --user=user run command (or edit file) as specified user name or ID
#按指定的用户名或ID运行命令(或编辑文件)
4.命令示例
1)指定用户执行命令 sudo -u root
以root身份使用useradd命令创建cat用户;
前提条件,当前用户需要加入/etc/sudoers中,否则会报错。
cyan is not in the sudoers file. This incident will be reported.
[cyan@centos7 ~]$ sudo -u root useradd testuser888
[sudo] password for cyan:
[cyan@centos7 ~]$ tail -1 /etc/passwd
testuser888:x:3457:3457::/home/testuser888:/bin/bash
5.将用户加至配置文件
vim /etc/sudoers
...省略...
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
cyan ALL=(ALL) ALL '添加用户'
## Allows members of the 'sys' group to run
...省略....
只有添加后,才能正确的使用sudo 命令。
三、su和sudo的区别
通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su来说,还是比较安全的,所以sudo 也能被称为受限制的su 。
另外,用户使用sudo命令,需要在配置文件/etc/sudoers来进行授权。
1.用法不同
su
:用来切换用户。
sudo
:使用超级用户来执行命令,一般是指root用户。
2.密码
两个命令的最大区别是:
su 命令需要输入 root 用户的密码。
sudo 命令需要输入当前用户的密码。
鉴于 sudo 命令要求输入的是其他用户自己的密码,所以,不需要共享 root 密码。同时,想要阻止特定用户访问 root 权限,只需要调整 sudoers 文件中的相应配置即可。
3.执行命令
su可以不带参数执行。
sudo需要带参数和命令执行。
4.默认行为
另外一个区别是其默认行为:
sudo 命令只允许使用提升的权限运行单个命令。
su命令会启动一个新的 shell,同时允许使用root 权限运行尽可能多的命令,直到明确退出登录。
因此,su 命令的默认行为是有风险的。
5.日志记录
sudo 命令是以目标用户(默认情况下是 root 用户)的身份执行命令,但是它们会使用 sudoer所配置的用户名来记录是谁执行命令。
而 su 命令是无法直接跟踪记录用户切换到 root 用户之后执行了什么操作。
6.灵活性
sudo 命令比 su 命令灵活很多,因为甚至可以限制 sudo 用户可以访问哪些命令。换句话说,用户通过 sudo 命令只能访问他们工作需要的命令。而 su 命令让用户有权限做任何事情。
一些 Linux 发行版(如 Ubuntu)默认禁用 root 用户帐户。鼓励用户在需要 root 权限时使用 sudo 命令。