scp
を使用して、リモートホストからローカルディレクトリにファイルをコピーするためのシェルスクリプトを作成しています。ターゲットディレクトリが存在しない場合、誤解を招くエラーメッセージが表示されます。つまり:
scp user@remote-Host:/path/to/existing/file /local/non-existing/directory/
私が得ているエラーは次のとおりです。
/local/non-existing/directory/: Is a directory
これは不可解です...私は次のようなものを期待します:
Directory /local/non-existing/directory/ does not exist
関連するバグ が見つかりました。 Ubuntu 14.04.5(openssh 1:6.6p1-2ubuntu2.8)で修正されているようです
Redhatバグレポート に説明があります:
この問題は元のopenSSHにもあり、既存の親ディレクトリを持つ存在しないディレクトリに何かをコピーしようとすると発生します。この境界条件のチェックが欠落しています。 scpプロセスが上記のファイルに書き込もうとするとエラーメッセージがスローされますが、このファイルはスラッシュ(ディレクトリの解釈)で終わり、これが現在のエラーメッセージの理由です。
再現できません(Ubuntu 14.04.5LTSおよびLinuxMint 17でテスト済み)
/local/non-existing/directory
が存在しない場合、scp
は次のように失敗します:
/local/non-existing/directory: No such file or directory
/local/existing/directory
が存在する場合、scp
はfile
を/local/existing/directory/file
にコピーします
remote-Host:/path/to/existing/file
がディレクトリの場合、scp
は次のように失敗します:
scp: file: not a regular file
ssh user@remote-Host "file /path/to/existing/file"
リモートファイル(または場合によってはディレクトリ)に関する情報を提供する必要があります。
file /local/non-existing/directory/
ローカルディレクトリに関する情報を提供する必要があります
mkdir -p /local/non-existing/directory/
ディレクトリを再帰的に作成し、必要に応じて親を作成します。
mkdir -p
の後、file
が実際にファイルであり、/local/non-existing/directory/
が実際にディレクトリである場合、scp
コマンドは機能するはずです。