如何查看SFTP上传文件的时间并仅监控SFTP上传的文件变更?
嗨,这个问题我之前做文件监控系统的时候刚好碰到过!inotify确实会把目录下所有变更都捞过来,不管是本地编辑、脚本写入还是SFTP上传,要精准过滤SFTP的上传事件,其实有几个实用的思路:
利用SFTP服务器的原生日志
绝大多数SFTP服务(比如OpenSSH自带的sftp-server)都会把操作日志写到系统日志里,比如Debian/Ubuntu是/var/log/auth.log,CentOS/RHEL是/var/log/secure。日志条目里会清晰记录谁在什么时间上传了哪个文件,比如类似这样:sshd[12345]: user johndoe uploaded /data/uploads/report.pdf via sftp
你可以直接解析这些日志来获取上传时间和文件路径,甚至可以写个小脚本把日志里的SFTP上传事件提取出来,和inotify的监控结果做交叉验证——比如inotify触发文件新增后,去日志里查最近的条目,确认是不是SFTP操作。给SFTP加自定义上传钩子
要是想更主动地捕获上传事件,还可以给SFTP服务加个钩子脚本。比如OpenSSH可以通过修改sshd_config的Subsystem配置,把SFTP请求转发到你的自定义脚本:Subsystem sftp /usr/local/bin/sftp-upload-hook这个钩子脚本可以基于
sftp-server做封装,当检测到文件上传完成时,自动记录当前时间(用date '+%Y-%m-%d %H:%M:%S')、文件名和上传用户,把这些信息写到专门的监控日志里,完全避开其他类型的目录变更。这种方式最精准,不会有误判。通过进程ID过滤inotify事件
inotify工具比如inotifywait支持输出触发变更的进程ID(PID),你可以用inotifywait --format '%w%f %p' -m /your/upload/dir来获取文件名和对应的PID,然后通过ps -p [PID] -o comm=查看这个进程是不是sshd或者sftp-server——毕竟SFTP上传的进程都是sshd的子进程。只要进程名匹配,就说明这个文件变更是SFTP操作触发的,同时你可以记录事件发生的时间作为上传时间。
这里要提醒几个小细节:
- 日志解析要注意日志轮转的问题,比如用
tail -F来实时跟踪日志,避免错过轮转后的内容; - 自定义钩子脚本要设置好权限,别给非root用户可写权限,避免安全风险;
- 用PID过滤的时候,因为SFTP进程可能上传完就退出,所以要尽快查询PID,不然可能查不到进程信息。
备注:内容来源于stack exchange,提问作者bt_bt_bt

