メインコンテンツへスキップ
検索
多くの人がFTPを使ってファイルを転送するための自動化されたプロセスを作成しています。これを行うにはいくつかの異なる方法があり、他の方法よりも優れているものもあります。このブログでは、異なるアプローチについて説明し、それぞれの長所と短所を確認します。また、不完全なファイルが転送されてしまう問題も取り上げます。
最も簡単な方法は、ユーザーIDとパスワード、そしてすべてのFTPリクエストをコマンドマクロに入れて(図1)、それを実行するだけです(図2)。
&attach_input
ftp 172.16.1.116
Noah_Davids
MYPASSWORD
put foo
&if (command_status) ^= 226 &then &goto ERROR1
get bar
&if (command_status) ^= 226 &then &goto ERROR2
quit
&
&label ERROR1
..display_line Could not put file
quit
&return
&
&label ERROR2
..display_line Could not get file
quit
&return

図 1 - ftp1.cm - シンプルなコマンドマクロ
ftp1
Connected to 172.16.1.116.
220 phx_vos-m16 FTP server (FTP 1.0 for Stratus STCP) ready. (Compatible with OS
+ TCP/IP)
User (172.16.1.116:Noah_Davids): 331 Password required for nd.
Password:
230 User Noah_Davids.CAC logged in.
200 PORT command successful.
150 Opening data connection for foo (172.16.1.34,49253)0.
226 Transfer complete.
80 bytes sent in 0.01 seconds (6.85 Kbytes/sec)
200 PORT command successful.
550 bar: No such file or directory.
recvrequest: Bad file number.
Get transfer did not complete
Could not get file
221 Goodbye.
図2 - ftp1.cm - 単純なコマンドマクロの実行
この方法の欠点は、ユーザーIDとパスワードがマクロの一部としてクリアテキストで表示されることです。マクロにアクセスできる人なら誰でも見ることができます。2 番目の方法は、.netrc ファイルを使用してユーザー ID とパスワードを保持することです。(図3)を使用します。コマンドマクロ(図4)では、実行するFTPリクエストが含まれています(図5)。
machine 172.16.1.116
login Noah_Davids
password MYPASSWORD
図 3 - .netrc ファイル
&attach_input
ftp 172.16.1.116
put foo
&if (command_status) ^= 226 &then &goto ERROR1
get bar
&if (command_status) ^= 226 &then &goto ERROR2
quit
&
&label ERROR1
..display_line Could not put file
quit
&return
&
&label ERROR2
..display_line Could not get file
quit
&return
図4 - ftp2.cm - ユーザIDとパスワードなしのコマンドマクロ
ftp2
Connected to 172.16.1.116.
220 phx_vos-m16 FTP server (FTP 1.0 for Stratus STCP) ready. (Compatible with OS
+ TCP/IP)
331 Password required for nd.
230 User Noah_Davids.CAC logged in.
200 PORT command successful.
150 Opening data connection for foo (172.16.1.34,49256)0.
226 Transfer complete.
80 bytes sent in 0.04 seconds (2.09 Kbytes/sec)
200 PORT command successful.
550 bar: No such file or directory.
recvrequest: Bad file number.
Get transfer did not complete
Could not get file
221 Goodbye.
図5 - ftp2.cm - ユーザIDとパスワードなしでコマンドマクロを実行する様子
.netrcファイルは、所有者がそのファイルにアクセスできる唯一の人である場合にのみ動作します(図6)。他の誰かが読み込みアクセス権を持っている場合(図7)は動作せず、パスワードのプロンプトが表示されます(図8)。
display_access .netrc -all
%phx_vos#m15_mas>SysAdmin>Noah_Davids>.netrc
w  Noah_Davids.*
n  *.*
図 6 - .netrc ファイルの正しい ACL
display_access .netrc -all
%phx_vos#m15_mas>SysAdmin>Noah_Davids>.netrc
w  Noah_Davids.*
r  *.CAC
n  *.*
図 7 - .netrc ファイルの不正な ACL
ftp2
Connected to 172.16.1.116.
220 phx_vos-m16 FTP server (FTP 1.0 for Stratus STCP) ready. (Compatible with OS
+ TCP/IP)
User (172.16.1.116:Noah_Davids): 331 Password required for put foo.
Password:
530 Login incorrect.
Login failed.
221 Goodbye.
図 8 - .netrc が間違った ACL を持っている場合のパスワードのプロンプト
FTPマクロを作成することで、すべてのコマンドを.netrcファイルに配置することができます。マクロの名前が "init" (図9) の場合、ログイン後に自動的に実行されます。これにより、VOSコマンドマクロはFTPコマンドの1行だけになります (図10)。このアプローチの大きな問題は、エラーリカバリーがないことです。(command_status)関数を使ってFTPリクエストの状態を確認することができません(図11)。
machine 172.16.1.116
login Noah_Davids
password MYPASSWORD
macdef init
put foo
get bar
quit
図 9 - init マクロを使用した .netrc ファイル
ftp 172.16.1.116
図 10 - ftp3.cm - init FTP マクロを含む .netrc ファイルで使用した場合のマクロ
ftp3
Connected to 172.16.1.116.
220 phx_vos-m16 FTP server (FTP 1.0 for Stratus STCP) ready. (Compatible with OS
+ TCP/IP)
331 Password required for nd.
230 User Noah_Davids.CAC logged in.
put foo
200 PORT command successful.
150 Opening data connection for foo (172.16.1.34,49276)0.
226 Transfer complete.
80 bytes sent in 0.01 seconds (9.52 Kbytes/sec)
get bar
200 PORT command successful.
550 bar: No such file or directory.
recvrequest: Bad file number.
Get transfer did not complete
quit
221 Goodbye.
図 11 - ftp3.cm - init マクロ使用時の出力 - エラー回復なし
私が見た多くのマクロは、ディレクトリにファイルが現れるのをループして待っているだけで、ファイルが現れたときにはFTPを使ってファイルを転送します(図12)。
&attach_input
&label AGAIN
&if (exists new_file) = 1 &then &goto FTP
display_line No new_file as of (time)
sleep -seconds 15
&goto AGAIN
&
&
&label FTP
ftp 172.16.1.116
put new_file
&if (command_status) = 226 &then ..display_line OK
&else &do
..display_line
..display_line ERROR
..display_line
&end
quit
図 12 - ftp4.cm - ファイルが表示されて転送されるのを待つマクロ
この方法の問題点は、FTPはまだ開いていて書き込まれているファイルを読むことができるということです。大きなファイルやタイミングが悪い場合、結果としてファイルの一部しか転送されないことになります(図13)。
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
図13 - ファイルの一部のみが転送される
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
this is the last record
図 14 - 完全なファイル
ファイルが存在するかどうかを確認するだけでは不十分で、ファイルがロックされているかどうかも確認する必要があります(図15)。
&attach_input
&label AGAIN
&if (exists new_file) = 1 & (locked new_file) = 0 &then &goto FTP
display_line new_file not ready for transfer as of (time)
sleep -seconds 15
&goto AGAIN
&
&
&label FTP
ftp 172.16.1.116
put new_file
&if (command_status) = 226 &then ..display_line OK
&else &do
..display_line
..display_line ERROR
..display_line
&end
quit
図15 - ftp5.cm - 転送前にファイルのロックが解除されているかどうかのチェック
したがって、最良の方法は、ユーザーIDとパスワードを保持するために.netrcファイルを使用し、実際のリクエストを制御するために、各リクエストの後にcommand_statusをチェックする機能を備えたVOSコマンドマクロを使用することです。また、ファイルを転送する前に、ロックされていないことを確認してください。
SFTPについて疑問に思っている方もいると思いますが、SFTPを使ってファイル転送を自動化することは全くの別物で、次回のブログで説明します。
メニューを閉じる

© 2024 Stratus Technologies.