web-dev-qa-db-ja.com

FTPを介したファイルのテーリング

Windowsデスクトップからリモートサーバー上の大きなログファイルにアクセスしようとしています。 I のみこのリモートマシンへのFTPアクセスがあり、SSHアクセスはありません。

現在、私はWinSCPを使用してファイル全体をFTP経由でプルダウンしています。これは、毎回ファイル全体を転送する必要があることを意味します。ただし、ログファイルであるため、最後の数行だけが必要になる可能性があります。

私の帯域幅は厳しく制限されているので、これは特にイライラします。そのため、ファイル全体の転送には数分かかります。

シェルにアクセスできる場合は、tail -100のようなものを使用して最後の100行を取得することで簡単に実現できます。

FTP経由でこれを実行するための解決策を見つけたいと思います。連続テールである必要はなく、1回限りで十分であることに注意してください。

11
jwa

あなたがやりたいことは、間違いなくFTPで行うことができます。技術的には、中断されたファイルのダウンロードを再開するときにFTPクライアントが行うことと同じです。

ユーザーの観点からはわかりませんが、FTPクライアントが指定された数の末尾バイトのみの明示的なダウンロードをサポートしているかどうかはわかりません。

ただし、一部のFTPクライアントでは、以前にダウンロードしたファイルの新しい末尾のコンテンツを確実にダウンロードできます。

特にWinSCPでは、ログファイルのダウンロードを開始するだけです。次に、 上書き確認プロンプト で、再開を選択します(いいえのドロップダウンメニューにあります)ボタン)。ソースファイルが宛先ファイルよりも大きい場合にのみ、このオプションが明らかに使用可能であることに注意してください。

ログの最後の数行だけを本当にダウンロードしたい場合は、ダウンロードを開始する前に、ログファイルよりも少し小さいサイズのダミーのローカルファイルを作成することで、WinSCPをごまかすことができます。

上記のトリックを簡単に自動化することもできます。

fsutil file createnew mylog.log 100000000
winscp.com /command "open mysession" "get -resume /path_to_log/mylog.log" "exit"

fsutilの代替方法については、 Windowsシステムで大きなファイルをすばやく作成しますか? を参照してください。

さらに努力すれば、最初にログファイルサイズをチェックし、ログサイズより数キロバイト小さいダミーファイルサイズを自動的に計算するようにスクリプトを変更できます。

8
Martin Prikryl

WinSCPを使用してこれを行う方法がわかりません。実際には不可能な場合もありますが、通常は [〜#〜] rest [〜#〜] を使用できるはずです。コマンド。 RFC 3659 を参照してください。ただし、ファイルの後半からダウンロードを開始できるかどうか、またはすでにマーカーを受け取っている必要があるかどうかはわかりません。 RFC 3659は、少なくともSTREAMモードでは、これが可能であることを示しています。

FILE STRUctureを使用したSTREAMモードの転送は、データ自体に加えて再起動マーカーが転送されていなくても再起動される場合があります。これは、必要に応じてSIZEコマンドをRESTART(REST)コマンド、および標準のファイル転送コマンドの1つと組み合わせて使用​​することによって実行されます。

0
ChrisInEdmonton

あなたのニーズをサポートするソフトウェアについては聞いていません。しかし、あなたがプログラマーなら、Perlでこれを書く方法を理解する必要があります。

ここで私はすべてのファイルを取得する方法の例を見つけました。これはあなたの解決策ではありませんが、その方法を理解するのに役立ちます: http://www.perlmonks.org/?node_id=907019

別の、ライブラリNet :: FTPのヘルプ: http://search.cpan.org/dist/libnet/Net/FTP.pm

これを使用して、サーバーへのftp接続を開くことができます(最初の例)認証を行います(最初の例)

2番目のURLは、次の方法を使用してファイルの最後の部分を取得する方法を支援します。読み取りを開始するファイルのどこから読み取りを開始するか->読み取り(BUFFER、SIZE [、TIMEOUT])小さなSIZE部分を直接BUFFER変数に読み取ります

別の関数:length(BUFFER)は、取得するデータの量を示します。ゼロの場合は、おそらくEOF print( "$ BUFFER\n")単純な印刷バッファコンテンツを画面に表示します

これは完全な解決ではなく、その方法であることに注意してください。私がこれをすべて書く理由の1つは、おそらくあなたのタスクに対応できるソフトウェアがないことです。

そのプログラムの書き方がわからない場合は、スーパーユーザーではなく、stackoverflow.comで質問してください。助けの準備ができている多くのプログラマーがいます。

可能であれば、ftpサイトがダウンロードの再開をサポートしていることを確認してください。このファイルの終わりの部分を読むことは不可能ですが。

もう1つの部分的な解決策は、ログファイルのローテーション、1日または1時間の1つのファイルです。これは、ログファイルの成長速度によって異なります。

0
Znik