sudo
允许一个用户执行另一个用户才有权执行的命令。 通常情况下是一个普通用户去执行root
用户才有权执行的命令。
sudo
允许普通用户执行一些或者全部的root
权限的命令, 如halt
,reboot,su等等。 这样不仅减少了root
用户的登录和管理时间,同样也提高了安全性。 最主要的是,我们不需要知道root
用户的登陆密码。
sudo
官网:https://www.sudo.ws
大部分系统已经预先安装了sudo
,不过有些裁剪过的系统中可能没有预先安装, 这时候就需要我们自己安装了。
1、首先确认是否安装了sudo
:
command -v sudo
上面命令的执行结果如果是sudo
的路径,表明已经安装了sudo
; 如果为空,表明没有安装sudo
。如果需要安装的话,请继续执行下面的步骤。
2、查看当前有效用户是否是root
:
whoami
3、上面命令的执行结果如果是root
,就表示您当前有效用户是root
; 如果当前有效用户不是root
,就使用su -命令切换到root
用户。
su -
4、根据自己的情况执行下面的命令进行安装:
操作系统 | 包管理器 | 安装命令 |
---|---|---|
apt | apt-get install -y sudo | |
CentOS | yum | yum install -y sudo |
dnf | dnf install -y sudo | |
openSUSE | zypper | zypper install -y sudo |
Alpine Linux | apk | apk add sudo |
pacman | pacman -Syyu --noconfirm | |
Gentoo Linux | Portage | sudo emerge sudo |
step1、安装依赖
所有时 | Terminal + Shell + GNU CoreUtils |
下载时 | cURL |
解压时 | tar + gzip |
编译时 | gmake、gcc / GCC | Clang / LLVM |
运行时 | glibc ( libc.so 、libm.so 、libdl.so 、libutil.so 、libpthread.so 、ld-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
sudo
命令正常工作需要配合一个配置文件,这个配置文件是/etc/sudoers
。
从上面的安装过程,我们可以知道:/etc/sudoers
一定属于root
用户。
/etc/sudoers
这个配置文件的属性必须为0440
。也就是它是只读的, 其他用户有权查看他,但没权修改它。要修改它必须获得root
用户授权。
一般不要直接使用vi去编辑/etc/sudoers
, 因为/etc/sudoers
配置有一定的语法,直接用vi编辑并且保存, 系统不会检查语法,如有错也保存了可能导致无法使sudo
正常工作,最好使用visudo
命令去配置。 虽然visudo
也是调用vi去编辑,但是保存时会进行语法检查,有错会有提示。
其实/etc/sudoers
这个配置可以相当复杂,那是给系统管理员们准备的,如果你是一个运维工程师, 你就要详细的配置这个文件,小心的分配权限给这些普通用户了。但是,通常,我们只是简单的配置就可以了。
下面这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
命令后不用输入当前登录用户的密码。
有时候会出现提示:
sudo: sorry, you must have a tty to run sudo
解决办法:将Defaults requiretty
修改为#Defaults requiretty
,表示不需要控制终端。
有时候会出现提示:
sudo: no tty present and no askpass program specified
解决办法:添加Defaults visiblepw
。
什么时候需要修改/etc/sudoers
这个配置文件呢?显然是您创建了一个新用户或者创建了一个新的用户组的时候, 也就是您使用useradd创建了一个新用户或者使用groupadd命令创建了一个新用户组之后。
有时候,在使用sudo
命令的时候,您会遇到如下的提示:
xxx is not in the sudoers file.This incident will be reported
xxx
是您当前登录的用户名,这句提示的意思就是说xxx
这个用户没权执行sudo
命令,因为没有在/etc/sudoers
这个配置文件中对它进行授权。我们切换到root
用户下,给它授权了就好了。
sudo
命令的使用格式:
sudo [option]... [cmd]
--help
或者-h
查看sudo
命令的简要帮助,如下:
--list
或者-l
列出当前用户可以执行的命令。
示例:
--other-user
或者-U
列出指定用户可以执行的命令。 此参数必须与-l
参数一起使用。
示例:
当一次使用sudo
命令,提示输入当前用户的密码后,在一定的时间内, 再次执行sudo
命令,就不用输入当前用户的密码了。这个时间到底是多少呢? 在编译的时候就确定好了的,一般是5分钟,也就是说,距离上一次输入密码不到5分钟再次执行sudo
命令是不需要输入当前用户的密码的, 这样设计也是防止不停的输入密码,影响我们的效率。这5分钟是怎么实现的呢?实际上,就是在文件中记录了时间戳, 每次执行sudo
就去比较一下,如果这个时间戳文件不存在或者文件里面没有记录时间戳、再或者时间戳超过了5分钟, 就提示用户输入当前用户的密码。
--reset-timestamp
或者-k
参数就是把时间戳文件中的时间戳清除掉。
执行这个不需要输入命令。因为大不了多输入一次密码,没有什么害处。
当你要离开一下,最好执行一下此命令,防止别人在你离开的这段时间里执行了不该执行的命令。
示例1:
sudo -k
示例2:
sudo -l -k
--remove-timestamp
或者-K
参数是直接把时间戳文件清除掉。
执行这个不需要输入命令。因为大不了多输入一次密码,没有什么害处。
示例:
sudo -K
sudo
命令默认是以交互方式运行的,当需要用户输入当前用户的密码的时候,在控制台提示用户,并等待用户输入密码。
--non-interactive
或者-n
是以非交互方式运行, 当需要用户输入当前用户的密码的时候,直接出错。
示例:
sudo
命令默认是以交互方式运行的,当需要用户输入当前用户的密码的时候,在控制台提示用户,并等待用户输入密码。
--prompt
或者-p
就是让用户定制这个提示内内容的。
默认的提示如下:
示例:
下面的变量可以直接使用在提示中:
变量 | 说明 |
---|---|
%u | 当前用户 |
%U | 如果使用-u参数指定了用户,那么就是-u参数指定的用户,如果没有使用-u参数,那么就是root用户 |
%h | 机器名(简单) |
%H | 机器名(完整) |
--edit
或者-e
参数用来打开文件进行查看或者编辑。 相当于执行sudoedit
命令,通常使用nano
编辑器进行打开。
示例:
sudo -e /etc/profile
运行效果如下:
注意:^
是快捷键Ctrl
的意思。^X
表示Ctrl+X
, 虽然看上去字母都是大写,实际上,我们只要按下键盘上的对应字母即可。
--user
或者-u
用于指定要以哪个用户权限执行命令,默认是root
。
示例:
sudo -u mysql ls /mysql/data