web-dev-qa-db-ja.com

scpを使用して存在しないローカルディレクトリにファイルをコピーしています-誤解を招くエラーメッセージ

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
  1. それは誰にとっても意味がありますか、それとも私だけですか?
  2. それはscpの欠陥だと思いますか?
  3. Ubuntu 14.04.3 LTSを実行していますが、他のオペレーティングシステムでも同じですか?
2
vstrom coder

バグ

関連するバグ が見つかりました。 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が存在する場合、scpfile/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コマンドは機能するはずです。

5
Eric Duminil