AS/400展望台

OS/400のFTPでつまずかないために



リー・ポール著

新しいファイル転送プロトコル(FTP)機能を試用するたびにちょっとしたことでつまずいて先に進めなかったという経験が、多くのITプロフェッショナルたちと同様、あなたにもおありでしょう。同僚がファイヤーウォールのポートを特殊な設定に構成してしまったのかもしれません。また、販売業者の最新の製品一覧をインターネットからダウンロードしようとしたら、指定されたフォルダ中にあるファイルに名前が指定されていなかったという場合もあります。あるいは受信側のコンピュータでは読み取りが不可能なパック・フィールドのせいでダウンロードできない場合や、OS/400の名前形式のせいでダウンロードできないという場合もあるでしょう。

こういった厄介な問題で困っている人を私は何人も助けてきましたので、これらを解決するのに役立つヒントをまとめてみました。少しでも皆さんのお役に立てれば嬉しく思います。

OS/400のパック10進数データやゾーン10進数データの転送
iSeriesのFTPでは、(パック10進数やゾーン10進数などといった)特殊な数値データの転送がサポートされていません。こうした特殊な形式のデータを含んだファイルを他のiSeriesマシンに転送するには、BINARY (TYPE1) 転送タイプかまたはEBCDIC (TYPE E) 転送タイプを使用します。EBCDICタイプを使用する場合は、BLOCK転送モードを指定しなければなりません。ここで大切なのは、図1に示すように、データを転送する前にリモートのiSeries上で(DDSソースを使用して)ファイルを作成しておくことです。バイナリ・データを転送するときはBINARY転送タイプを必ず使用しなければなりません。また、BINARY転送タイプはSaveファイルや階層的ファイルシステム(HFS)のファイルを扱うときに必要です。2台のiSeriesマシン間で転送を行う場合は、BINARYモードとEBCDICモードのどちらでも構いませんが、大きなサイズのファイルの場合は、EBCDICモードによる転送の方が早く転送できる場合が多いようです。
この他の方法としては、データをSaveファイルに書き出し、そのSaveファイルをリモートのiSeriesマシンのSaveファイルにFTP転送し、リモートのシステム上でファイルを復元するという方法があります。この方法については後ほど詳しく説明します。特殊な数値形式のデータを含んだiSeriesのファイルをiSeries以外のシステムに転送するには、まずそのファイルをこうした特殊な形式でない(つまり印刷可能な形式)のファイルにコピーしてから、その一時ファイルをS/400以外のシステムにFTP転送します。

Saveファイルを正しく転送する
標準のFTPを使用してSaveファイルを転送し、転送先のシステム上でSaveファイルとして認識させないようにすることはできません。iSeriesマシン間でSaveファイルを転送する方法は2つあります。1番目の方法は、図2に示すように、データを転送する前にリモートのシステム上でSaveファイルを作成するという方法です。Saveファイルがリモートのシステム上に既に存在する場合は、そのSaveファイルをCLR SAVF (Clear Save File) コマンドでクリアしておくとよいでしょう。必ずクリアしなければならないというわけではありませんが、クリアしておかないと問題が発生することがあります。これには、図2のquote rcmd crtsavfコマンドを次のclrsafvコマンドの呼び出しで置き換えます。

quote rcmd clrsavf myrmtlib/mysavf

リモート側のシステム上でSaveファイルを作成する手順は、図1でDDSソース・メンバーを転送するのに必要なソース・ファイルを作成した方法と同じです。
これより簡単な方法として、図3のようなiSeriesマシン間の転送や図4のようなPCとiSeriesマシン間の転送では、名前形式1を使用して.savfというファイル拡張子がついたSaveファイルとして指定する方法があります。
PCとiSeriesマシン間の転送:PCからiSeries上のOS/400 IFSルートや共有フォルダ(IFSのQDLSサブディレクトリなど)などといった他のシステムへファイルを転送する場合や、SaveファイルをPCからiSeriesマシンに転送する必要がある場合は、図4に示したテクニックが重要です。PC固有のFTPクライアント・セッション内からNAサブコマンドを使用すると、不正FTPコマンドエラーが発生します。QUOTE SITE NA 1サブコマンドかQuote SITE NA 0サブコマンドを使用してFTPサーバー側でNAサブコマンドを実行すれば、この問題を解決できます。
iSeriesマシン間の転送:OS/400間でFTPを使用してファイル転送を行うときに名前形式を指定するには、名前形式サブコマンドNAを使用してローカル・マシンとリモート・マシンの両側で名前形式を切り換えます。
FTPではファイルの送受信の際にファイル定義を転送しません。ファイルの定義が存在しない場合は、FTPはフラットなシングル・カラムのファイルとしてファイルの定義を自動的に作成してしまいます。これではほとんどの場合うまくいきません。図1に示すように、リモートのiSeriesマシンに対してDDSを送信してから、ファイルを送信する前にそのDDSを元にファイルを作成することができます。しかし、図5ではより簡単で高速なソリューションを紹介しています。FTPセッション中で、ファイルをまずSaveファイルに書き出し、次にそのSaveファイルをリモートのiSeriesマシンに送信して、そのSaveファイルから元の復元させるという方法です。(ファイル圧縮ソフトウェアを使用して、ファイル定義を保持しながら転送するファイルのサイズを小さくすることもできます。)

スプール・ファイルの転送
FTPでのスプール・ファイルの転送は、そのスプール・ファイルの情報を物理ファイル中に移動してからでないと行えません。図6では、特定のOS/400のジョブ(たとえばREPORTGEN/USER/007217)から132文字のスプール・ファイルを、FTPコマンドを使用してリモートのサーバーに送信する方法を示しています。ここでは前の例で使用したquoteコマンドの代わりにsyscmdコマンドを使用している点に注意してください。syscmdコマンドはローカル・クライアント側でシステムレベルのコマンドを実行する際に使用し、quoteコマンドはサーバー側のサブコマンドを実行する際に使用します。今回の転送例の場合は、CLプログラム中にCRTPF (Create Physical File) コマンドとCPYSPLF (Copy Spool File) コマンドを入れておくのがよいでしょう。このようにして、FTPセッションを実行する前に、レコード長とスプール・ファイルの情報をプログラムのパラメータ経由で渡し、FTPセッションが正常に完了するかどうかを監視することができます。レコード長とスプール・ファイルの情報を渡せるようにプログラムを設定することによって、単一のCLプログラムとFTPスクリプトを使用して、さまざまなスプール・ファイルをシステム間で転送する操作を統合することができます。図7では、PCからスプール・ファイルを入手できるようにするための、同様な機能のPC上での設定方法を説明しています。

別ポート経由のFTPのルーティング
FTPセッションの接続先ポートとして異なるポートを指定しなければならない場合があります。特によく知られているのは、ファイヤーウォールを経由して接続する必要がある場合です。iSeriesのFTPは接続を確立する際に特定のポートを指定できる機能はありません。しかしFTP Openサブコマンドを使用すればこれをうまく回避できます。まず、FTPセッションを確立し、次にopenサブコマンドを発行します。セキュリティをクリアしてセッションを自動的にクローズさせるには、まずターゲットとする接続先ではなくても構わないので、どこか別の場所でセッションを確立しておく必要があります。こうすることにより、OS/400上でFTPを起動する際に何らかのホスト・アドレスを入力しなければならないため、問題の発生箇所をすばやく特定することができます。実際に接続できるFTPサーバーではないホストの正しいホスト名を入力すると、長時間のタイムアウト遅延が発生するでしょう。さらに、ファイヤーウォールを通過するために別のポートを指定する必要がある場合は、通常のFTPではロックダウンしてしまう可能性があり、そうなるとファイヤーウォールの外のFTPサイトや不正なFTPサイトへは接続できません。高速にしかも正常に接続するためには、自分自身のサーバーに接続してループバック・アドレスを使用してサーバーにループバックし、正しいIDとパスワードを入力してサインオンします。
対話型のセッションでポート8021を使用してリモート・サーバーに手動で接続している場合は、iSeriesのコマンドラインでFTPループバックを使用して接続し、以下のFTPサブコマンドを発行してください。

Close
Open www.remoteserver.com 8021
Enter your user ID
Enter your Password
Put localfile remotefile
Quit

FTPをバッチモードで実行したい場合は、バッチモードではユーザーIDとパスワードの入力を要求する機能が使えませんので、別の方法を使用しなければなりません。その方法とは、FTP userサブコマンドを使用するものです。userサブコマンドではパスワードをユーザーIDと一緒に指定するという点に注意してください。対話型モードでuserサブコマンドを使用する場合は、パスワードの入力は要求されません。

プロキシ・サーバー経由でFTPをルーティングする
iSeriesマシンやその他のFTPクライアントからリモートのインターネット・アドレスに対してFTP経由でファイルを送ろうとしてもうまくいかない場合は、ネットワーク上にあるプロキシ・サーバーがその原因となっていることがあります。プロキシ・サーバー経由でFTPを使ってリモート・ホストに接続しようとすると、「ホストに接続できません」というメッセージが出ることがあります。プロキシ・サーバーを通過するには、まずプロキシ・サーバーに接続してからプロキシ・サーバーのユーザーIDの中にリモート・ホストとそのホスト上でのユーザーIDを指定します。プロキシ・サーバーからのユーザーID入力要求に対しては、userid@remotehost.comといったように入力します。
たとえば、プロキシ・サーバーのアドレスがproxyserverである場合は、proxyserverをアドレスとして使用してFTPを起動します。ユーザーIDの入力を要求されたら、userid@remotehost.comという形式で入力します。最後に、パスワードを入力して接続を完了させます。

大きなサイズのファイル転送の性能向上
iSeriesマシンから他のプラットフォームへファイルを正常に転送するには、ファイルをEBCDIC形式からASCII形式に変換しなければなりません。この変換はFTPが自動的に行ってくれますが、その処理にはかなりの時間がかかり、変換を必要とするファイルのサイズが大きくなると転送時間がそれに比例する以上の割合で増大します。
iSeriesのCPY TOPCD (Copy to PC Document) コマンドを使用して、iSeriesのEBCDICファイルをASCII形式に変換することによりこのボトルネックを回避することができます。一度変換してしまえば、変換されたドキュメントはiSeries統合ファイルシステムのQDLSファイルシステム中のASCIIフォルダに格納されます。図8には、このコマンドを使用してファイルを転送する前に変換する方法が説明してあります。この方法により、実際のファイル転送に必要な時間と全体の処理時間の両方を短縮することができます。

リモート・フォルダからファイル一覧を取得する
OS/400のFTPクライアントを含むほとんどのFTPクライアントでは、List Server (LS)サブコマンドやDirectory (DIR) サブコマンドを使用して特定のフォルダ中にあるファイルの一覧を表示させることができます。また、これら2つのサブコマンドに対してDISKパラメータを指定することにより、ファイルの一覧をFTPユーザーのカレント・ライブラリにあるファイル(LSOUTPUTまたはDIROUTPUT)にダンプさせることができます。ユーザーはこのダンプされたファイルを読み込んで分析し、その内容に応じてアクションを取ることができます。このファイルを分析することにより、以下のことができます。

・ リモート・ライブラリをモニタして、ファイルが出現したときにリモート・ライブラリに対してそのファイルを送信する。

・ ローカル・ライブラリをモニタして、ファイルが出現したときにローカル・ライブラリに対してそのファイルを送信する。

・ ファイル名をインクリメントして古いバージョンのファイルが上書きされないようにする(たとえば、MYFILE34が存在している場合は新しいMYFILEをMYFILE35に送信する)。

・ システムが特定のファイルを削除するのを待ってからそのファイルの新しいバージョンを送信する(たとえば上述の転送では、MYFILEがまだ存在している場合、転送を遅延してあとで実行させる)。

・ ファイルが出現したときに他のジョブや関数を起動する。

・ ファイルやサブフォルダ中のファイルを取り出す。

・ ローカル・ライブラリやリモート・ライブラリ、あるいはローカル・フォルダやリモート・フォルダ中に存在するファイル有無を確認した上で、必要なジョブ関数を起動する。

こうしたアクションを制御するために、簡単なプログラムを作成してLSOUTPUTファイルやDIROUTPUTファイルの内容に応じてロジックを実行させることができます。図9に、QGPLライブラリ用にファイルを取得するスクリプトの例を紹介します。

バッチ転送前に接続を検証する
FTP転送の目的によっては、FTP関数を実行する前にFTPサーバーとの接続を検証する必要がある場合があります。最善の方法は、実際のFTP操作を実行する前にすべての接続とシステム設定を実行するスクリプトを準備しておくことです。図10に、この検証の基本的な形式とNOOPというFTPサブコマンドの使用方法を示してあります。NOOPコマンドを使用してリモート・システム上のFTPサーバーが応答しているかどうかを確かめることができます。このコマンドは必ず実行しなければならないものではありませんが、接続の検証に役立つコマンドです。

著者リー・ポール氏はSurround Technologies, LLCのCEO兼主席パートナーで、同社でのソフトウェア製品のアーキテクチャと開発に携わっています。



↑このページのトップへ
TOPPAGE

BELLDATA, Inc. Copyright reserved.