从 scp 接收文件后如何 运行 脚本

How to run a script after receiving a file from scp

我想 运行 一个脚本来处理通过 scp 协议在特定目录中收到的每个文件,在收到文件后立即处理。

我不想合并该目录,以避免尝试处理部分收到的文件。这也是阻止我使用 inotify 工具的问题 (https://github.com/rvoicilas/inotify-tools/wiki),我想,因为我无法知道文件是否在成功传输后关闭,或者是否过早关闭

纯 scp 没有这样的方法。我建议在某些 ssh 级别使用命令处理此问题,如下所示:

cat local_file | ssh user@host "tee > /path/to/remote_file && run_script.sh"

如果您可以访问客户端,这是最简单的方法。基本上 scp 不会做比这更复杂的事情,但它被封装在漂亮的小命令中。

如果您无法访问客户端(我之前的回答),您可以使用 ForceCommand 选项配置服务器,例如:

ForceCommand $SSH_ORIGINAL_COMMAND && run_script.sh

但这不是万无一失的,它会破坏正常的 ssh 连接,而且有点像 hack ...

有可能,这是一个很好的 hack,但很难设置。

您必须在 scp 中使用未记录的选项:-f 和 -t(参见 scp.c)。

在接收 scp 命令的远程服务器上:

  1. 在 /etc/password 中,您必须将 /bin/bash 替换为 shell 脚本
  2. Shell 脚本必须获取从客户端接收的参数(参见特殊参数 $@)
  3. 在 shell 脚本中,您选择要将要传输的文件发送到的目录
  4. 在shell脚本中执行scp -r -p -t /new/directory在scp代码中,-t初始化允许从当前连接传输的iamremote变量。
  5. 在shell脚本中在此之后执行一些动作,或者不
  6. 退出

要获取文件,请将 -t 替换为 -f

我目前正在编写这样一个 shell 脚本,多年来一直运行良好。

关于这些选项的更多信息: https://lists.gt.net/openssh/dev/41493?do=post_view_threaded https://blogs.oracle.com/janp/entry/how_the_scp_protocol_works