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

时间:2015-06-29 12:11:09

标签: linux shell ssh

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

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

3 个答案:

答案 0 :(得分:1)

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

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

如果您有权访问客户端,这是最简单的方法。基本上scp并没有做比这更复杂的事情,但是它被封装在一个很好的小命令中。

答案 1 :(得分:1)

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

ForceCommand $SSH_ORIGINAL_COMMAND && run_script.sh

但这不是故障保护,它会破坏正常的ssh连接,而且它更像是黑客......

答案 2 :(得分:1)

有可能,这是一个非常好的黑客,但很难设置。

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

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

  1. 在/ etc / password中,你必须用shell脚本替换/ bin / bash
  2. Shell脚本必须从客户端获取参数(请参阅特殊参数$ @)
  3. 在shell脚本中,您选择要发送要传输的文件的目录
  4. shell文件中的
  5. 在scp代码中执行scp -r -p -t / new /目录,-t初始化允许从当前连接转移的iamremote变量。
  6. shell文件中的
  7. 在此之后执行一些操作,或者不执行
  8. 出口
  9. 要获取文件,请将-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