建议尽量以一般账户来操作 Linux 执行日常命令。等到需要设定系统环境时, 才变换身份为 root,这样相对来说比较安全。
1 su 命令
su 命令可以让我们在不登出当前用户的情况下,以另一个用户的身份登录系统1。
su 命令经常被用于切换身份到root 用户,当然它也可以切换身份到其它用户。语法为 su – [账户名]
。如果直接键入 su
,那么就会切换身份到root 用户,切换过程会要求输入 root 密码。密码确认后,就会切换到 root 账户:
1.1 完全切换
单纯使用su 切换成为 root 的身份,读取的变量设定方式为 non-login shell 的方式,这种方式下很多原本的变量不会被改变,即不是完全的 root 环境2。
可以看到 env 中 USER 对应的还是 vagrant 账户。
还有一种root 身份切换方式是 su -
:
两种方式之间的区别是:前者在切换到 root 账户之后仍然保持原账户环境,而后者会以登录的方式切换到 root 账户。su -
切换的 root 账户,exit
之后,会登出该账户,然后再进入原账户。
采用 su – 方式切换为 root 账户的方式,就是完全的 root 环境:
1.2 自动切换
通过 -c 选项,会以 root 身份执行命令后,自动切换回原身份。
/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”3。这个文件只有 root 账户才有权限查阅。
利用 -c 选项,我们会以 root 身份执行查阅影子文件的操作,之后直接切换回原始身份:
head命令可用于查看文档头 x 行内容,x 通过 -x 语法来指定,也可以用语法 -n x
。默认显示文档的前 10 行4。
1.3 切换为其他账户
通过 -l xxx
就可以切换为其他账户。假设目前登录的身份是 vagrant,我们想切换为 deniro,就可以输入命令:su -l deniro
:
总结如下:
l 尽量采用完整切换模式,即 su -
(后面会讲到 sudo,相对来说,sudo 指令更好用);
l 利用 -c 选项实现自动切换,格式为:su -c “{需要执行命令}”
;
l 利用 -l 选项切换为其他账户,格式为:su -l {其他账户}
。
2 sudo 命令
sudo 命令主要用于切换账户身份执行命令。具体流程为[v]:
1. 当执行 sudo 时,系统会在 /etc/sudoers 文件中判定该命令执行身份是否有 sudo 的权限;
2. 如果有 sudo 权限,就让其输入该账户自己的密码进行身份确认(如果是root 账户,则无须输入密码);
3. 身份确认后,就会执行接在sudo 后的指令。
2.1 切换账户身份执行命令
sudo 命令配合 -u
属性,可以切换到某个账户执行某些指令。格式为:sudo -u {希望切换的账户名} {需要执行的命令}
。比如我们当前的身份是 vagrant,希望在 tmp/ 下,以 deniro 账户身份新建一个 t1.txt,就可以键入:sudo -u deniro touch /tmp/t1.txt
。
ll 是 ls -l 的简写形式。
利用 sh -c 与 ;
还可以批量执行命令。比如我们希望以 deniro 的身份创建一个 /tmp/tt 文件夹,并在其中新建一个 test.txt 文件。就可以输入以下命令:sudo -u deniro sh -c "mkdir /tmp/tt; cd /tmp/tt; echo 'sudo test file' > test.txt"
2.2 sudoers 文件配置方式
/etc/sudoers 文件用于定义 sudo 使用权限。某些场景下(比如安装中间件),我们需要使用 sudo 执行原本属于 root 权限的指令。这就必须先使用 visudo 指令来修改 /etc/sudoers。为什么不直接使用 vi 指令呢?因为visudo 指令会在修改后,帮我们进行 sudoers 文件语法检查。vi 指令就没这功能,所以不推荐使用。
执行 visudo
指令后,会进入 sudoers 文件,其中有一行是这样的:
这里每一列的含义如下5:
1.可以使用 sudo 指令的账号;
2.登入者的来源主机名,即网络客户端主机名。ALL 表示无限制;
3.可切换的身份。ALL 表示可以切换成任何账户;
4.可执行指令,指令必须是绝对路径。ALL 表示可以执行任何指令。
因为配置了这一行,所以允许 root 指令运行任何 sudo 指令。我们可以仿照该配置,为新的账户添加 sudo 权限。形如:
deniro ALL=(ALL) ALL
。
配置保存后。输入 cat /etc/shadow
仍然会被限制:
但如果透过 sudo,即输入 sudo cat /etc/shadow
命令就可以执行。第一次使用,会被要求输入当前账户的密码。
加入之后,就可以使用 sudo -i
命令,切换身份为 root 账户。
2.3 wheel 群组方式
在 sudoers 文件中,配置 wheel 群组,就可以让加入这一群组的账户使用 sudo 指令。
wheel /wiːl/
visudo
之后,可以看到下面的配置:
这个配置会让任何加入 wheel 这个群组的账户,都能够使用 sudo 指令切换任何身份来操作任何指令5。
执行该命令 usermod -G wheel deniro
,就可以把账户 deniro
加入 wheel 群组。
这时的 deniro
账户就可以执行带 sudo 的指令咯。
usermod 可用来修改账户的各项设置。-G 表示修改附属群组,后面紧跟着群组名。命令格式为:usermod -G wheel {账户名}
。
2.4 免密使用方式
一般情况下,拥有执行 sudo 指令权限的账户,在调用 sudo 指令后,需要输入各自的账户,验证通过后才可以真正执行 sudo 之后的指令。
使用 visudo 命令,找到下面这一行,去掉最前面的 #
注释:
保存后,wheel 群组的账户就无须输入密码,就可以使用 sudo 指令啦。
3 su 与 sudo 命令之间的区别
su 命令需要输入的是 root 账户的密码,sudo 命令需要输入的是当前账户的密码。sudo 命令更安全,而且也更容易维护:
- 无须传播 root 账户的密码,增加了安全性;
- 由于无须传播 root 账户的密码,即使因为某些原因修改了 root 账户的密码,也不用重新分发一遍;
- 如果需要收回某些账户的 root 访问权限,无须更改root 账户的密码就可以直接收回(通过修改 sudoers 文件中的相应配置)。
[1] 深入理解 sudo 与 su 之间的区别.
[2] 鸟哥. 鸟哥的Linux私房菜 基础学习篇[M]. 第四版. 北京: 人民邮电出版社,2018:201.
[3] Linux /etc/shadow(影子文件)内容解析.
[4] Linux head命令.
[5] 鸟哥. 鸟哥的Linux私房菜 基础学习篇[M]. 第四版. 北京: 人民邮电出版社,2018:603-605.