/etc/init.d/sudo
我正在Ubuntu 14.04 Linux 系统中查看该脚本。在阅读剧本时,我发现这样的说法:
find /var/lib/sudo -exec touch -d @0 '{}' \;
这里有什么意义@0
呢?上面的语句有什么作用呢?
答案1
bash
这与或无关sudo
。该find
命令使用-exec
操作在找到的每个文件上运行给定的命令。在这种情况下,正在运行的命令是
touch -d @0
如果你检查man touch
一下 GNU 系统,你会发现
-d, --date=STRING
parse STRING and use it instead of current time
因此,这是选择要为目标文件设置-d
日期的一种方法。touch
告诉@
GNU 实现touch
这是一个定义为的日期自纪元以来的秒数。由于它实际上是 0 秒,因此这意味着 UNIX 时间的开始。检查这一点的一个简单方法是为 GNUdate
命令提供相同的日期:
$ TZ=UTC date -d @0
Thu Jan 1 00:00:00 UTC 1970
因此,您显示的命令将查找其中的所有文件和目录,/var/lib/sudo
并将其上次修改日期设置为 1970 年 1 月 1 日星期四的 00:00 UTC。
该线存在的原因在中得到了很好的解释评论以下:
@crisron 该行的目的是确保来自任何先前 sudo 实例的所有 sudo 密码均已过期。用户第一次运行 sudo 时,对于每个会话,它将在该目录中创建一个文件。然后,Sudo 在下次运行文件时检查文件上的时间戳,以决定是否再次要求您输入密码。此行确保当 sudo 守护程序重新启动时,用户下次执行 sudo 操作时必须重新输入所有密码。 – 克罗
答案2
@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
注意:-d
该实用程序的选项touch
是由 POSIX 指定,但仅适用于 ISO8601 形式的字符串。其他形式的字符串特定于每个实现,特别是 @x 形式是 GNU 扩展。
答案3
该行执行以下操作:
/var/lib/sudo定义工作目录。
-exec touch -d @0 '{}' \;是要执行的操作。让我们把它分成几个部分:
-执行先于实际行动。
触摸-d更改文件时间戳解析参数字符串并使用它而不是当前时间。
@0是一个时间戳,相当于:
root@debian:/var/log# date -d @0
Wed Dec 31 21:00:00 ART 1969
所以底线是:
当 find 命令找到匹配项时,将时间戳更新为 Wed Dec 31 21:00:00 ART 1969。