在桌面系统上定期运行 rkhunter

在桌面系统上定期运行 rkhunter

当 rkhunter 在我的系统上发现异常时,我想在我的桌面上收到警告。

我将一些看起来没问题的文件和目录列入白名单,/etc/rkhunter.conf所以我不再收到警告。

现在我想把这个命令放在某处:

sudo rkhunter --checkall --report-warnings-only | while read OUTPUT; do notify-send "$OUTPUT"; done

我知道如何使用,cron但那不起作用,因为我的电脑运行时间不规律,所以我必须把它放在哪里才能每天执行一次但不是在系统启动期间?最佳时间是启动后 30 分钟。

答案1

解决anachron方案notify-send

问题的答案是错误自动执行命令以 root 身份,其中 root 需要访问主用户的 dbus 会话。

1. 授予桌面会话的 root 访问权限(作为用户)

要让 root 用户访问默认用户的桌面,首先需要设置变量DBUS_SESSION_BUS_ADDRESS。默认情况下,cron 无权访问每次系统启动时都会更改的变量。为了解决这个问题,请将以下脚本放在您的主目录中并调用它~/dbus-session-export

#!/bin/sh
touch ~/.dbus/Xdbus
chmod 600 ~/.dbus/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > ~/.dbus/Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> ~/.dbus/Xdbus
exit 0

赋予其可执行权限:

chmod +x ~/dbus-session-export

~/.dbus/Xdbus并在启动程序中调用它。这将创建/更新包含 anachron 在每次系统启动时使用的所需 Dbus 环境变量的文件。

2. Cron 脚本(以 root 身份)

将脚本放入文件夹中/etc/cron.daily/并使其可执行:

sudo touch /etc/cron.daily/rkhunter-check
sudo chmod +x /etc/cron.daily/rkhunter-check

编辑文件gksu gedit /etc/cron.daily/rkhunter-check

#!/usr/bin/env bash
sleep 1800 # wait 30 minutes in case the script is called directly at boot
MAINUSER="$(awk -F: '$3==1000{print $1}' /etc/passwd)"
if [ -r "/home/$MAINUSER/.dbus/Xdbus" ]; then
    . "/home/$MAINUSER/.dbus/Xdbus"
fi
su $MAINUSER -c 'notify-send "starting rkhunter scan... "'
rkhunter --checkall --report-warnings-only | while read OUTPUT; do
if [ "$OUTPUT" != "" ]; then
    OUTPUT="${OUTPUT//[\`\"\']/}"
    su $MAINUSER -c $"notify-send \"rkhunter: $OUTPUT\""
fi
done

这将每天运行一次脚本,如果 rkhunter 运行生成任何输出(仅警告),则此脚本将作为每个警告的通知显示在屏幕的右上角作为用户


来源:

答案2

启动时运行,显示zenity

创建一个文件/usr/local/sbin/rkhunter-check并使其可执行:

sudo touch /usr/local/sbin/rkhunter-check
sudo chmod +x /usr/local/sbin/rkhunter-check

编辑文件gksu gedit /usr/local/sbin/rkhunter-check

#!/usr/bin/env bash
export DISPLAY=:0
MAINUSER="$(awk -F: '$3==1000{print $1}' /etc/passwd)"
LOG=/tmp/.rkhunter-warnings
rm -f $LOG
touch $LOG
rkhunter --checkall --report-warnings-only  | while read OUTPUT; do 
  if [ "$OUTPUT" != "" ]; then
    OUTPUT="${OUTPUT//[\`\"\']/}"
    echo "$OUTPUT">>$LOG
  fi
done
if [ "$(cat $LOG)" = "" ]; then
  #like this there is always a notification, even if there is no warning, it will show an empty notification.
  echo "#no warnings">$LOG
fi
if [ "$(cat $LOG)" != "" ]; then
  su $MAINUSER -c 'zenity --text-info --width 800 --title "Rkhunter warnings" < '"$LOG"
fi

如果 rkhunter 运行生成任何输出(仅警告),该脚本将显示为带有 rkhunter 输出的可滚动窗口。

  1. 创建 systemd 启动脚本

    创建脚本/etc/systemd/system/rkhunter.service

    [Unit]
    Description=starts rkhunter and displays any findings with zenity
    
    [Service]
    TimeoutStartSec=infinity
    ExecStartPre=/bin/sleep 1800
    ExecStart=/usr/local/sbin/rkhunter-check
    
    [Install]
    WantedBy=default.target
    

    使用以下方法更新 systemd:

    sudo systemctl daemon-reload
    sudo systemctl enable rkhunter
    sudo systemctl start rkhunter
    
  2. 开始于/etc/rc.local

    systemd在没有在运行时调用脚本的系统上/etc/rc.local,并在整个命令之前放置一个睡眠状态:

    gksu gedit /etc/rc.local
    

    /etc/rc.local在包含以下内容的最后一行之前添加此命令exit 0

    sleep 1800 && /usr/local/sbin/rkhunter-check &
    

两种解决方案都将等待 30 分钟,然后执行 rkhunter 检查以 root 身份


您还可以将此解决方案与通知发送解决方案结合起来,因为如果没有警告,zenity 对话框就不完美了。在这种情况下,通知就足够了

#!/usr/bin/env bash
export DISPLAY=:0
MAINUSER="$(awk -F: '$3==1000{print $1}' /etc/passwd)"
LOG=/tmp/.rkhunter-warnings
echo ""> $LOG
rkhunter --checkall --report-warnings-only  | while read OUTPUT; do 
  if [ "$OUTPUT" != "" ]; then
    OUTPUT="${OUTPUT//[\`\"\']/}"
    echo "$OUTPUT">>$LOG
  fi
done
if [ "$(cat $LOG)" = "" ]; then
  MAINUSER="$(awk -F: '$3==1000{print $1}' /etc/passwd)"
  if [ -r "/home/$MAINUSER/.dbus/Xdbus" ]; then
    . "/home/$MAINUSER/.dbus/Xdbus"
  fi
  su $MAINUSER -c $"notify-send \"rkhunter: no warnings\""
fi
if [ "$(cat $LOG)" != "" ]; then
  su $MAINUSER -c 'zenity --text-info --width 800 --title "Rkhunter warnings" < '"$LOG"
fi

来源:如何在以 root 身份启动时运行脚本

答案3

您可以使用cron。编辑如下:

crontab -e

有关如何使用的更多信息cron,请点击以下链接:

crotab 教程

相关内容