【问题标题】:Using tail with if and then statements将 tail 与 if 和 then 语句一起使用
【发布时间】:2015-10-12 19:29:40
【问题描述】:

尝试(理论上)跟踪最后两行(-n 2)的日志文件,然后使用 if/then 语句继续。当然,这将是一个从 launchctl .plist 调用的脚本。

在我的脑海里基本上是这样的,虽然不对……

#!/bin/sh

last-entry= tail -n 2 command # show only last two lines of log file

if last-entry is less than (<) two lines, then
    execute command here
fi

【问题讨论】:

  • 如果文件少于两行,你想做什么?
  • 是的。我对 tail 的理解是它一直在寻找新的条目,比如(保持活动触发器)? -- 少于两个是理想的,但是,如果只有一个新条目,我想运行一个命令。如果没有条目,则循环或(在我的情况下)我将创建一个 .plist 以使我的脚本保持活动状态。 [更新] 日志文件是 accountpolicy.log——如果是错误尝试,则打印一行,成功打印两行(总是重复时间码)。 :)
  • tail 本身不会等待或循环。但是,tail -f(和其他相关选项)确实如此。也就是说,在这种情况下,您明确不希望这种行为。并且您测试的任何方式都会“竞争”再次写入的日志文件。该日志文件何时/多久更新一次?
  • “种族”?请注意您的意思。为了回答您的问题,日志文件正在捕获(来自:apple's accountpolicy.log)“失败和成功”的登录尝试。除非我的计算机进入睡眠状态并且我需要登录我的帐户,否则日志文件很少更新。
  • 或者其他人在您做某事时尝试登录到您的计算机(可能远程假设也登录到那里)。在这种情况下,“竞赛”意味着从检查文件内容到执行计划对文件内容执行的任何操作的时间之间可能发生了变化,请参见 TOCTOUon wikipedia 例如。你在这里的最终目标是什么? execute command here实际上会做什么?

标签: macos if-statement grep tail logfile


【解决方案1】:

如果您要做的是测试文件是否包含完全两行,那么您只想使用wc -l 并将其内容输入标准输入(以避免wc 打印像往常一样输出文件名)。

#!/bin/sh

if [ "$(wc -l < /private/var/log/accountpolicy.log)" -ne 2 ]; then
    exit
fi

# Do whatever you want when it does contain exactly two lines here.

通过标准输入输入wc -l 文件在这里很重要,因为当正常调用时(即wc -l filenamewc“有帮助”将行数打印到标准输出,因此需要字段拆分/等。得到一个适合比较的数字。当wc 读取标准输入时,它没有文件名,因此不会这样做。

注意:

这种做法只有在您wc完成执行后才关心文件的实际内容时才安全。

如果您在脚本的其余部分使用文件的内容,那么这是一个经典的 Time-of-Check Time-of-Use 漏洞。有关此主题的更多信息,请参阅 MITRE 网站上的 this pagethis Wikipedia entry

【讨论】:

  • 是的,但是如果我运行这个脚本,因为它每秒被一个 .plist 调用,wc -l 不会因为日志文件没有被删除而总是显示两行吗?所以我的意思是,wc 怎么知道是否有新条目?
  • wc 将在 精确 时刻计算文件中的行数。不管有多少在那一刻都会被退回。如果它甚至在一微秒后发生变化,它不会注意到,直到它再次运行并且你得到新的数字。这才是重点。像这样每秒运行一个脚本既过分又快到不足以捕捉碰巧成功的蛮力尝试等(再次假设远程访问也很重要)。
  • 是的,我听到了。我想我已经明白了...参数是什么,比如说-ne 2——如果有比2更多的东西,有什么东西可以指挥吗?我遇到了一个问题。每次 .plist 事件执行 .sh 文件时;它正在执行脚本,因为该条目总是用&gt; 重置,它认为总是少于2...看看我要去哪里?
  • 什么“条目总是被重置”?您说该文件不断地从头开始重新创建,并且其中只有一行或两行。不是这样吗?它是否只是正常附加(因此会不断变长,直到某些东西截断或旋转它)? [/test 的其他标志记录在 hereherehere
  • 它每 24 小时重置一次,因为苹果将其添加到 .gz 文件中进行存储。当我使用您的代码时,尤其是 &gt; 命令;重置或删除文件的内容。但是,我不介意,如果是这种情况,那么代码将继续执行自身。有点奇怪。我正在尝试各种 ifelse 命令,但没有任何效果。似乎没有参数(-nq -eq -le -gt)不起作用。我什至将wc 放入变量中,但什么也没有。 :(
猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多