在 Linux 上使用 sudo 时,它会要求输入 root 密码,但仅限于第一次运行它时。如果您运行另一个 sudo 命令,它会记住您之前已经输入过密码并且不会要求输入密码:
thomas@ubuntu:~$ sudo id
[sudo] password for thomas: ******
uid=0(root) gid=0(root) groups=0(root)
thomas@ubuntu:~$ sudo id
uid=0(root) gid=0(root) groups=0(root)
sudo 是如何做到的?这些信息存储在哪里?我的想法是它会记住终端 id(如 pts/1),但是它存储在哪里?第一个 sudo 进程在执行完该命令后就结束了,对吗?
我知道 sudo 是一个 setuid 程序,因此它始终具有 root 权限,但我仍然想不出一个好地方来存储用户已输入密码的信息。是否涉及一些守护进程?
答案1
这些信息存储在哪里?
它可能在/var/db/sudo
or下/var/run/sudo
,您可能会找到用户名目录,其下的文件按 tty 编号排序。
授予的实际权限(包括必须再次输入密码之前会话持续的时间)取决于 sudoers 的设置方式。有一些设置可以授予/限制很多不同的事情,但这些设置不存储在仅存储时间戳的这些文件中。会话持续多长时间,或者 sudo 需要再次提示输入密码时,由当前时间和此目录中的会话时间戳的增量以及 sudo 设置为允许会话持续多长时间决定。
答案2
尝试man sudo
查看 FILES 部分:
/var/lib/sudo 包含时间戳的目录
并且在SECURITY NOTES
sudo 将检查其时间戳目录的所有权(默认为 /var/lib/sudo )[...]
(Debian 6.0.4 的手册页)