別のスクリプトが毎日ファイルをsFTPしてダウンロードするサーバーがあります。
質問: ファイルがダウンロードされたことを検出し、ダウンロードが完了した後にファイルを自動的にアーカイブすることはできますか?
明確にするために–私たちはファイルをホストし、他の誰かが来てそれをダウンロードします。
これは彼らが使用するスクリプトです:
let $command = 'sftp -b /usr/tmp/file.sftp [email protected]'
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イベントを利用できます。 Cronと同様に機能するIncronというサービスがあります。 Cronが時間に基づいて機能するのに対し、Incronはファイルイベントに基づいて機能します。したがって、SFTPアップロードディレクトリを監視するIncronエントリを設定し、特定のファイルイベントが検出されたら、ファイルをコピーすることができます。
関連:Windowsでvmdkファイルを参照しますか?
さまざまなイベントの説明については、inotifyのmanページをご覧ください。 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:ディレクトリの変更を監視してアクションを実行するこのオプションを試してみる場合は、必要な詳細の詳細が表示されます。