シェルスクリプトバッチによるFTPGETをSFTPGET移行する際の留意事項

## 参考情報
FTPコマンド(リファレンス)
http://www.syscom.ne.jp/ftp_ref.htm

sftp コマンドラインユーティリティ
https://www.microfocus.com/documentation/reflection-desktop/18-0-1/guides-ja/security/secure-shell-connections/command-line-utilities/sftp.html

## asciiオプションについて
ascii オプションは、FTPとSFTPでファイル転送時にテキスト（ASCII）モードを使用するための設定です。以下にFTPとSFTPにおける ascii オプションの類似点と相違点を説明します。

類似点
データの転送方法: FTPとSFTPの ascii モードは、テキストファイルを転送するために設計されています。テキストファイルの改行コードが異なるOS間で変換され、ファイルを適切に処理します。
利用方法: FTPとSFTPの両方でテキストモードを使用する際、コマンドやオプションを使って設定します。FTPでは ascii コマンドを入力して切り替えます。
相違点
利用方法の違い:
FTP: FTPプロトコルでは、テキストモードとバイナリモードが明確に区別されています。ascii コマンドを使用することでテキストモードに切り替え、ファイル転送を行います。
SFTP: SFTPプロトコルは、デフォルトで常にバイナリモードを使用します。そのため、SFTPには明確な ascii モードはなく、テキストモードへの切り替えはサポートされていません。
転送時の処理:
FTP: テキストモードでは、ファイルの改行コードが転送先のOSに合わせて変換されるため、例えばWindowsとUnix系システムの間で正しく表示されます。
SFTP: SFTPはファイルを暗号化して転送し、またデフォルトでバイナリモードが使われるため、特定のファイル形式（テキスト）に合わせたモードの変更は行われません。
要約すると、FTPでは ascii オプションを使ってテキストファイルの転送を最適化できますが、SFTPでは特に意識することなく転送されます。


## binaryオプションについて
binary オプションは、FTPとSFTPの両方でバイナリモードでデータを転送するための設定です。以下にFTPとSFTPにおける binary オプションの類似点と相違点を説明します。

類似点
データの転送方法: FTPとSFTPの binary オプションは、ファイルのバイナリ形式での転送を意味します。テキスト形式と対比して、ファイルの内容を変換せずにそのまま転送します。これにより、イメージファイルや圧縮ファイル、実行ファイルなどが正しく転送されます。
利用方法: どちらもコマンドとして入力することで有効化します。FTPでは binary コマンドを入力し、SFTPでは -b または -B オプションが使われることがあります。
相違点
利用方法の違い:
FTP: binary コマンドを直接入力することによってバイナリモードに切り替わります。多くの場合、標準のFTPクライアントでサポートされている。
SFTP: SFTPでは、明確な binary コマンドがありません。ただし、SFTPはデフォルトでバイナリ転送が行われるため、通常は特別な設定が不要です。
転送時の処理:
FTP: テキストモード（ASCIIモード）とバイナリモードを明確に区別しているため、バイナリデータを転送する際は明示的にモードを切り替える必要があります。
SFTP: SFTPでは暗号化と共にファイル転送が行われるため、通常はモードの切り替えを行わずにすべての転送がバイナリモードで行われます。
つまり、FTPは binary オプションを使う必要がある場合が多いですが、SFTPではそれを意識する必要はほとんどありません。

SFTPプロトコルでは、FTPのSIZEコマンドに相当するものとして、通常はlsコマンドの詳細出力を用いてファイルのサイズを確認します。SFTPにはFTPのようなSIZEコマンドが明確には存在しませんが、ファイルの属性を取得するためにstatやls -lのようなコマンドが利用されます。

ls コマンド
SFTPのlsコマンドは、リモートディレクトリの内容をリストします。オプションに-lを付けると、UNIX系のls -lコマンドと同様に、ファイルの詳細情報（パーミッション、オーナー、グループ、サイズ、タイムスタンプなど）が表示されます。

例えば、特定のファイルのサイズを確認するには、以下のようにコマンドを実行します：

sftp
Copy code
sftp> ls -l filename.txt
このコマンドの出力には、指定したファイルのサイズが含まれます。

stat コマンド
また、SFTPではstatコマンドを使用して、単一のファイルに関する詳細な情報を取得することもできます。このコマンドはファイルのメタデータを詳細に提供します。

sftp
Copy code
sftp> stat filename.txt
この出力には、ファイルのサイズ、パーミッション、最終変更日時などが含まれます。

これらのコマンドは、FTPプロトコルのSIZEコマンドに似た機能を提供し、SFTPセッション中にファイルのサイズを確認するのに役立ちます。SFTPの利点は、すべての情報が安全なチャネルを通じて転送されるため、セキュリティが強化されている点です。


FTPコマンド実行時の標準出力に対して「^213」でgrepする処理は、特定のFTPレスポンスコードを検出するために用いられることが考えられます。FTPプロトコルでは、各種の操作に対するサーバーの応答が数値コードで示されます。これらのコードはクライアントが次の操作を決定する際の重要な情報源となります。

「213」コードはFTP応答の中でも「File status」と関連づけられており、ファイルのステータスやサイズを問い合わせた際に用いられることが多いです。例えば、SIZE コマンドの応答として「213」が用いられる場合があります。このコマンドはファイルのサイズを確認するために使用され、ファイルが存在する場合にはそのサイズが、存在しない場合にはエラーコードが返されます。

したがって、スクリプトにおいて「^213」でgrepするという処理は、FTPサーバーからのファイルサイズまたはステータスに関する正確な応答を検出し、それに基づいて次のステップを実行するための条件分岐やログ記録を行う目的で実装されている可能性が高いです。こうした処理はスクリプトが期待する応答を得ることを確認し、エラーハンドリングや異常処理を適切に行うために重要です。

FTPプロトコルにおける SIZE コマンドは、リモートファイルのサイズを取得するために使用されます。このコマンドは、ファイル転送を開始する前にファイルの大きさを知るために非常に便利であり、ファイルが存在するか、またそのサイズがどれくらいかを確認するのに役立ちます。

SIZE コマンドの使用方法
FTPセッション内で、SIZE コマンドは以下のように使用されます:

FTPセッションを開始します。
適切なディレクトリに移動します（もし必要な場合）。
SIZE コマンドに続いてファイル名を指定して実行します。
例えば、filename.txt のサイズを確認するには、以下のコマンドを入力します：

Copy code
SIZE filename.txt
SIZE コマンドの応答
成功した場合: サーバーは 213 ステータスコードと共にファイルサイズをバイト単位で返します。例えば 213 1024 は、ファイルサイズが1024バイトであることを示します。
ファイルが存在しない場合: サーバーは 550 ステータスコードを返し、ファイルが見つからないことを示します。
Kshスクリプト内でのSIZE コマンドの使用
Kshスクリプトを使用してFTP通信を行い、特定のファイルのサイズを取得する例を以下に示します。

ksh
Copy code
#!/bin/ksh

# FTP変数の設定
HOST='ftp.example.com'
USER='username'
PASSWD='password'
FILE='filename.txt'

# FTPコマンドを使用してファイルサイズを取得
ftp -n $HOST <<EOF
user $USER $PASSWD
binary
cd /path/to/directory
size $FILE
bye
EOF
このスクリプトでは、まずFTPサーバーに接続し、ユーザー認証を行います。次にバイナリモードに切り替え（SIZE コマンドでは必ずしも必要ではありませんが、一般的なファイル転送の設定です）、適切なディレクトリに移動し、SIZE コマンドを使用してファイルサイズを取得します。最後にセッションを終了します。

SIZE コマンドはファイルがサーバー上に存在するか、またはダウンロードや同期のプロセスを開始する前にどれくらいの帯域幅が必要かを判断する際に役立つ重要なツールです。