当 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 输出的可滚动窗口。
创建 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
开始于
/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