我希望我的服务器通知我即将发布安全更新。但我不想收到有关所有可用更新的通知。我该怎么做?
答案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