Files

是否可以檢測文件何時下載?

  • December 3, 2014

我們有一個伺服器,每天都有另一個腳本 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-serversshd_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的文章顯示了更多所需的詳細資訊。

引用自:https://unix.stackexchange.com/questions/171141