他のスクリプトが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
答え1
私はあなたに解決策を提供する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]
次に、オープン/クローズイベントペアのログを監視するデーモン/スクリプトを開発する必要があります。これは、完了したファイル転送を示します。 「CLOSE」ログイベントを監視し、送信されたファイルをコピーするために使用できるsyslogを使用することもできます。
3. イギリスクローナ
使用できる通知するファイルにアクセスするたびにLinuxカーネルによって生成されるイベント。というサービスがあります。イギリスクローナ動作原理は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:ディレクトリの変更を監視し、アクションを実行します。このオプションを試すには、さらに必要な詳細が表示されます。
答え2
アクティビティーを記録するように SSH サーバーを構成し、ログを解析してそのファイルがダウンロードされたことを確認できます。
ロギングを有効にするには、-l INFO
ファイルにsftpサブシステム行を追加します/etc/ssh/sshd_config
。次のようにする必要があります(パスはディストリビューションによって異なります。私はSuSE 11を使用しています)。
Subsystem sftp /usr/lib64/ssh/sftp-server -l INFO
これでSFTPセッションがログインします/var/log/messages
。
以下はsftpからダウンロードしたファイルのログです。
Dec 3 08:42:02 $HOSTNAME sftp-server[$PID]: session opened for local user user from [192.168.0.10]
Dec 3 08:42:03 $HOSTNAME sftp-server[$PID]: opendir "/home/user"
Dec 3 08:42:03 $HOSTNAME sftp-server[$PID]: closedir "/home/user"
Dec 3 08:42:18 $HOSTNAME sftp-server[$PID]: open "/home/user/file" flags READ mode 0666
Dec 3 08:42:19 $HOSTNAME sftp-server[$PID]: close "/home/user/file" bytes read 48843 written 0
これで、ファイルを解析してアクセスされたことを確認できます。たとえば、次のようになります。
#!/bin/bash
grep sftp /var/log/messages | grep -q $FILENAME
if [ $? -eq 0 ]
do something
else
do other thing
fi
SFTPロギングを有効にするには:https://serverfault.com/questions/73319/sftp-logging-is-there-a-way
答え3
パスと名前がわかっている場合は、次のことができます。
if [ -f $filename ];
then
archive
else
echo ""
fi
しかし、あなたはそのような情報を追加していません。