テクノロジー · 実用ガイド

SCP の「Received message too long」?SSH を変える前に余計なバイトを捕捉する

この数値は、予期しない文字列の先頭4バイトを SFTP パケット長として誤読した可能性があります。同じアカウントと経路で再現し、起動ファイル、サブシステム、限定的な互換性を分けます。

余計な出力が SFTP 長になる経路のオリジナルイラスト。
オリジナルイラスト:起動ファイルを変える前にバイトを保存します。 Watch at Ease

このエラーはファイル容量ではなくプロトコルの症状です。現在の scp は既定で SFTP を使うため、転送前の文字列がバイナリ長として解釈されます。

同じアカウントでバイトを保存し、出力元を特定し、一つの境界だけを修正して転送と対話ログインを確認します。

編集する前に、失敗する経路を正確に再現する

クライアントのエラー全文、コマンド、ホスト別名、ユーザー名、ポート、踏み台、認証方式を保存します。同じ転送を詳細ログ付きで実行し、鍵やトークンは伏せます。対話型 ssh が成功しても、別のコマンド経路を使う SFTP サブシステムが正常とは限りません。

同じアカウントと SSH 設定で ssh -T host /usr/bin/true のような非対話の無操作コマンドを実行します。正常な基準は stdout が空であることです。プロトコル開始前のバナー、debug echo、コマンド不在メッセージ、起動エラーは捨てずに、そのまま保存します。

数値を、混入した先頭4バイトの手掛かりにする

SFTP パケットは4バイトの長さから始まります。先に文字列が届くと、クライアントは最初の4文字を巨大な10進の長さとして解釈し、「Received message too long」で停止することがあります。報告値を16進数と ASCII に変換するのは手掛かりに限定し、必ず取得した出力と照合します。

先頭文字がファイル名、バナー、エラーの一部に見えるなら、その出力元を追跡します。本稿で確認した macOS の事例では値が「.bas」と読め、.bashrc の出力であることも確認されました。値ごとに原因は異なるため、編集前に実バイトを残します。

実際に読まれる起動ファイルを追跡する

Bash では、sshd が起動する非対話経路が ~/.bashrc を読むか、BASH_ENV が別のファイルを指すか、システムの profile や wrapper が出力するかを確認します。他のシェルには別の規則があります。管理者ではなく、実際の転送アカウントで調べます。

挨拶、状態表示、診断は、対話シェルであると確認できた分岐の内側へ移すか、プロトコルを壊さない経路へ送ります。起動ファイル先頭の無条件 return は、ジョブが必要とする環境変数まで飛ばす恐れがあります。変更後はログインと非対話プローブの両方を再試験します。

起動時のノイズとサブシステム不在を分ける

無操作プローブが無出力でも SFTP が失敗するなら、Subsystem sftp、アカウントの shell、chroot、forced command、ポリシーログを確認します。internal-sftp は外部プログラムや一部の shell 起動経路を避けられますが、sshd_config の変更は全体に効くため、検証と安全な戻し方が必要です。

唯一の管理セッションから sshd を無計画に再起動しません。設定を検証し、方針が許すなら二つ目の管理セッションを保持して、同じアカウントで試験します。独自または制限付き shell では、全体の shell 変更ではなく明示的な SFTP 設計が必要な場合があります。

旧 SCP は限定した互換性試験にだけ使う

現在の OpenSSH scp は既定で SFTP を使います。-O は、SFTP のないサーバーや古いパス・ワイルドカード挙動のために旧 SCP を選びます。scp -O だけ成功する場合は差を記録しますが、それだけでサーバー設定が正しいとは判断しません。

-O は既知の機器、アカウント、パスに対する文書化された例外とし、万能の恒久対策にしません。旧モードは一部でリモート shell を実行し、引用規則も異なります。サーバーを管理できるなら、対応する SFTP サブシステムまたは起動時出力を修復します。

転送とログイン境界を両方検証する

同じアカウントとパスで元のコマンドを再実行し、終了コード0、ファイルサイズ、可能ならチェックサムを確認します。非対話プローブの stdout に予期しない出力がないことを確認した後、対話ログインが意図した prompt と環境をまだ読み込むかも検証します。

実際の出力元、変更したファイルまたはサブシステム、使用したプロトコル、変更理由を記録します。自動処理には、リモート無操作コマンドが1バイトでも出力したら失敗するスモークテストを追加できます。再発時に dotfile の推測から始めず、明確な回帰として扱えます。

起動出力、サブシステム、互換性を分けるオリジナルイラスト。
オリジナルイラスト:証明した層だけを修復します。 Watch at Ease