说说 Linux 中的切换账户命令 su 与 sudo

建议尽量以一般账户来操作 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.

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页