我想运行一个脚本来处理在收到后立即通过某个目录中的scp协议接收的每个文件。
我不想集中该目录,以避免尝试处理部分接收的文件。这也是阻止我使用inotify工具(https://github.com/rvoicilas/inotify-tools/wiki)的问题,我想,因为我无法知道文件在成功传输后是否已关闭,或者是否过早关闭
答案 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命令的远程服务器上:
要获取文件,请将-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