我正在查看/etc/init.d/sudo我的 Ubuntu 14.04 Linux 系统中的脚本。在阅读脚本时,我发现了以下声明:
find /var/lib/sudo -exec touch -d @0 '{}' \;
Run Code Online (Sandbox Code Playgroud)
@0这里的意义是什么?上面的语句有什么作用?
ter*_*don 12
这与bashor无关sudo。该find命令正在使用该-exec操作对找到的每个文件运行给定的命令。在这种情况下,正在运行的命令是
touch -d @0
Run Code Online (Sandbox Code Playgroud)
如果你检查man touch一个 GNU 系统,你会发现
-d, --date=STRING
parse STRING and use it instead of current time
Run Code Online (Sandbox Code Playgroud)
因此,这-d是一种选择要touch为目标文件设置的日期的方法。的@告知GNU实现的touch,这是定义为一个日期以来的纪元秒。由于它实际上是 0 秒,这意味着 UNIX 时间的最开始。检查这一点的一种简单方法是为 GNUdate命令提供相同的日期:
$ TZ=UTC date -d @0
Thu Jan 1 00:00:00 UTC 1970
Run Code Online (Sandbox Code Playgroud)
因此,您显示的命令将查找其中的所有文件和目录,/var/lib/sudo并将其上次修改日期设置为 1970 年 1 月 1 日星期四的 UTC 时间 00:00。
这条线存在的原因在下面的评论中得到了很好的解释:
@crisron 该行的目的是确保来自任何先前 sudo 实例的所有 sudo 密码都已过期。用户第一次运行 sudo 时,它会为每个会话在该目录中创建一个文件。Sudo 会在您下次运行文件时检查该文件上的时间戳,以决定是否再次要求您输入密码。此行确保当 sudo 守护程序重新启动时,下次用户 sudo 执行某些操作时必须重新输入所有密码。– 克罗
@0是纪元日期。更普遍的是@x 是纪元后的 x 秒。例如:
$ touch -d @0 foo
$ TZ=UTC0 ls -l foo
-rw-r--r-- 1 vinc17 vinc17 0 1970-01-01 00:00:00 foo
Run Code Online (Sandbox Code Playgroud)
注意:该实用程序的-d选项由 POSIX 指定,但仅适用于 ISO8601 格式的字符串。其他形式的字符串特定于每个实现,特别是@x 形式是 GNU 扩展。touch