如何仅通过邮件通知 Ubuntu 上的安全更新?

如何仅通过邮件通知 Ubuntu 上的安全更新?

我希望我的服务器通知我即将发布安全更新。但我不想收到有关所有可用更新的通知。我该怎么做?

答案1

回答我自己的问题:我编写了一个小的 ruby​​ 脚本,它扫描登录时显示的包含安全更新信息的文本文件:5 个更新是安全更新

它甚至可以通过 ssh 登录到其他机器,并检查该机器是否有安全更新。不过,需要一个没有密码的 ssh 密钥。最好尽可能限制该用户的权限。

它写得尽可能简单,所以即使没有 Ruby 知识也可以理解。

#!/usr/bin/env ruby
# (c) 2013, Johannes Barre, [email protected]
# License: MIT

update_file = '/var/lib/update-notifier/updates-available'
conf = {
  mail_to: '[email protected]',
  servers: {
    name: :localhost, # name -> Server name for the mail
    other_server: '[email protected]', # log in to other-server.com using user updatecheck
    third_server: '[email protected]'
  }
}

def get_security_updates(str)
  str[/([0-9]+) updates are security updates/, 1].to_i
end

out = {}
conf[:servers].each do |name, host|
  if host == :localhost
    out[name] = get_security_updates(File.read(update_file))
  else
    out[name] = get_security_updates(`ssh #{host} 'cat #{update_file}'`)
  end
end

out.delete_if { |_, v| v == 0 }
unless out.empty?
  IO.popen(%|mail #{conf[:mail_to]} -s "Security updates pending"|, 'r+') { |io| io.print out.map { |host, updates| "#{host} has #{updates} security updates pending" }.join("\n") + "\n" }
end

设置一个 cron 作业,每天运行一次。我现在已经运行这个脚本几个月了,它运行良好。如果 Debian 显示相同的登录消息,那么它也应该适用于 Debian 系统。

这不是为 Ruby 1.9 编写的。我建议升级,因为 1.8 不再有安全更新,但如果你将 Hash 语法改回旧样式(:key => 'value'而不是key: 'value'),它应该可以运行

答案2

与 sh 脚本类似的解决方案

#!/bin/sh

FLAG=/tmp/updates_available.flag
UPDATEFILE=/var/lib/update-notifier/updates-available
if [ ! -f ${FLAG} ] 
then 
  touch ${FLAG}
fi

diff ${FLAG} ${UPDATEFILE} > /dev/null
if [ $? -eq 1 ]; then
  COUNT=`grep -c "0 updates are security updates" ${UPDATEFILE}`
  if [ ${COUNT} -eq 0 ]; then
    sendmessage "`hostname`: `cat ${UPDATEFILE}`" # choose how to send message
  fi
  cp ${UPDATEFILE} ${FLAG}
fi

相关内容