仕事で遭遇した不具合について、メモ。
scp( Secure Copy )ってのは、SSH を利用して、あるシステムから別のシステムへネットワーク経由でファイルをコピーするためのコマンドです。
これを使って対象のディレクトリをまるごとコピー(オプション -r でディレクトリの再帰コピーが可能)していたところ、ある日、こんなエラーが出るようになりました。
$ scp -r ./xyz/.data remote:/test
scp: realpath /test/.data: No such file
scp: upload "/test/.data": path canonicalization failed
scp: failed to upload directory ./xyz/.data to /test
今まで使えたものが急に使えなくなったので、「どうしたものやら」としばらく調べてようやく原因が判明しました。
今年の4月に OpenSSH がバージョン 8 から 9 へとメジャーアップデートされまして、同時に scp のデフォルトのプロトコルも変更されました。この影響でコピー元のシステムの OpenSSH のバージョン 9 で、コピー先のバージョンが 8 だと、バージョンの不整合によりエラーが発生する場合があるんだとか。
どうやらコピー元のシステムがいつのまにか新しくなっていて、OpenSSH も最新版になっていたのに、コピー先のシステムは古いままだったのでコピーに失敗していたようです。
対策はありまして、scp にオプション -O(大文字でオー)を追加すれば以前のプロトコルを使うようになり、不整合が発生しなくなります。具体的には以下のようにしました。
$ scp -r -O ./xyz/.data remote:/test
これで解決しました。わかりにくい不具合でした。