
Windowsデスクトップからリモートサーバー上の大きなログファイルにアクセスしようとしています。のみこのリモート マシンには SSH アクセスではなく FTP アクセスが必要です。
現時点では、WinSCP を使用して FTP 経由でファイル全体をダウンロードしています。つまり、毎回ファイル全体を転送する必要があります。ただし、ログ ファイルなので、必要なのは最後の数行だけでしょう。
これは特にイライラさせられるもので、帯域幅が厳しく制限されているため、ファイル全体を転送するのに数分かかります。
シェルにアクセスできる場合は、tail -100
最後の 100 行を取得するなどして簡単に実現できます。
これを FTP 経由で実行するためのソリューションを見つけたいと思います。連続したテールである必要はなく、1 回限りで十分であることに注意してください。
答え1
あなたがやりたいことは、間違いなく 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 システムで大きなファイルをすばやく作成できますか?
もう少し努力すれば、スクリプトを変更して、最初にログ ファイルのサイズをチェックし、ログ サイズよりも数キロバイト小さいダミー ファイルのサイズを自動的に計算することもできます。
答え2
WinSCPを使ってこれをどうやって実行できるかは分かりませんし、実際不可能かもしれませんが、一般的には、休むコマンド。参照RFC 3659ただし、ファイルの後半からダウンロードを開始できるかどうか、またはマーカーをすでに受信している必要があるかどうかはわかりません。ただし、RFC 3659 では、少なくとも STREAM モードではこれが可能であることが示されています。
FILE STRUcture を使用した STREAM モード転送は、データ自体に加えて再開マーカーが転送されていない場合でも再開されることがあります。これは、必要に応じて SIZE コマンドを RESTART (REST) コマンドと標準のファイル転送コマンドの 1 つと組み合わせて使用することで実行されます。
答え3
あなたのニーズをサポートするソフトウェアについては聞いたことがありません。しかし、あなたがプログラマーであれば、これを Perl で記述する方法を理解している必要があります。
ここで、すべてのファイルを取得する方法の例を見つけました。これは解決策ではありませんが、実行方法を理解するのに役立ちます。 http://www.perlmonks.org/?node_id=907019
もう1つは、ライブラリNet::FTPのヘルプです。 http://search.cpan.org/dist/libnet/Net/FTP.pm
これを使用すると、サーバーへのFTP接続を開くことができます(最初の例)認証を行う(最初の例)
2 番目の URL は、次のメソッドを使用してファイルの最後の部分を取得する方法を示しています。 ->ascii これはログファイルなので、転送モードを ascii に設定します ->size (FILE) 開始位置をカウントするためのファイルのサイズを取得します ->restart (WHERE) ファイルのどこから読み取りを開始するかを指定するファイル コースを設定します ->read (BUFFER、SIZE [、TIMEOUT]) 小さな SIZE 部分を BUFFER 変数に直接読み取ります
他の関数: length(BUFFER) は取得するデータの量を示します。ゼロの場合は、おそらく EOF に達しています。print ("$BUFFER\n") は、バッファの内容を画面に印刷するだけです。
注意してください、これは完全な解決策ではなく、実行方法です。私がこれをすべて書いた唯一の理由は、おそらくあなたのタスクに適したソフトウェアがないからです。
そのプログラムの書き方が分からない場合は、スーパーユーザーではなく、stackoverflow.com で質問してください。助けを求めるプログラマーはたくさんいます。
可能であれば、FTP サイトがダウンロードの再開をサポートしているかどうかを確認してください。これがないと、ファイルの終了部分の読み取りは不可能です。
別の部分的な解決策としては、ログ ファイルのローテーション (1 日に 1 ファイルまたは 1 時間に 1 ファイル) が考えられます。これは、ログ ファイルが大きくなる速度によって異なります。