【问题标题】:How can I add to this command to make "notifications" via a new terminal pops up with a message?如何添加到此命令以通过弹出消息的新终端进行“通知”?
【发布时间】:2015-01-29 14:03:18
【问题描述】:

我正在通过脚本使用这个命令:

watch "who | egrep -i 'user1|user2|user3'"

我正试图让它弹出一个新的终端并说:

“用户已登录”

我想用“&”在后台运行所有东西,但作为命令登录中的用户之一,我想让这个脚本弹出一个新终端并说这个用户已经登录。

我希望它仅在他们登录以及他们注销并重新登录时发生。

我知道如果我在前台运行初始命令,我可以看到我的“自定义”用户列表每 2 秒登录和注销一次,但我希望在后台运行它并让新终端弹出登录的特定用户。

我很抱歉重复我自己,但我会尽可能具体。

【问题讨论】:

  • 也许,试试notify-send而不是终端窗口。
  • 新终端或某种桌面通知窗口?此外,这似乎是获取此类通知的一种非常糟糕的方式。我认为观看 syslog 会更好,甚至更好的是某种系统记帐/跟踪解决方案。
  • @anishsane 我会调查一下,我只是想找出一种方法让用户登录的实例回显到新的术语或通知。
  • @Etan Reisner 我只能想象作为一个不熟悉这一切的人,有许多更好的途径来完成这件事。我只是试图以新手的身份去做,并找到一个简短的脚本来通知我当本地系统上的用户登录到他们的帐户时。
  • 你真的需要写一个守护进程什么的。您需要检测输出中的差异才能显示它们,而不仅仅是输出。 IE,您需要检测“谁”输出中的新行,或者按照其他人的建议,在系统日志文件中检测与人们进入系统的方式相匹配的新行(例如,通过 ssh)。 kdialog 是一个用于弹出消息的有用工具。 kdialog --passivepopup "user42 is online"

标签: linux bash watch


【解决方案1】:

watch 可以观察命令输出,但不能处理它。

我建议使用循环,它可以在迭代之间保存输出并检查差异。有这样的想法:

last_output=$(tempfile)
output=$(tempfile)

while true; do
  who | egrep -i 'user1|user2|user3' > $output

  # check for new users logged
  new_users=$(diff $last_output $output | grep '>' | cut -d ' ' -f 2)

  # if there is some, throw a notification
  if [ -n "$new_users" ]; then
    xterm -e "echo -e 'New users logged:\n$new_users'; read -n 1" &
  fi

  # we save the output
  mv $output $last_output

  sleep 2
done

这里我使用 xterm 来发出通知,但您可以使用其他工具,例如 libnotify(提供 notify-send)。并且因为 xterm 在执行完命令后停止,所以我添加了等待输入的read -n 1 命令,但是您可以使用sleep 使通知消失而无需用户交互。

编辑

要从文件中读取要观看的用户列表,您可以使用类似这样的方法(文件每行包含一个用户):

regex=$(tr '\n' '|' < path/to/file)
regex=${regex%?} # to remove the last '|'

【讨论】:

  • 似乎我已经接近了这条路,虽然我遇到了一些错误,但这确实是我试图弄清楚的事情!谢谢!
  • 编辑:如何从文件中提取用户列表而不是直接将名称放入脚本中?
猜你喜欢
  • 1970-01-01
  • 2018-07-13
  • 2015-06-23
  • 2016-08-31
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多