4

我想在后台运行的 bash 脚本中使用 notify-send 来通知用户脚本的进度。更具体地说,这是一个在插入 USB 闪存驱动器并使用 ClamAV 运行扫描时自动运行的脚本。

特别是在第 30 行和第 66 行。到目前为止,我没有任何运气。有人可以给我一些建议/帮助吗?谢谢。

#!/bin/bash
#doOnUSBinsert_0.2.sh
#Author : Totti
# Make it executable by running 'sudo chmod  x doOnUSBinsert_0.2.sh'


if ! [ -f /etc/udev/rules.d/80-doOnUSBinsert.rules ]
then        # rule not added
   cp "$0" /usr/bin/doOnUSBinsert
   chmod u x /usr/bin/doOnUSBinsert

#   echo 'SUBSYSTEM=="usb", ACTION=="add", RUN ="/path/to/script.sh"' | sudo tee     /etc/udev/rules.d/80-clamscan.rules
   echo 'SUBSYSTEM=="usb", ACTION=="add", RUN ="/usr/bin/doOnUSBinsert & "' | tee     /etc/udev/rules.d/80-doOnUSBinsert.rules
   if  [ $? -eq 0 ]
   then
     echo 'Rule Successfully added. See file "/usr/bin/doOnUSBinsert" if you wish to edit the command'
     exit 0
    else
     echo 'ERROR while adding rule'
     exit 1
   fi
fi



lfile="/tmp/doOnUSBinsert.log"     # udev
lfile2="/tmp/clamscanFromUdev.log"   # clamscan
lfile3="/tmp/doOnUSBinsert_mount.log"   # mount

notify-send "USB SCAN ON INSERT" "Currently scanning with ClamAV"

main ()
{
sleep 12  # let the partitions to mount

   #cat /proc/$$/environ | tr '�' 'n' >> /tmp/udevEnvirn.txt
echo "found $ID_SERIAL"   >> "$lfile"
  cat /etc/mtab | grep "^$part_c"   >> "$lfile.3"

if [ "$ID_SERIAL"x = 'x' ]
then
 echo "Exiting on empty ID_SERIAL"   >> "$lfile"
 exit 1
fi

#Eg: ID_SERIAL --> /dev/disk/by-id/usb-sandisk....42343254343543
#i=0
echo 'searching partitions'   >> "$lfile"

for partitionPath in  $( find /dev/disk/by-id/ -name "*$ID_SERIAL*part*" )
do
  echo "current partition = $partitionPath"   >> "$lfile"
 # part[i  ]="$( readlink -f "$partition" )"        # Eg Output: /dev/sdb1     , /dev/sdb2
  part_c="$( readlink -f $partitionPath )"   
  mpoint="$( cat /etc/mtab | grep "^$part_c"  | awk '{print $2}' )"

  echo "partitionPath= $partitionPath, part = $part_c, mountpoint=  $mpoint"  >>     "$lfile"

  echo "Scaning -->  $mpoint"  >> "$lfile.2"
  ############################################
  clamscan -r --bell "$mpoint"/*  >> "$lfile.2"
  #############################################
done
}

notify-send "USB SCAN ON INSERT" "Finished scanning with ClamAV"

main &
echo ______________________________________  >> "$lfile"
exit 0
4

2 回答 2

1

根据您运行脚本的方式,它可能无法访问显示变量。尝试export DISPLAY=:0.0在命令之前运行。

如果您以其他用户(即 root)身份运行脚本,那么您可能还需要以其他用户身份运行它su - <logged in user> -c notify-send ...(我通常不需要这样做,但我记得有一次必须这样做 - 但我不记得是哪个发行版或我当时正在使用的版本。)

于 2017-10-16T22:19:22.803 回答
1

我对 linux 世界很陌生,但是在寻找类似项目的解决方案时,我发现了THIS

提示:可在此处找到可用图标的概述。要从以 root 身份运行的后台脚本发送桌面通知(将 X_user 和 X_userid 分别替换为运行 X 的用户和用户 ID):

sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 'This is an example notification.'

希望这对其他人有帮助。

于 2020-01-22T11:30:49.450 回答