是否可以檢測文件何時下載?
我們有一個伺服器,每天都有另一個腳本 sFTP 和下載文件。
**問題:**是否可以檢測到文件已下載,然後讓我在完成後自動存檔文件?
澄清一下-我們託管文件,其他人來下載它。
這是他們使用的腳本:
let $command = 'sftp -b /usr/tmp/file.sftp someuser@myserver' show 'FTP command is ' $command call system using $command #status ##file.sftp## # Set local directory on PeopleSoft server lcd /var/tmp # Set remote directory on the remote server cd ar/in # Transfer all remote files to PeopleSoft get file.dat get file2.dat # quit the session bye
我可以想到 3 種可能為您提供解決方案的途徑。
1. 自定義 sftp 子系統
您可以通過包裝
sftp-server
守護程序sshd_config
並用您自己的腳本“覆蓋”它,然後該腳本可以攔截sftp-server
正在執行的操作,然後在您看到文件已下載時採取行動。覆蓋預設值sftp-server
很sshd_config
容易:Subsystem sftp /usr/local/bin/sftp-server
弄清楚在包裝腳本中要做什麼將是困難的部分。在
/usr/local/bin/sftp-server
:#!/bin/sh # ...do something... chroot /my/secret/stuff /usr/libexec/openssh/sftp-server # ...do something...
2. 看日誌
如果你打開調試,
sftp-sever
你可以讓它顯示文件何時打開/關閉和讀/寫到/從 SFTP 伺服器的日誌。您可以編寫一個守護程序/腳本來監視這些日誌,然後在需要時備份文件。關於如何實現這一點的更多詳細資訊已經部分包含在我對這個 U&L Q&A 平舖的回答中:SFTP 中的活動記錄級別以及標題為:SFTP 文件傳輸會話活動記錄的博文中的此處。可以增強 SFTP 日誌,使其如下所示:
Sep 16 16:07:19 localhost sftpd-wrapper[4471]: user sftp1 session start from 172.16.221.1 Sep 16 16:07:19 localhost sftp-server[4472]: session opened for local user sftp1 from [172.16.221.1] Sep 16 16:07:40 localhost sftp-server[4472]: opendir "/home/sftp1" Sep 16 16:07:40 localhost sftp-server[4472]: closedir "/home/sftp1" Sep 16 16:07:46 localhost sftp-server[4472]: open "/home/sftp1/transactions.xml" flags WRITE,CREATE,TRUNCATE mode 0644 Sep 16 16:07:51 localhost sftp-server[4472]: close "/home/sftp1/transactions.xml" bytes read 0 written 192062308 Sep 16 16:07:54 localhost sftp-server[4472]: session closed for local user sftp1 from [172.16.221.1]
然後,您需要開發一個守護程序/腳本來監視打開/關閉事件對的日誌。這些代表完成的文件傳輸。您還可以使用 syslog,它可以監視“CLOSE”日誌事件,並可以用於執行傳輸文件的複制。
3. 克朗
您可以利用Linux 核心在每次訪問文件時產生的Inotify事件。有一個名為Incron的服務,其工作方式與 Cron 類似。Cron 基於時間工作,Incron 基於文件事件工作。因此,您可以設置一個 Incron 條目來監控您的 SFTP 上傳目錄,並在檢測到特定文件事件時複製該文件。
查看inotify 手冊頁以了解各種事件的描述。我相信您會想要注意
read()
(IN_ACCESS
) 後跟close()
(IN_CLOSE_WRITE
)。這些將用於從 SFTP 伺服器複製的文件。Incron 規則如下所示:
<directory> <file change mask> <command or action> options /var/www/html IN_CREATE /root/scripts/backup.sh /sales IN_DELETE /root/scripts/sync.sh /var/named/chroot/var/master IN_CREATE,IN_ATTRIB,IN_MODIFY /sbin/rndc reload
如果您想嘗試使用此選項,這篇標題為:Linux incrond inotify: Monitor Directories For Changes And Take Action的文章顯示了更多所需的詳細資訊。