相关专栏:《Linux》
目录
1. sudo功能介绍
2. 任何人都能用 sudo 吗?
(1)查看配置文件/etc/sudoers
(2)修改/etc/sudoers提权
3. 改变sudo输入密码时间
4. 显示sudo 密码
5.常见 sudo 命令
-k 参数
-s 参数
-u 参数
参考文章
1. sudo功能介绍
sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。
配置sudo服务时,可以直接编辑配置文件/etc/sudoers,亦可以执行visudo命令进行设置,一切妥当后普通用户便能够使用sudo命令进行操作了。
2. 任何人都能用 sudo 吗?
不是。
一个用户要能使用 sudo
,应该在 /etc/sudoers
文件里进行相应的配置。
以下命令都是在root账户进行
(1)查看配置文件/etc/sudoers
cat /etc/sudoers
(2)修改/etc/sudoers提权
编辑 /etc/sudoers
文件来实现此改变。要在文件中添加这样的一行:
[用户名] ALL=(ALL:ALL) ALL
此处以vim /etc/sudoers作演示
- vim编辑/etc/sudoers
- (需要对vim编辑器操作有一定了解)
vim /etc/sudoers
- 找到Allows people in group wheel to run all commands这一行,在行后添加以下内容
- 进入vim后可以输入“ :set nu ”来设置行号方便查看,大概在100行(Centos 7)
- Ubuntu 大概在20行左右
- 编辑完成后使用“ :wq!”强制保存退出
-
[用户名] ALL=(ALL:ALL) ALL
下图是,/etc/sudoers界面
3. 改变sudo输入密码时间
如果你经常使用 sudo
命令,你肯定注意到过当你成功输入一次密码后,可以不用输入密码再运行几次 sudo
命令。
但是一段时间后,sudo
命令会再次要求你的密码。
这种现象跟运行 sudo
命令数目无关,跟时间有关。是的,sudo
默认在输入一次密码后 15 分钟内不会再次要求密码。15 分钟后,你会再次被要求输入密码。
然而,如果你想的话,你能改变这种现象。用以下命令打开 /etc/sudoers
文件:
vim /etc/sudoers
找到这一行:
Defaults env_reset
然后在这行最后添加以下变量,[new-value]
为想要 sudo
会话持续的时间数。例如,设数值为 20。
Defaults env_reset,timestamp_timeout=[new-value]
如果你希望每次使用 sudo
命令时都要求输入密码,你可以把这个变量赋值为 0 。想要 sudo
会话永远不过时,应赋值为 -1。
注意将 timestamp_timeout
的值赋为 “-1” 是强烈不推荐的。
4. 显示sudo 密码
你可能注意过,当 sudo
要求输入密码然后你开始输入时,不会显示任何东西 —— 甚至连常规的星号都没有。虽然这不是什么大问题,不过一些用户就是希望显示星号。
需要做的就是在 /etc/sudoers
文件里将下述的行:
Defaults env_reset
改成
Defaults env_reset,pwfeedback
然后保存文件。
现在,无论什么时候输入 sudo
密码,星号都会显示。
5.常见 sudo 命令
-k 参数
考虑下这种情况:输入密码后你刚刚运行了几个 sudo
驱动的命令。现在,如你所知,sudo 会话默认保持 15 分钟。假设在这会话期间,你需要让某些人访问你的终端,但你不想让他们可以使用 sudo
,你将会怎么做?
还好,有 -k
命令行参数允许用户取消 sudo
权限。这是 sudo
帮助页面man page对此的解释:
-k
,--reset-timestamp
不带任何命令使用时,撤销用户缓存的凭据。换句话讲,下一次使用
sudo
将会要求输入密码。使用这个参数不需要密码,也可以放到一个.logout
文件中来撤销 sudo 权限。当与一个命令,或者一个可能需要密码的操作一起用时,这个参数将会导致
sudo
忽略用户缓存的凭据。结果是sudo
要求输入密码(如果这是被安全策略所要求的),而且不会更新用户缓存的凭据。
-s 参数
有时你的工作要求你运行一堆需要 root 权限的命令,你不想每次都输入密码。你也不想通过改变 /etc/sudoers
文件调整 sudo
会话的过期时限。
这种情况下,你可以用 sudo
的 -s
参数。这是 sudo
帮助页面对此的解释:
-s
,--shell
如果设置了 SHELL 环境变量或者调用用户的密码数据库指定了 shell,就运行该 shell 。如果指定了命令,命令将会通过 shell 的
-c
参数将命令传递给该 shell 执行。如果没有指定命令,会执行一个交互式 shell。
所以,基本上这命令参数做的是:
-
启动一个新的 shell - 至于是哪一个 shell,参照 SHELL 环境变量赋值。如果
$SHELL
是空的,将会用/etc/passwd
中定义的 shell。 -
如果你用
-s
参数传递了一个命令名(例如sudo -s whoami
),实际执行的是sudo /bin/bash -c whoami
。 -
如果你没有尝试执行其他命令(也就是说,你只是要运行
sudo -s
),你将会得到一个有 root 权限的交互式的 shell。
请记住,-s
命令行参数给你一个有 root 权限的 shell,但那不是 root 环境 —— 还是执行的你自己的 .bashrc
。例如,在 sudo -s
运行的新 shell 里,执行 whoami
命令仍会返回你的用户名,而非 root 。
-u 参数
sudo -u 用户名,以该用户的身份执行命令。
比如创建文件,文件的拥有者,所属组就是“这个指定用户”
参考文章
技术|sudo 入门指南 (linux.cn)