Назад | Перейти на главную страницу

Как уведомлять об обновлениях безопасности только в Ubuntu (по почте)?

Я хочу, чтобы мой сервер уведомлял меня об ожидающих обновлениях безопасности. Но я не хочу получать уведомления обо всех доступных обновлениях. Как я могу это сделать?

Чтобы ответить на свой вопрос: я написал небольшой сценарий ruby, который сканирует текстовый файл, который отображается при входе в систему и содержит информацию об обновлении безопасности: 5 обновлений - это обновления безопасности

Он даже может входить на другие машины через ssh и проверять эту машину на наличие обновлений безопасности. Однако требуется ключ ssh без кодовой фразы. Было бы неплохо максимально ограничить права этого пользователя.

Он написан максимально просто, поэтому даже без знания рубина должен быть понятен.

#!/usr/bin/env ruby
# (c) 2013, Johannes Barre, igel@igels.net
# License: MIT

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

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')

Решение, аналогичное сценарию 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