Contents

我们为什么要使用su - 而不仅仅是su?

1. 概述

当 Unix 的第一个版本发布时,它拥有的一个最重要的特性是多用户支持,它允许用户共享一台计算机。对于此类系统的管理,需要一个用户切换工具。

在本教程中,我们将了解*su * 以及*–*参数的可能含义。

2. Linux用户环境

当 Linux 中的新终端启动时,操作系统会创建一个新的 shell 会话。除非我们另外指定,否则几乎所有发行版都默认使用Bash

当 shell 启动时,它会为自己准备一个环境。该环境的作用类似于小型键值存储,其中包含一些命令需要工作的基本信息。

例如,基于 Linux 的系统上的pwd 命令从PWD 环境变量中读取当前工作目录。cd –命令需要OLDPWD变量来查找上次访问的目录。当我们在 shell 上运行任何命令时,有关该命令的历史记录将被写入路径HISTFILE 处的文件。环境变量在后台为我们管理大量信息。

shell通过调用特定脚本来创建环境变量 。并非所有 shell 都具有相同的环境变量,不同的 shell 类型可能会调用不同的脚本或具有不同顺序的相同脚本。

~# env
TERM=xterm-256color
HISTFILE=/home/test/history
PWD=/home/test
OLDPWD=/home/test

3. su

su 是 Linux 中的核心实用程序之一。它允许用户以另一个用户的身份执行命令。

su最常见的用途是获得超级用户权限。它经常被误认为是“超级用户”的缩写,但它是“替代用户”的缩写。

使用 su时,我们可以使用或不使用*–参数来运行它。该参数告诉su*调用登录 shell,它会重置所有环境变量并再次创建它们。如果我们省略此选项,几乎所有现有的环境变量都将保持不变。这个单个字符对更改用户后将运行的命令有很多含义。

3.1. 文件夹差异

当我们使用*su –*时,命令将我们当前的工作目录更改为目标用户的主目录。另一方面,su命令并没有改变我们的目录,我们在切换用户后保持在同一个目录中:

test@server:~$ pwd
/home/test
test@server:~$ su -
Password:
root@server:~# pwd
/root
root@server:~# logout
test@server:~$ su
Password:
root@server:/home/test# pwd
/home/test

3.2. 路径和命令差异

所有用户在环境中都有自己的路径。 例如,  ls 通常位于*/usr/bin/ls中。但是,我们可以在不输入完整路径的情况下调用它。这是可能的,因为/usr/bin/*已经在我们的路径中,因此可以直接调用来自该位置的命令。

su –将我们的路径更改为目标用户的路径,而su不会。让我们尝试使用fdisk命令

test@server:~$ fdisk
bash: fdisk: command not found
test@server:~$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
test@server:~$ su -
Password:
root@server:~# fdisk --version
fdisk from util-linux 2.33.1
root@server:~# env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@server:~# logout
test@server:~$ su
Password:
root@server:/home/test# fdisk
bash: fdisk: command not found
root@server:/home/test# env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

这里要注意的重要一点是,不同的用户在他们的路径中可以有不同的命令。例如在 Debian 中,fdisk存在于 root 用户的路径中,但不存在于其他用户的路径中。这并不意味着我们不能在不调用su – 的情况下使用fdisk ,这意味着我们已经使用它的完整路径调用了它。

环境变量也会以不同的方式影响一些命令。大多数 shell 将您编写的命令记录在历史文件中。Shell 从*HISTFILE=*变量中读取该文件的位置。

使用不带 – 参数的su会将新命令写入旧用户的历史记录。如果使用该参数,则将新命令保存到目标用户的历史记录中。

3.3. 窗口系统差异

一些命令带有图形用户界面。此类命令从环境变量中读取要使用的显示器。使用*su –*将重置我们的环境变量。要在当前显示中启动图形应用程序,我们需要通过不使用 - 来保留环境变量。

test@server:~# su -
Password:
root@server:~# gparted
(gpartedbin:4118): Gtk-WARNING **: 14:50:36.017: cannot open display:
root@server:~# logout
test@server:~# su
Password:
root@server:/home/test# gparted
bash: gparted: command not found
root@server:/home/test# /usr/sbin/gparted
======================
libparted : 3.2
======================

请注意,现有环境的路径中缺少gparted命令,因此我们指定了二进制文件的绝对路径。