sudo
1.1、sudo简介

sudo允许一个用户执行另一个用户才有权执行的命令。 通常情况下是一个普通用户去执行root用户才有权执行的命令。

sudo允许普通用户执行一些或者全部的root权限的命令, 如haltrebootsu等等。 这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。 最主要的是,我们不需要知道root用户的登陆密码。

sudo官网:https://www.sudo.ws

1.2、通过包管理器安装sudo

大部分系统已经预先安装了sudo,不过有些裁剪过的系统中可能没有预先安装, 这时候就需要我们自己安装了。

1、首先确认是否安装了sudo

command -v sudo

上面命令的执行结果如果是sudo的路径,表明已经安装了sudo; 如果为空,表明没有安装sudo。如果需要安装的话,请继续执行下面的步骤。

2、查看当前有效用户是否是root

whoami

3、上面命令的执行结果如果是root,就表示您当前有效用户是root; 如果当前有效用户不是root,就使用su -命令切换到root用户。

su -

4、根据自己的情况执行下面的命令进行安装:

操作系统包管理器安装命令
aptapt-get install -y sudo
CentOSyumyum install -y sudo
dnfdnf install -y sudo
openSUSEzypperzypper install -y sudo
Alpine Linuxapkapk add sudo

Arch Linux

ArcoLinux

Manjaro Linux

pacmanpacman -Syyu --noconfirm
pacman -S    --noconfirm sudo
Gentoo LinuxPortagesudo emerge sudo
1.3、通过编译源码安装sudo 

step1、安装依赖

所有时Terminal + Shell + GNU CoreUtils
下载时cURL
解压时tar + gzip
编译时gmakegcc / GCC | Clang / LLVM
运行时glibc ( libc.solibm.solibdl.solibutil.solibpthread.sold-linux-x86-64.so )

step2、使用curl命令下载sudo源码包 (

curl -LO https://www.sudo.ws/dist/sudo-1.8.27.tar.gz

step3、使用tar解压sudo源码包

tar vxf sudo-1.8.27.tar.gz

step4、进入sudo-1.8.27目录,并查看它的内容

step5、配置、编译、安装

./configure && make && make install
1.4、/etc/sudoers

sudo命令正常工作需要配合一个配置文件,这个配置文件是/etc/sudoers

从上面的安装过程,我们可以知道:/etc/sudoers一定属于root用户。

/etc/sudoers这个配置文件的属性必须为0440。也就是它是只读的, 其他用户有权查看他,但没权修改它。要修改它必须获得root用户授权。

1.4.1、编辑/etc/sudoers

一般不要直接使用vi去编辑/etc/sudoers, 因为/etc/sudoers配置有一定的语法,直接用vi编辑并且保存, 系统不会检查语法,如有错也保存了可能导致无法使sudo正常工作,最好使用visudo命令去配置。 虽然visudo也是调用vi去编辑,但是保存时会进行语法检查,有错会有提示。

1.4.2、/etc/sudoers的语法

其实/etc/sudoers这个配置可以相当复杂,那是给系统管理员们准备的,如果你是一个运维工程师, 你就要详细的配置这个文件,小心的分配权限给这些普通用户了。但是,通常,我们只是简单的配置就可以了。

1.4.2.1、给普通用户授予root用户的权利

下面这4个配置中的任意一个可能就是我们最常使用的:

userName ALL=(ALL) ALL
%groupName ALL=(ALL) ALL
userName ALL=(ALL) NOPASSWD: ALL
%groupName ALL=(ALL) NOPASSWD: ALL

说明:

userName ALL=(ALL) ALL表示允许用户userName执行sudo命令, 而且执行了sudo命令后要输入当前登录用户的密码。

%groupName ALL=(ALL) ALL表示允许用户组groupName执行sudo命令, 而且执行了sudo命令后要输入当前登录用户的密码。

userName ALL=(ALL) ALL表示允许用户userName执行sudo命令, 而且执行了sudo命令后不用输入当前登录用户的密码。

%groupName ALL=(ALL) ALL表示允许用户组groupName执行sudo命令, 而且执行了sudo命令后不用输入当前登录用户的密码。

1.4.2.2、Defaults requiretty

有时候会出现提示:

sudo: sorry, you must have a tty to run sudo

解决办法:将Defaults requiretty修改为#Defaults requiretty,表示不需要控制终端。

1.4.2.3、Defaults visiblepw

有时候会出现提示:

sudo: no tty present and no askpass program specified

解决办法:添加Defaults visiblepw

1.4.3、/etc/sudoers的修改时机

什么时候需要修改/etc/sudoers这个配置文件呢?显然是您创建了一个新用户或者创建了一个新的用户组的时候, 也就是您使用useradd创建了一个新用户或者使用groupadd命令创建了一个新用户组之后。

有时候,在使用sudo命令的时候,您会遇到如下的提示:

xxx is not in the sudoers file.This incident will be reported

xxx是您当前登录的用户名,这句提示的意思就是说xxx这个用户没权执行sudo命令,因为没有在/etc/sudoers这个配置文件中对它进行授权。我们切换到root用户下,给它授权了就好了。

1.5、sudo命令

sudo命令的使用格式:

sudo [option]... [cmd]
1.1、--help

--help或者-h查看sudo命令的简要帮助,如下:

1.2、--list

--list或者-l列出当前用户可以执行的命令。

示例:

1.2、--list -U <username|uid>

--other-user或者-U列出指定用户可以执行的命令。 此参数必须与-l参数一起使用。

示例:

1.3、-k

当一次使用sudo命令,提示输入当前用户的密码后,在一定的时间内, 再次执行sudo命令,就不用输入当前用户的密码了。这个时间到底是多少呢? 在编译的时候就确定好了的,一般是5分钟,也就是说,距离上一次输入密码不到5分钟再次执行sudo命令是不需要输入当前用户的密码的, 这样设计也是防止不停的输入密码,影响我们的效率。这5分钟是怎么实现的呢?实际上,就是在文件中记录了时间戳, 每次执行sudo就去比较一下,如果这个时间戳文件不存在或者文件里面没有记录时间戳、再或者时间戳超过了5分钟, 就提示用户输入当前用户的密码。

--reset-timestamp或者-k参数就是把时间戳文件中的时间戳清除掉。

执行这个不需要输入命令。因为大不了多输入一次密码,没有什么害处。

当你要离开一下,最好执行一下此命令,防止别人在你离开的这段时间里执行了不该执行的命令。

示例1:

sudo -k

示例2:

sudo -l -k
1.4、-K

--remove-timestamp或者-K参数是直接把时间戳文件清除掉。

执行这个不需要输入命令。因为大不了多输入一次密码,没有什么害处。

示例:

sudo -K
1.5、-n

sudo命令默认是以交互方式运行的,当需要用户输入当前用户的密码的时候,在控制台提示用户,并等待用户输入密码。

--non-interactive或者-n是以非交互方式运行, 当需要用户输入当前用户的密码的时候,直接出错。

示例:

1.5、-p

sudo命令默认是以交互方式运行的,当需要用户输入当前用户的密码的时候,在控制台提示用户,并等待用户输入密码。

--prompt或者-p就是让用户定制这个提示内内容的。

默认的提示如下:

示例:

下面的变量可以直接使用在提示中:

变量说明
%u当前用户
%U如果使用-u参数指定了用户,那么就是-u参数指定的用户,如果没有使用-u参数,那么就是root用户
%h机器名(简单)
%H机器名(完整)
1.6、-e <filePath>

--edit或者-e参数用来打开文件进行查看或者编辑。 相当于执行sudoedit命令,通常使用nano编辑器进行打开。

示例:

sudo -e /etc/profile

运行效果如下:

注意:^是快捷键Ctrl的意思。^X表示Ctrl+X, 虽然看上去字母都是大写,实际上,我们只要按下键盘上的对应字母即可。

1.7、--user <username|uid>

--user或者-u用于指定要以哪个用户权限执行命令,默认是root

示例:

sudo -u mysql ls /mysql/data