当目录被另一个用户更改时如何运行脚本?

当目录被另一个用户更改时如何运行脚本?

我知道已经有一些关于类似主题的讨论。但我基本上想做的是这样的。

我有一个名为的监视目录watched,每当有文件添加到该目录时,我都会触发一个名为的脚本,syncbh.sh该脚本将从该目录中取出文件并将其上传到远程服务器。

需要注意的是,文件是watched由一个用户(user2)在目录中创建的,但脚本却由另一个用户(user1)执行。

我试过使用因克龙来实现这一点,但仍然遇到一个大问题,因为虽然该脚本可以由具有 root 权限的用户 1 手动执行,但因克龙守护进程实际上永远不会被其他用户2的文件创建事件自动触发。

我考虑过信息传递会是一个更好的选择,但我不清楚这个语法是如何工作的。如果有更好的方法来实现这一点,或者我最终使用信息传递如果在该目录中创建/修改了文件,命令语法是什么以要求它监视/home/user1/watched目录并执行脚本?/usr/local/bin/syncbh.sh

任何帮助将非常感激。

答案1

使用inoticoming

您可以放入一个在启动时/etc/init.d/运行的脚本。inoticoming

  1. 创建一个新文件夹来保存该文件夹的inoticoming日志/最后:pidwatchedsudo mkdir -p /var/log/inoticoming/watched/

  2. inoticoming_watched在中创建脚本/etc/init.d/

* 记得更改 <path_to_folder> 和 <path_to_script> 以匹配文件夹的完整路径watched和要执行的脚本的完整路径

#!/bin/sh

case "${1}" in
    start)
        inoticoming --logfile '/var/log/inoticoming/watched/inoticoming.log' --pid-file '/var/log/inoticoming/watched/inoticoming_last_pid.txt' <path_to_folder> <path_to_script> \;
    ;;

    stop)
        kill -15 $(< /var/log/inoticoming/watched/inoticoming_last_pid.txt tee)
    ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
    ;;

    *)
    echo "Usage: ${0} {start|stop|restart}"
    exit 1
    ;;
esac
  1. 将脚本标记为可执行:sudo chmod u+x /etc/init.d/inoticoming_watched

  2. 确保调用的脚本inoticoming_watched是可执行的。

  3. 更新rc.d以使服务inoticoming_watched在启动时启动:sudo update-rc.d inoticoming_watched defaults

您可以检查inoticoming登录情况/var/log/inoticoming/watched

答案2

首先,安装信息传递

sudo apt-get install inoticoming

然后使用此命令:

注意正在进行的 inoticoming 进程,因为它们可以启动多次。

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • 该进程在后台运行并正在观察/home/user1/watched

  • 当在该目录中添加或更改文件时,/usr/local/bin/syncbh.sh将调用该脚本。

    • 在这种情况下,此脚本的参数是/home/user1/watched/<name_of_changed_or_modified_file>

    • {}被文件名替换

答案3

首先,看一下watched目录的脚本:

#! /bin/bash

folder=/path-to-watched

inotifywait -m -q  -e create  -e modify  '%:e %w%f' $folder | while read file
  do
    #make the sync here
  done

第二,以另一个用户(用户2)的身份进行同步:

sudo -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' 

现在,为了不让用户提示,您可以sudo在文件中设置密码,并在需要时从该文件中读取密码(请注意,您必须使用-Swithsudo从文件中获取密码)。

假设将你的sudo密码放在一个文件中passwd.txt,那么上面的命令将会很糟糕

sudo -S -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' < /path-to/passwd.txt

现在整体脚本将会像这样:

#! /bin/bash

folder=/path-to-watched

inotifywait -m -q  -e create  -e modify  '%:e %w%f' $folder | while read file
  do
      sudo -S -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' < /path-to/passwd.txt      
done

相关内容