1、su 命令
之前说到一个命令 su ,是用来切换用户的。见下图 命令 su - lys 中的 - ,是为了彻底切换用户,包括一些配置和环境变量等。如果不加 - 的话,见下图, 使用命令 pwd ,可以看到还在 /root 加目录下,但是系统显示 lys 用户。 再次使用 - ,就可以发现 pwd 之后,是在 /home/lys 加目录下面,而不是在 /root 加目录下了。在自己的加目录下,就会加载自己的一些配置文件。 接着做实验,见下图, 上图中“-c”表示以用户 lys 的身份执行命令 touch /tmp/lys.111 ,可以看到成功创建了 lys.111 文件。再看一下这个文件的详细信息,所有者是 lys ,所属组是 grp2 。 root 用户下可以直接切换为普通用户,普通用户也可以切换到普通用户,只是要输入密码,见下图, 上图的过程是,查看时间,然后切换到普通用户 lys ,再切换到普通用户 user5 ,需要输入密码,发现不能切换到用户 user5 ,这是因为之前操作的时候将 user5 锁定了。接着使用命令 Ctrl + d 登出,在 root 用户下更改一下用户 user5 密码,密码更改成功之后,重新切换用户到 lys ,再接着切换用户到 user5 ,然后输入密码。出现警告“su: 警告:无法更改到 /home/user5 目录: 没有那个文件或目录”,这是因为用户 user5 的加目录 /home/user5/ 不存在,所以没有用户的配置文件可以加载,才导致命令前缀显示成 “-bash-4.2$”。 怎么做可以使命令前缀正常显示呢?见下图, 创建一个用户的加目录 /home/user5 ,更改目录的所有者和所属组,然后再次切换用户,发现还是不行,因为用户的加目录下还是没有任何的配置文件。而在用户 lys 下面,即上图红色框框部分,就是用户加目录的配置文件,所以用户 lys 的命令前缀可以正常显示。 那怎么做才可以使用户 user5 的命令前缀正常显示呢?见下图, 系统有一个模板目录 /etc/skel/ ,通过拷贝可以复制到用户 user5 的加目录下,其中 “.bash * ” 中的 . 表示隐藏文件, “ * ”表示通配的,即以 .bash 开头的所有文件。拷贝完成后,不要忘记更改加目录的所有者和所属组。其中 !$ 表示上一条命令的最后一个参数。 接着来切换用户 user5 ,见下图, 可以看到命令前缀能正常显示了。然后注意一下红色框框里面的符号是不一样的,root 用户是 # ,普通用户是 $ ,这是有区别的。 那么,root 用户可以切换到普通用户,普通用户能不能切换到 root 用户呢?见下图, 结果显示可以的,只要知道 root 用户的密码就行了。
2、sudo命令
上面说的 su 命令可以让普通用户切换到 root 用户,前提是普通用户知道 root 用户的密码,既然普通用户知道了 root 用户的密码,就可以直接登录 root 账户,为什么还要通过普通用户切换到 root 用户呢?这是有点矛盾的地方,为了更加安全,系统还有一个命令 sudo 。它可以让普通用户临时去执行一条命令,以指定用户的身份去执行,通常情况下都是给普通用户授权 root 用户的身份。 先来看一下配置文件,输入命令 visudo ,回车,见下图, 执行 visudo 这个命令可以打开 sudo 的配置文件,这个配置文件还是很重要,不能用命令 vi 去打开,可以看一下上图红色框框,实际上打开的是 /etc/sudoers.tmp 这个文件,也就是说我们可以用 vi 来编辑这个文件,但是不建议直接编辑。因为一旦有一些语法错误,会没有办法检测到,而使用命令 visudo 就可以检测到。 用方向键往下查看,找到下图红色框框的内容,见下图, 这一行内容是整个配置文件中最核心的一句配置,它表示允许 root 用户去运行所有的命令,在任何地方。接着在下面写一行内容,按字母“i”进去编辑模式,见下图, 三个 ALL 表示的意思不一样,左边的 ALL 表示在哪里,也就是主机。中间括号里面的 ALL 指的是用户,表示 lys 用户将会被授予哪个用户的身份,这个和 set_uid 有点像,但是又不太一样。具体不用深究,保持默认就可以。最后面这个 ALL 表示所有的命令,也可以写成一个命令或多个命令。 最后保存的内容,见下图, 上图编写加入的内容的目的是,为了让 lys 用户拥有 root 的身份去执行 ls 、 mv 和 cat 这三个命令。按 Esc 键退出,输入 :wq ,回车,保存并退出。接着就出现了下图的警告, 上面说了,命令 visudo 是可以检查错误的,也就是说,刚才写入的那一行内容是有错误的,现在按一下回车,也会有提示,见下图, 输入字母“e”,回车,进入重新编辑,输入 :set nu ,回车,可以查看行数,见下图, 按方向键往上查找,可以看看其他相似的内容是怎么写的,见下图, 上图可以看出,要写绝对路径,使用逗号分割之后,还要一个空格。重新编辑之后,见下图, 按上面内容填写,保存并退出。这次就没问题了。 之后切换到 lys 用户下面,就可以查看 /root/ 目录,见下图, 简单解释一下上图的流程,先是从 root 用户切换到 lys 用户,然后发现可以查看 /root/ 目录。接着验证一下,先登出,去掉 s 权限,再次切换为 lys 用户,接着查看 /root/ 目录。正常是不能查看的,这边居然可以查看,说明这边有问题,需要排查一下。使用命令 ls -ld /root/ 先查看一下目录的权限,发现用户权限没有问题,不包含 s 选项。用 ctrl + d 登出,在 root 用户下使用命令 ls -l /usr/bin/ls 来查看,发现命令 ls 的所属组有 set_gid 权限,这是之前设置的,才会出现这种情况。接着将命令 ls 中所属组的 s 选项去掉,再次切换用户为 lys ,然后查看目录 /root ,这时候就出现“权限不够”的警告了。 现在来检测 sudo ,见下图, 正常情况下,使用 ls 命令来查看 root ,是没有权限的,但是使用命令 sudo 就可以了。第一次使用的时候需要输入密码,第二次使用就不用了。 接着看一下 cat ,见下图,
以上就是 sudo 命令的作用,可以使普通用户临时拥有 root 用户的权限。这样操作就可以避免把 root 用户的密码给普通用户,只需要做个授权就可以了。 接着登出,继续看 visudo 的内容,见下图, 增加一行上图红色框框的内容,授权一下用户 user5 的权限,输入密码比较麻烦,所以写上 “NOPASSWD” ,然后退出并保存。见下图, 可以看出,用户 user5 使用 sudo 命令的时候不用输入密码了,然后 ls 直接输入还是使用绝对路径是没有影响的。 登出,使用命令 visudo 接着查看,一些指代别名,见下图, 上图中,Host_Alias 开头的这一行,fs1 是主机名,fs2 是用户,可以把 fs1 和fs2 全部放到 FILESERVERS 中。Host 可以设置 Alias ,User 也是可以的。User_Alias 中把 jsmith, mikem 这两个用户放到组 ADMINS 里面。其中,ADMINS 是一个虚拟的用户,这个虚拟用户里面有两个真实的用户 jsmith 和 mikem 。 还有一个 Cmnd_Alias ,命令的 Alias ,其中 NETWORKING 指代的就是“=”后面的那一大串命令。我们也可以模仿着写一个虚拟的指代命令,见上图最后一个红色框框。首字母需要大写,命令的别名也需要大写 LYS_CMD ,在之前增加用户 lys 的内容做个修改,然后保存退出。见下图, 接着来验证一下,见下图, 结果都没有问题。 除了以上的用法,还有一个概念,上述说的都是用户,针对组的就是 wheel ,见下图, 也就是说,第一个字段里面可以是用户组,也可以是用户。用户组也可以理解为一些用户。例如可以将用户 lys 、 user5 、user6 等用户做一个整合,放在同一个用户组,接着设置一个限制,就可以实现。
使用命令 visudo 还可以查看更多 sudo 的用法,这边就不多介绍。正常工作中偶尔会用到 sudo 命令,即使用到也不会特别复杂,掌握好以上知识点即可。