アップロードを信じる前に、FTP の最終応答を確認する
150 の応答は転送が始まったことを示すだけで、ファイルが保存されたことは示しません。ローカル読み取り、保存権限、データ接続、最終応答を切り分けて考えます。
FTP クライアントは、サーバーがファイルを受け取るはるか前に put コマンドを受け付けます。この二つの出来事の間のずれこそ、アップロードの謎のほとんどが潜む場所です。完了すべき段階は四つあります。ローカルファイルの読み取り、サーバーによる保存要求の受理、データ接続によるバイトの搬送、そして転送が最終的な肯定応答に到達することです。クライアントを比べるよりも、これらの段階を比べるほうが役に立ちます。ログインが通ることとファイル名が見えることは、どちらも完了の手前で止まっているからです。
予備応答と最終応答
STOR では、125 や 150 の応答は予備的なものです。サーバーが試す意思を示し、データ接続が開こうとしていることを告げるだけで、オブジェクトが最終的な形で存在することを意味しません。操作が完了するのは、その操作の文脈で転送が肯定的な完了応答、一般には 226 や 250 に到達したときだけです。
426 は転送が中断されたことを意味し、別のコマンドが出力した番号はこのアップロードの結果ではありません。画面の最後の番号ではなく、その STOR に属する応答を読んでください。その応答が届く前にクライアントが終了したなら、完了を示す証拠は一切ありません。
制御接続とデータ接続
認証とディレクトリ一覧は制御接続を使います。バイトのやり取りは別のデータ接続を使い、その端点は転送ごとに折衝されます。ログインの成功は制御経路を証明するだけで、データアドレスにクライアントから到達できるかどうかは何も語りません。
サーバーがデータ接続を開けない場合は、折衝された端点と許可されたパスを調べます。パッシブモードでも使用可能なデータアドレスとポートが必要で、クライアントとサーバーの間のファイアウォールや NAT 機器が、制御セッションを通しつつデータ範囲を遮断していることがあります。逆にサーバーが保存要求を拒否する場合は、リモートのパス名、権限、保存容量の制限を見てください。どちらの枝も、制御接続の認証が通ったことでは説明できません。
TLS 上の FTP と SFTP
TLS 上の FTP はやはり FTP です。接続が二つ、FTP の応答、そしてそれぞれの接続での TLS 昇格があります。SFTP は SSH のサブシステムで、接続は一つ、コマンド体系はまったく異なります。目的だけを共有し、それ以外はほとんど共有しないため、両者をまたぐ診断はたいてい間違ったログの比較から始まります。
セッションを中間ヘルパーに検査させるために TLS を無効にしないでください。また、SFTP の失敗を FTP 応答の問題として扱わないでください。スクリプトでテストする必要がある場合、curl のマニュアルには明示的な TLS、パッシブモード、アップロードの各オプションが記載されており、各フラグが実際に何を変えるかの参照資料でもあります。
デバッグする前に、そのサービスが実際に提供しているプロトコルを選んでください。SFTP しか話さないサーバーは、クライアントをどう設定しても 226 の応答を返すことはありません。
見えるファイル名と保存されたオブジェクト
見えているファイル名が、不完全なオブジェクトを指していることがあります。特に転送が中断された後や、クライアントが途中で終了した後にそうです。バイトの保持が期待される場合は、サービスの管理者に依頼して、意図したテストファイルのサイズと信頼できる内容ハッシュを、保存されたオブジェクトと比較してもらってください。
バイナリモードと ASCII モードの違いも結果を変える比較です。ASCII モードは改行を変換することがあるため、転送が成功しても保存されたバイトはローカルファイルと異なります。バイト単位の確認にはバイナリモードを使い、失敗した転送を違って見せるための変換オプションを足さないでください。
通常の STOR は既存のファイルを置き換えられます。ログインやディレクトリ一覧の権限は、そのディレクトリ内でオブジェクトを作成・置換する権限を確立しません。テストには、これまで使っていないリモート名を使ってください。
再試行の前に比較するもの
不確かな部分ファイルの上に、盲目的に追記・再開・再送をしないでください。新しい名前でやり直すのか、サービスが対応している復旧手順を使うのか、失敗したテスト用オブジェクトを削除するのかを、管理者と合意してください。
結果は四つの文のいずれかとして記録します。ローカル読み取りが失敗した、保存が拒否された、データ転送が中断した、転送が完了して保存バイトが一致した、のいずれかです。この記録は、ファイル名が見えるまでシェルと VPN と FTP 設定を同時に変え続けるより強い結果であり、次に誰が見るべき段階を教えてくれます。その文には、機密情報を除いた応答テキストを添えてください。そうすれば再試行は反射ではなく判断になります。