NEWS
Linux的なIBM i の使い方 Linux的なIBM i の使い方
2024.09.30

【Linux】第6回「ファイル転送」

【Linux】第6回「ファイル転送」

1. はじめに

前々回と前回の2回にわたり、OSSについて解説しました。いかがだったでしょうか。

[第4回「OSS Part-1」]では、RPMとyumの基本的な説明と、IBM i へのOSS環境の導入手順、ssh接続時のシェルやパスの設定等を取り扱いました。[第5回「OSS Part-2」]では、yumの詳細な解説と、OSSパッケージの更新、インストール手順およびテキスト・エディタ「vim」の簡単な使い方を解説しました。前回までの内容で、IBM i をLinux視点で使う基本的な事柄はだいたいカバーできたと思います。

前々回と前回を踏まえて、第6回ではファイル転送について解説します。ファイル転送とは、2つのシステム間で文字通り「ファイル」を送受信することを指しますが、システムは転送の指示を出すクライアントと、その指示を解釈してファイルの送信や保存を実行するサーバーに役割が分かれます。

この連載は「Linux 的な IBM i の使い方」なので、これまで解説したssh接続を使用して、 IBM i をファイル転送におけるサーバーやクライアントとして利用する具体的な方法を解説します。また、後半では、IBM i の累積PTFの入手を通して、より「Linux 的な」使い方を紹介したいと考えています。

ファイル転送においてサーバーの役割もクライアントの役割も実行できる IBM i ですので、今回の記事では「今はどちらの役割の説明なのかな」と考えながら読んでいただければ理解しやすいと思います。

前回も触れましたが、ssh接続時にデフォルト・シェルをbashに設定し、OSSパッケージがある /QOpenSys/pkgs/bin が PATH に設定されていることが前提で今後の連載を解説していきますので、設定には適宜、[第4回「OSS Part-1」]および[第5回「OSS Part-2」]を参照するようにしてください。

それでは始めていきましょう。

2. ファイル転送について

ファイル転送とは、文字通り「ファイル」をシステム間で送受信することだと言いました。では、IBM i でのファイルとは、具体的に何を指すのでしょうか。そこを、まず明確にしておきたいと思います。

データベース・ファイル

文字通り、「ファイル」といえば最初に思い出すのがデータベース・ファイルです。物理ファイルあるいはテーブルと呼ばれる、データを持つファイルのことです。「ファイルを転送する」とは、

  • データとしてではなく、IBM i のオブジェクトとして物理ファイルそのものを送受信する

ケースと

  • 他システムにデータベース・ファイルのデータを送信する
  • 他システムからのデータ受信する

のケースに分かれます。

前者は IBM i 同士でのみ有効な送受信(中間にWindowsなどのPCを経由する場合もある)で、後者は他システムとの送受信を意味します。

後者の場合は、物理ファイルもしくはテーブルから他システムが参照可能な形式にデータを「取り出す」、あるいは、受信したデータを物理ファイルもしくはテーブルに「取り込む」という作業が別途必要になる点に注意してください。

保管ファイル

保管ファイルは IBM i のオブジェクトで、保管コマンド(SAVLIB、SAVOBJ など)で物理的なテープ装置の代わりに使用可能な特別なファイルです。

IBM i のオブジェクトを他のシステムに送信したり、プログラムのソース・コードをメールで添付して送るなどの場合に良く利用されます。

ストリーム・ファイル

IBM i のファイル・システムであるIFSに保管されているファイルです。ファイルの送受信において、他システムとの間でデータをやり取りする際に良く使用されるCSVファイルなどは、IFSにストリーム・ファイルとして保存可能です。

特殊なストリーム・ファイルには、仮想テープ装置で使用する仮想テープ(イメージ・カタログ項目)などがあります。

上述した保管ファイルは1つのライブラリーしか保管できませんが、仮想テープは複数ライブラリーの保管が可能なので、日々のバックアップ等で利用されていることが多いと思います。

各ファイルの転送について

IBM i におけるファイル転送は、主に上述してきた3種類のファイル(データベース・ファイル、保管ファイル、ストリーム・ファイル)を対象に行われます。それぞれのファイルと転送の特徴を表にまとめました。

種類 形式 送受信相手 備考
データベース・ファイル *FILE IBM i オブジェクトとして転送
CSVなど 他システム データをCSVなどストリーム・ファイルに変換して転送
保管ファイル *FILE IBM i オブジェクトとして転送し、相手先で復元
ストリーム・ファイル CSVなど 他システム データそのものを転送
CSV以外 IBM i バックアップを転送し、相手先で復元
CSV以外 他システム 災害対策としてバックアップを別システムに送信

転送方式について

では、実際の転送はどのように行われるのでしょうか。

ファイルを転送するためには、ファイル転送を実行するプログラムが必要になり、TCP/IPでのファイル転送の場合はftp(File Transfer Protocol)です。ftpにはサーバーおよびクライアントがあり、両方とも IBM i で実行できます。

IBM i でftpサーバーを開始する際には、以下のコマンドを実行します。

 STRTCPSVR *FTP

IBM i でftpクライアントを実行する際には、FTPコマンドを実行します。

 FTP RMTSYS(<IPアドレスまたはホスト名>)

ftpは、同一LAN内の IBM i に対して、あるいは IBM i 同士でファイル転送する際には、一番手軽な方法だと思います。

ftpの特徴は、サーバーに接続(ログイン)後、ftpコマンドを実行することで、ファイル転送だけでなくファイルの一覧やコマンドの実行なども行える点です。例えば、ファイルの一覧表示(ls)、現行ディレクトリーの表示(pwd)、ディレクトリーの移動(cd)およびディレクトリーの作成(mkdir)などが実行可能です。

ftpを使えば、サーバー上のファイルを確認しながら受信したり、ディレクトリーを操作して送信できるので、良く利用されている方も多いのではないでしょうか。

一方で、ftpの一般的な利用を「制限している」あるいは「禁止している」ケースも見受けられます。その理由は、ftpのプロトコルの仕組み上、転送経路が暗号化されていないからです。データ転送なので、閉ざされたLAN内であれば問題にはならないと思いますが、インターネットを経由した転送の場合は、転送経路が暗号化されていないと盗聴の危険性があるので注意が必要です。

例えば、MacOSは、2017年からOS標準ではftpコマンドが利用できなくなっています。今後は危険性を考慮した上で、ftpを使わないケースが増えていくと思われます。

では、ftpに代わる安全なファイル転送の仕組みを考えてみましょう。現在 IBM i で利用可能な、通信経路を暗号化する代表的なファイル転送方法には、以下の 2 つがあります。

  • FTPS:SSL/TLSによる暗号化
  • sftp:sshによる暗号化

FTPSは、SSL/TLSを追加で構成することで、従来のftpの通信経路を暗号化します。ハイブリッドの暗号化なので、ftpの良さを損なうことなく暗号化を実現できます。一方、FTPSは追加の構成となるため、サーバー証明書の取得や、ファイアウォールの設定などの見直しが必要となり、環境によっては実現のハードルが高い場合もあるかもしれません。

一方、sftpはssh経由で実行されます。sshは、そもそも通信経路が暗号化されているので、ssh環境さえあれば、特別な設定をすることなく安全にファイル転送を行うことが可能です。また、クラウド・サービスもssh接続を前提としているものが多いため、クラウド上のサーバーとのファイル転送は、sftpを使用することが最も現実的で安全、かつ簡単に行うことができるといえるでしょう。

3. sftp

それでは、安全にファイルを送受信可能なsftpについて、具体的な使い方を通じて理解を深めていきましょう。操作方法はftpとほぼ同じなので、ftpを良く使われている方はすぐに理解していただけると思います。

PCから IBM i にsftpで接続

PCと、IBM i との間でファイルを送受信するには、sftpクライアントが必要です。OpenSSHソフトウェアがインストールされていれば、すぐにsftpを利用できます。インストール方法は、[第2回「ssh の仕組みをきちんと理解する」]を参照ください。

それでは、実際に接続してみましょう。IBM i で、sshdが開始されていることを確認してください。開始されていれば、クライアント(Windows)からsftpコマンドを実行して接続します。

 C:\Users\ogawa>sftp ogawa@172.23.0.238
 ogawa@172.23.0.238's password:
 Connected to 172.23.0.238.
 sftp>

指定方法は ssh 接続の時と同様、

  • sftp <ユーザー名>@<IPアドレスもしくはホスト名>

です。

sftpの接続が成功すると、プロンプトが sftp> になります。sftp接続を終了するには exit、quit もしくは bye を実行します。

 sftp> exit
 
 C:\Users\ogawa>

sftp接続後、使用する代表的なサブコマンドは以下の通りです。

サブコマンド 説明 使用例
pwd リモートの現行ディレクトリーを表示
lpwd ローカルの現行ディレクトリーを表示
ls リモートのリスト表示 ls -la
lls ローカルのリスト表示 lls -la
cd リモートのディレクトリーの変更
lcd ローカルのディレクトリーの変更
get サーバーのファイルをローカルに保存 get test.csv .
mget 複数のサーバーのファイルをローカルに保存 mget *.csv .
put ローカルのファイルをサーバーに送信 put test.csv .
mput 複数のローカルのファイルをサーバーに送信 mput *.csv .
exit, quit, bye sftp接続の終了

それでは実際に操作を行ってみましょう。sftpで IBM i に接続したあと、pwdおよびlsを実行します。

 C:\Users\ogawa>sftp ogawa@172.23.0.238
 ogawa@172.23.0.238's password:
 Connected to 172.23.0.238.
 sftp> pwd
 Remote working directory: /home/OGAWA
 sftp> ls -l
 drwxr-sr-x    3 ogawa    0            8192 Aug  6 16:33 builds
 drwxr-sr-x    2 ogawa    0            8192 Sep  5 13:17 scptest
 sftp>

sftpで接続した直後の現行ディレクトリーは /home/OGAWA で、その中にディレクトリーが2つ(buildsとscptest)あることがわかります。では、scptestディレクトリーに移動して、再度、lsコマンドを実行してみましょう。

 sftp> cd scptest
 sftp> pwd
 Remote working directory: /home/OGAWA/scptest
 sftp> ls -l
 -rwxr-xr-x    1 ogawa    0            2354 Sep  5 13:17 ftpSF99652.txt
 -rwxr-xr-x    1 ogawa    0          506593 Sep  5 13:17 ilstSF99652.txt
 -rw-r--r--    1 ogawa    0             993 Sep  5 13:17 sha256.txt
 sftp>

では、ファイルの転送を行ってみましょう。PC側(ローカル)の現行ディレクトリーを確認し、そのディレクトリー内の一覧を表示します。

 sftp> lpwd
 Local working directory: c:\users\ogawa
 sftp> lls
  Volume in drive C is Windows
  Volume Serial Number is 263A-9C54
 
  Directory of C:\Users\ogawa
 
 2024/09/05  14:17    <dir>     temp 
	          0 File(s)     0 bytes 
	          1 Dir(s) 338,652,487,680 bytes free 
 sftp>

tempディレクトリーが存在していることが確認できましたね。では、ローカルのtempディレクトリーに移動し、フォルダー内の一覧を表示します。

 sftp> lcd temp
 sftp> lpwd
 Local working directory: c:\users\ogawa\temp
 sftp> lls
  Volume in drive C is Windows
  Volume Serial Number is 263A-9C54
 
  Directory of C:\Users\ogawa\temp
 
 2024/09/05 14:17  <dir>. 
 2024/09/05 14:17  <dir>.. 
        0 File(s)     0 bytes 
        2 Dir(s) 338,651,926,528 bytes free 
sftp>

C:¥Users¥ogawa¥tempには、ファイルが一つも無いことが確認できました。

それでは、/home/OGAWA/scptest/sha256.txtを、PCのC:¥Users¥ogawa¥tempに転送します。

 sftp> get sha256.txt .
 Fetching /home/OGAWA/scptest/sha256.txt to ./sha256.txt
 /home/OGAWA/scptest/sha256.txt                                     100%  993     1.0KB/s   00:00
 sftp>

getコマンドの最後の「.」の意味は、「ローカル側のカレントフォルダー内の、tempフォルダー」を指します。「.」は現行ディレクトリーのことでした([第3回「シェルと基本コマンド」])。

では、ローカルにファイルが保存されたかを確認しましょう。

 sftp> lls
 Volume in drive C is Windows
 Volume Serial Number is 263A-9C54

 Directory of C:\Users\ogawa\temp

 2024/09/05 14:31 <dir>. 
 2024/09/05 14:31 <dir>.. 
 2024/09/05 14:31 993 sha256.txt 
         1 File(s)    993 bytes 
         2 Dir(s) 338,650,722,304 bytes free 
 sftp>

sftp接続を終了して、実際のディレクトリーでも確認してみましょう。

 C:\Users\ogawa>dir temp
 Volume in drive C is Windows
 Volume Serial Number is 263A-9C54

 Directory of C:\Users\ogawa\temp

 2024/09/05 14:31 <dir>. 
 2024/09/05 14:31 <dir>.. 
 2024/09/05 14:31 993 sha256.txt 
	        1 File(s) 993 bytes 
	        2 Dir(s) 338,650,750,976 bytes free 
	
C:\Users\ogawa>

ftpの操作と比べても、ほとんど違和感はないのではないでしょうか。もちろん、sftpなのでssh経由のアクセスであり、通信経路は暗号化されているので盗聴される心配はありません。

IBM i から別の IBM i にsftpで接続

では、次に、IBM i にssh接続した後で、別の IBM i にsftp接続してみましょう。この場合、IBM i をsftpクライアントとして操作します。

今回は、172.23.0.238 にssh接続し、そこから 172.23.0.236 にsftpで接続してみます。

 C:\Users\ogawa>ssh ogawa@172.23.0.238
 ogawa@172.23.0.238's password:
 -bash-5.2$

172.23.0.238 の現行ディレクトリーの確認と、その中の一覧を確認します。

 -bash-5.2$ pwd
 /home/OGAWA
 -bash-5.2$ ls -l
 total 32
 drwxr-sr-x    3 ogawa    0              8192 Aug  6 16:33 builds
 drwxr-sr-x    2 ogawa    0              8192 Sep  5 13:17 scptest
 -bash-5.2$

scptestディレクトリーには、先ほどPCに転送したファイルがあるのでそれを削除しておきます。

 -bash-5.2$ ls -l scptest
 total 16
 -rw-r--r--    1 ogawa    0               993 Sep  5 13:17 sha256.txt
 -bash-5.2$ rm scptest/sha256.txt
 -bash-5.2$ ls -l scptest
 total 0
 -bash-5.2$

では、172.23.0.236 にsftp接続し、現行ディレクトリーの確認とディレクトリー内の一覧表示を行ってみましょう。

 -bash-5.2$ sftp ogawa@172.23.0.236
 ogawa@172.23.0.236's password:
 Connected to 172.23.0.236.
 sftp> pwd
 Remote working directory: /home/OGAWA
 sftp> ls -l
 drwxr-sr-x    2 ogawa    0            8192 Sep  5 13:20 scptest
 sftp>

さらに、scptestディレクトリーの一覧を表示すると、3つのテキストファイルが存在していますので、これらを、172.23.0.238の同じディレクトリーに転送してみましょう。

 sftp> ls -l scptest
 -rw-r--r--    1 ogawa    0            2354 Sep  4 14:38 ftpSF99652.txt
 -rw-r--r--    1 ogawa    0          506593 Sep  4 14:38 ilstSF99652.txt
 -rw-r--r--    1 ogawa    0             993 Sep  4 14:43 sha256.txt
 sftp> lpwd
 Local working directory: /home/OGAWA
 sftp> lcd scptest
 sftp> lpwd
 Local working directory: /home/OGAWA/scptest
 sftp> lls
 sftp> mget scptest/* .
 Fetching /home/OGAWA/scptest/ftpSF99652.txt to ./ftpSF99652.txt
 /home/OGAWA/scptest/ftpSF99652.txt             100% 2354     1.9MB/s   00:00
 Fetching /home/OGAWA/scptest/ilstSF99652.txt to ./ilstSF99652.txt
 /home/OGAWA/scptest/ilstSF99652.txt            100%  495KB  10.1MB/s   00:00
 Fetching /home/OGAWA/scptest/sha256.txt to ./sha256.txt
 /home/OGAWA/scptest/sha256.txt                 100%  993   914.8KB/s   00:00
 sftp>

mgetで、scptest/* と指定しています。これは、scptestディレクトリー内の全ファイルを対象とするという意味です。実行結果を見ると、3つのファイルが転送されたことがわかります。ローカル・ディレクトリーを見てみましょう。

 sftp> lls -l
 total 1056
 -rw-r--r--    1 ogawa    0              2354 Sep  5 14:57 ftpSF99652.txt
 -rw-r--r--    1 ogawa    0            506593 Sep  5 14:57 ilstSF99652.txt
 -rw-r--r--    1 ogawa    0               993 Sep  5 14:57 sha256.txt
 sftp>

ご覧いただける通り、確かに転送されています。それでは、Windowsまで戻りましょう。sftpを終了して172.23.0.238に戻り、さらに、sshを終了します。

 sftp> bye
 -bash-5.2$ exit
 logout
 Connection to 172.23.0.238 closed.

 C:\Users\ogawa>

IBM i は、sftpファイル転送において、サーバーにもクライアントにもなることが可能であることを理解いただけたと思います。

EDIに代表される外部とのデータ連携に関しては、IBM i をsftpクライアントとして利用することが多いと思います。基本的な操作には、ぜひ慣れておいてください。

4. scp

sftpを使用すると、接続したサーバーのディレクトリーやファイルの一覧を表示して、どのファイルを転送するかを確認しながら作業ができるので、便利であることはご理解いただけたと思います。

とはいえ、転送するファイルの名前が既に分かっている場合は、転送のたびにsftpで接続してサブコマンドを入力することが、少し面倒に感じられる場合もあると思います。そのような場合、scpコマンドが便利です。

scpコマンドは、コマンドの引数として送信元のファイルと送信先を直接指定します。これにより、リモートサーバーにログインしてサブコマンドを実行することなく、ファイルを転送することが可能になります。

先ほど、172.23.0.238にsftp接続し、/home/OGAWA/scptest/sha256.txtを、PC のC:¥Users¥ogawa¥tempに転送しました。これと同じことを、scpで行ってみましょう。

まず、PCのC:¥Users¥ogawa¥temp¥sha256.txtを削除します。

 C:\Users\ogawa>dir temp
 Volume in drive C is Windows
 Volume Serial Number is 263A-9C54

 Directory of C:\Users\ogawa\temp

 2024/09/05 14:31 <dir>. 
 2024/09/05 14:31 <dir>.. 
 2024/09/05 14:31 993 sha256.txt 
        1 File(s)      993 bytes
        2 Dir(s) 338,664,370,176 bytes free
 
 C:\Users\ogawa>del temp\sha256.txt
	
 C:\Users\ogawa>

では、scpでファイルをローカルに転送しましょう。

scpの書き方は以下の通りです。

  • scp  <コピー元ファイル名> <コピー先ディレクトリかファイル名>
 C:\Users\ogawa>scp ogawa@172.23.0.238:/home/OGAWA/scptest/sha256.txt ./temp
 ogawa@172.23.0.238's password:
 sha256.txt                                    100%  993     1.0KB/s   00:00

 C:\Users\ogawa>

今回は以下のように指定しました。

  • scp ogawa@172.23.0.238:/home/OGAWA/scptest/sha256.txt ./temp
項目 設定値
ユーザー名 ogawa
ホスト名かIPアドレス 172.23.0.238
コピー元ファイル名 /home/OGAWA/scptest/sha256.txt
コピー先ディレクトリ名 ./temp

ホスト名とコピー元ファイル名の間にコロンを記述することを忘れないように気をつけてください。

ローカルのファイルをサーバーに送信したい場合は、上記の指定を逆にします。

  • scp ./temp/sha256.txt ogawa@172.23.0.238:/home/OGAWA/scptest

get なのか put なのかは、指定する場所で決まります。sftp とはこの点が異なるので注意が必要です。

コピー元のディレクトリー内のファイルを複数同時にコピーしたい場合は、`-r` オプションを指定します。サーバー 172.23.0.238 の/home/OGAWA/scptestディレクトリー内にあるファイルを、全てローカルに転送してみましょう。

 C:\Users\ogawa>scp -r ogawa@172.23.0.238:/home/OGAWA/scptest ./temp
 ogawa@172.23.0.238's password:
 ilstSF99652.txt                        100%  495KB  15.8MB/s   00:00
 ftpSF99652.txt                         100% 2354     2.3KB/s   00:00
 sha256.txt                             100%  993     1.0KB/s   00:00

 C:\Users\ogawa>

保管ファイルの転送

先ほど、保管ファイルもファイル転送の対象である、とお話しました。ここで、改めて「保管ファイル」とは何かと、転送時の注意点について整理したいと思います。

保管ファイルとは、IBM i のネイティブ・オブジェクトで、保管コマンド等を使用してライブラリーやオブジェクトを保存できます。ライブラリーは一つだけしか保管できないという制約がありますが、手軽にバックアップできるものとして利用されている方も多いと思います。

では、ライブラリー OGAWA に保管ファイル QSAVF を作成し、TATLIB ライブラリーを保管してみましょう。

サーバー 172.23.0.238 にssh接続し、systemコマンドを使って、IBM i のCRTSAVF(保管ファイルの作成)およびSAVLIB(ライブラリーの保管)コマンドを実行します。

 C:\Users\ogawa>ssh ogawa@172.23.0.238
ogawa@172.23.0.238's password:
-bash-5.2$ system 'crtsavf ogawa/qsavf'
CPC7301: ライブラリーOGAWAにファイルQSAVFが作成された。
-bash-5.2$ system 'savlib telib dev(*savf) savf(ogawa/qsavf)'
CPC3722: 20個のオブジェクトがライブラリーTELIBから保管されました。
-bash-5.2$

では、この保管ファイルを scp を使用して PC にファイル転送してみましょう。

ssh接続を終了し、Windowsからscpコマンドを実行します。

 C:\Users\ogawa>scp ogawa@172.23.0.238:/qsys.lib/ogawa.lib/qsavf.file ./
 ogawa@172.23.0.238's password:
 qsavf.file                                 100% 3890KB   2.5MB/s   00:01

 C:\Users\ogawa>dir q*
  Volume in drive C is Windows
  Volume Serial Number is 263A-9C54

  Directory of C:\Users\ogawa

 2024/09/05  16:12         3,983,232 qsavf.file
                1 File(s)      3,983,232 bytes
                0 Dir(s)  338,651,770,880 bytes free

 C:\Users\ogawa>

ライブラリー OGAWA の保管ファイルオブジェクト QSAVF は、IFS では以下のように表現します([第3回「シェルと基本コマンド」]を参照)。

  • /qsys.lib/ogawa.lib/qsavf.file

では、ローカルのqsavf.fileを、別の IBM i に転送してみましょう。転送先サーバーは 172.23.0.236 で、OGAWA ライブラリーに転送します。

 C:\Users\ogawa>scp ./qsavf.file ogawa@172.23.0.236:/qsys.lib/ogawa.lib/qsavf.file
 ogawa@172.23.0.236's password:
 qsavf.file                            0%    0     0.0KB/s   --:-- ETAscp: 
 /qsys.lib/ogawa.lib/qsavf.file: truncate: Operation not supported on socket
 qsavf.file                                 100% 3890KB   8.1MB/s   00:00

 C:\Users\ogawa>

エラーが表示されましたが、転送は成功しています。再度、sshで接続して保管ファイルの中身を表示してみましょう。

 C:\Users\ogawa>ssh ogawa@172.23.0.236
 ogawa@172.23.0.236's password:
 -bash-5.1$ system 'dspsavf ogawa/qsavf'
                                          保管されたオブジェクトの情報                              ページ     1
  5770SS1 V7R4M0  190621                                                           SPIKE74   24/09/05  16:33:01 JST
  保管ファイル. . . . . . . . . . . . . :   QSAVF
    ライブラリー. . . . . . . . . . . . :     OGAWA
    レコード. . . . . . . . . . . . . . :     7544
  保管操作:
    保管コマンド. . . . . . . . . . . . :   SAVLIB
    保管日/時刻. . . . . . . . . . . . :   24/09/05  16:12:07
    活動状態保管. . . . . . . . . . . . :   *NO
    データの圧縮. . . . . . . . . . . . :   NO
    リリース・レベル. . . . . . . . . . :   V7R3M0
  保管されたデータ:
    ライブラリー. . . . . . . . . . . . :   TELIB
    ASP  . . . . . . . . . . . . . . . . :   1
    システム名. . . . . . . . . . . . . :   OLAF73
    システム製造番号. . . . . . . . . . :   78-54D10
    専用権限. . . . . . . . . . . . . . :   NO
                                                           オブジェクト
   eボニ゙ゥhn     jbポ       属性       所有者        ナbヌ゙ (K)   m゙ーj       テキスト
   TELIB        *LIB       PROD         QDFTOWN               88   YES        マスターライブラリー
   TEOUTQ       *OUTQ                   QDFTOWN               16   YES
   SAVF240825   *FILE      SAVF         QDFTOWN             2672   YES
   :

正しく転送されていることが確認できました。

今回は、Windowsを経由して、IBM i 間でファイルを転送しましたが、もちろん、IBM i 同士が直接通信できる場合は Windowsを経由しない直接転送も可能です。皆さんの環境にとって、最も効率が良い方法を選択してください。

5. 累積PTFをダウンロード

ここまでの解説で転送したファイルは、サイズとしては数メガバイトですが、sftpであれscpであれ、データを転送している間はクライアントのコマンドは実行中です。当然ながら、データ転送をしている間はパソコンの電源は落とせません。そして、サイズが数GBあるようなファイルを転送する場合は、それだけssh接続しつつ転送を待つ時間が必要となります。

実際の転送が、IBM i 間、あるいは IBM i と外部サーバー間であったとしても、データ転送を実行するためにPCからssh接続をしていれば、転送中はPCの電源は落とせないことになります。

ここで、急ですが、話を変えます。皆さんは、IBM i の累積PTFおよびグループPTFをご存知でしょうか。PTFは、Program Temporary Fixの略で、プログラムの不具合があった場合に、不具合を修正するためにIBMが提供するプログラムのことです。PTFは必要に応じて作成されますが、ある一定期間に提供された複数のPTFをまとめた「累積PTF」として、あるいは機能的に関連するPTFをまとめた「グループPTF」として提供されています。これらのPTFは、[Fix Central] を経由して必要なものをオーダーし、IBMが用意するサーバーからダウンロードします。

ダウンロードしたファイルは、IBM i の仮想光ディスク装置で読み取りができる形式(拡張子が bin)です。一つのファイルのサイズは、おおよそですが3~4GB程度です。

2024年9月5日現在、IBM i 7.4の最新累積PTFは、2024年6月13日付の C4158740 です。この累積PTFと全てのグループPTFをオーダーすると、binファイルは合計9つになり、合計サイズが約32GB程度になります。

オーダーしたファイルは、一時的(72時間)にIBMが用意するサーバーに保管されている間に、ユーザーがファイル転送機能を使用してダウンロードする必要があります。具体的には、メールで通知される「サーバーのアドレス」と「アクセスに使用するユーザーとパスワード」を用いてダウンロードします。

IBM が用意するサーバーは、以前はanonymousユーザーでftp接続ができたのですが、現在はFTPSあるいはsftp接続に変更されています。先ほどの解説で、IBM i からsftp接続してファイルを転送可能なことはお分かりいただいていると思います。最新累積PTFのbinファイルは、sftp接続を使ってダウンロードするのですが、そもそも個々のファイルサイズが4GB程度もあり、それを9つ対象とすることから、使用するネット回線の種類などによってはダウンロードが長時間になる可能性があります。しかも、ダウンロードしている間は、操作を行っているPCはシャットダウンできないのです。

sftpあるいはscpは、パスワードを引数に渡せないので、パスワード認証の際は、必ずユーザーがパスワードを入力する必要があります。公開鍵認証であればその必要はないのですが、今回アクセスするサーバーは72時間でファイルが削除されてしまう一時的なものという性質上、パスワード認証しかできません。

受信したいファイルが大量にある場合、できれば受信そのものを、受信指示を出すプロセスとは別プロセスで動かせないのでしょうか(IBM i の SBMJOB のように)。しかも、今回のように接続時にパスワードの入力を求められるサイトからの要求もバッチ的に対応できないものなのでしょうか。

今回の連載は「Linux 的な IBM i の使い方」なので、OSSで上述した願望を実現してくれそうなパッケージを探してみました。すると、lftpというツールが使えそうだということがわかりました。しかも、IBM i のOSSリポジトリにもlftpが用意されています。

ここからは、lftpパッケージがインストールされていることを前提として話を進めます。パッケージの確認およびインストールについては、[第5回「OSS Part-2」]を参照してください。

lftpは多機能なツールであり、sftpサーバーに接続した後に複数のコマンドを引数で渡して実行できるので、今回はlftpを使ってみたいと思います。以下のような指示を指定できます。

 lftp sftp://BxxxV0:Y7fpVxxI328xxxx@delivery01-bld.dhe.ibm.com -e "cd 15782xxx/C; mget *; bye"

最初の引数で、サーバーに接続する際に使用するプロトコルとユーザー名、パスワードおよびサーバーのアドレスを指定します。パスワードが見えてしまっていますが、そもそも72時間しか有効でないサーバーであり、今回は解説記事でもあるのでこのまま話を進めます(同様の操作を業務システムに組み込む場合はセキュリティー上のリスクを考慮した対応を行ってください)。

項目 設定値
プロトコル sftp
ユーザー名 BxxxV0
パスワード Y7fpVxxI328xxxx
サーバーのアドレス delivery01-bld.dhe.ibm.com

2番目の引数は -e に続いて実行する複数コマンドを;でつなげ、コマンド全体を ” で囲みます。

実行コマンド 説明
cd 15782xxx/C sftp 接続後、ディレクトリーを変更する
mget * ディレクトリー 15782xxx/C にある全ファイルをダウンロード
bye sftp 接続を終了

仮に、ディレクトリー 15782xxx/C 内に、累積およびグループPTFの9つのファイルがあれば、それを順番にローカルにダウンロードします。

ただし、この操作をssh接続した後で直接実行すると、ファイル転送終了までssh接続を終了させられません。そこで利用するのがnohupです。これは、NO Hang UPの略で、引数 & を指定することで、コマンドをバックグラウンドで実行することが可能になります。

基本的な構文は、

 nohup <実行コマンド> &

です。先程の lftp コマンド全体を nohup で実行することで、バックグラウンドでの実行が可能になるので、転送の終了を待つことなく、PC の電源を落とすことができます。

具体的には、以下のように記述します。

 nohup sh -c 'lftp sftp://BxxxV0:Y7fpVxxI328xxxx@delivery01-bld.dhe.ibm.com -e "cd 15782514/C; mget *; bye"' &

まず、shシェルに ‘ で囲んだlftp文字列を実行するコマンドとして認識するように(-c オプション)指定して、nohupに渡します。最後に&をつけることで、バックグランドで実行させます。

 -bash-5.2$ nohup sh -c 'lftp sftp://BxxxV0:Y7fpVxxI328xxxx@delivery01-bld.dhe.ibm.com -e "cd 15782514/C; mget *; bye"' &
 [1] 202047
 -bash-5.2$ nohup: ignoring input and appending output to 'nohup.out'

 -bash-5.2$

nohup を実行すると、ここでは `[1] 202047` と表示されますが、これはプロセス ID で、ssh で接続しているプロセスとは別のプロセスで実行したということを表しています。次の行の ignoring input …. は「入力は無視し、出力は nohup.out に追記する」という単なるメッセージです。

では、そのプロセスを表示してみましょう。ここでは詳細を省きますが、実行されているプロセスを表示するには ps を実行します。引数で A および f を指定しましたが、A は全てのプロセス、f は情報を省略なしで全て表示する、というものです。

全プロセスが表示されるので、出力結果をパイプ処理し、lftpという文字を含む行のみgrepで抽出します。

 -bash-5.2$ ps -Af | grep lftp
    ogawa 202047      1   0 15:21:46      -  0:00 lftp sftp://BxxxV0:Y7fpVxxI328xxxx@delivery01-bld.dhe.ibm.com
				-e cd 15782514/C; mget *; bye

上記プロセスは、IBM i のサブシステム QUSRWRK で実行されています。これを確認するには、以下を実行します。これも先ほどと同様、システムコマンド WRKACTJOB の出力結果をパイプ処理し、lftpという文字列を含む行のみを抽出しています。

 -bash-5.2$ system 'wrkactjob sbs(qusrwrk)' | grep lftp
     QP0ZSPWP  QSECOFR   291121   OGAWA   BCI 2  50 1.4  0  .0  PGM-lftp   SELW 1  15
 -bash-5.2$

もちろん、5250画面にサイオンして WRKACTJOB コマンドを使って確認することも可能です。

6. おわりに

IBM i のファイル転送を、sshの暗号化された通信経路を使って行うsftpとscpについて解説しました。いかがだったでしょうか。IBM i 同士、または、PCを含む他サーバーとの間で、IBM i をサーバーもしくはクライアントとして安全にファイル転送を行うことができるということをご理解いただけたと思います。

特に、外部サーバーおよびサービスは ssh / sftp を前提としたものが多いので、IBM i も sftp でファイル転送ができるというのは、今後の連携業務を考える上で理解しておくべき事柄です。

今回は、対話的に指示をしながらファイルの送受信を行うのがsftp、直接ファイルを指定してバッチ的に送受信できるのがscpで、必要に応じて使い分ければ便利である、という流れで解説しました。しかし、実は、scpは以前から「OpenSSHではscpの使用は控えるべき」と言われています(参考:[開発者たちが慣れ親しんだ「scp」コマンドはなぜ「時代遅れで柔軟性がなくすぐに修正できない」のか?])。詳細は参考サイトをご覧いただきたいのですが、簡単にいうとセキュリティー上のリスクが存在するからです。

もちろん、社内の閉ざされたネットワーク内、あるいは信頼できるサーバー間でのファイル転送であれば使っても良いのでは、との考えもあります。しかし、リスクがあるということを前提に考えることは、やはり大事です。このことを踏まえて、scpについてはリスクを理解いただいた上で使用していただきたいと思います。

セキュリティーと言えば、これまではクライアントからサーバーへのsshのクライアント認証はパスワード認証でした。しかし、これもセキュリティー的には問題があると言えます。

次回は、このセキュリティーという観点で少しだけ深く、sshおよびファイル転送について考えていきたいと思います。

それでは次回の記事もお楽しみに!

参考文献

いいねと思ったらシェア
twitter
facebook
hatena
Linux的なIBM i の使い方 目次を見る

この連載は…

Linux的なIBM i の使い方
関連記事
【Linux】第2回「ssh の仕組みをきちんと理解する」
【Linux】第2回「ssh の仕組みをきちんと理解する」
【Linux】第3回「シェルと基本コマンド」
【Linux】第3回「シェルと基本コマンド」
【Linux】第4回「OSS Part-1」
【Linux】第4回「OSS Part-1」
あなたにオススメの連載
できるIBM i 温故知新編
9記事
できるIBM i 温故知新編
IBM i の”新”必須言語 〜FFRPG入門〜
14記事
IBM i の”新”必須言語 〜FFRPG入門〜
IBM i アプリの第二の柱 OSS
15記事
IBM i アプリの第二の柱 OSS
PAGE TOP