web-dev-qa-db-ja.com

scp:エラー:予期しないファイル名:

ファイルのアップロードに長い間使用していたSCPが突然機能しなくなりました。 12時間前にスクリプトを実行しましたが、問題なく動作しましたが、突然停止しました。

問題のコマンドは、現在のディレクトリをリモートフォルダーにアップロードしていました。

#!/bin/bash
cd "$(dirname "$0")"

scp -r . <remote_server>:<remote_folder>

エラーメッセージは次のとおりです。

scp: error: unexpected filename: .

Mojave 10.14.2を実行しているMacを使用しています。

更新:コマンドをこれに書き換えることで特定の問題を解決しましたが、何が壊れているのかを知りたいと思っています。

scp -r $(pwd) <remote_server>:<remote_folder>
15

犯人は CVE-2018-20685 で、その説明は次のとおりです。

OpenSSH 7.9では、scpクライアントのscp.cにより、リモートSSHサーバーがのファイル名を介して意図したアクセス制限をバイパスできます。または空のファイル名。影響は、クライアント側のターゲットディレクトリの権限を変更することです。

これは SCP脆弱性のより大きなセット の一部です。そこから引用:

概観

複数のベンダーのSCPクライアントは、悪意のあるscpサーバーがターゲットディレクトリやクライアント出力操作を不正に変更する可能性があります。

説明文

多くのscpクライアントは、scpサーバーから返されたオブジェクトが要求したオブジェクトと一致するかどうかの検証に失敗します。この問題は、scpのベースとなっている1983年とrcpにさかのぼります。クライアントの別の欠陥により、ターゲットディレクトリの属性が任意に変更される可能性があります。最後に、クライアントの2つの脆弱性により、サーバーがクライアントの出力を偽装する可能性があります。

OpenBSDのこの脆弱性にパッチを当てた commit は、2018年11月16日に作成されました

17
BlackBear

@BlackBearからの他の回答はwhyについて説明していますこれは機能しなくなりました。

しかし、私のようにこの問題で解決策も探していた場合、rsyncではなくscpを使用するのが正しい方法のようです。たとえば、古いscpコマンドの1つは次のようになります。

# this no longer works due to the "."
scp -BCr output/html/. www:/var/www/site/html/

今、代わりにこれを使用します:

rsync --recursive --times --compress --delete --progress output/html/ www:/var/www/site/html/

短いフラグを使用する場合は、次のようになります。

rsync -rtz --del --progress output/html/ www:/var/www/site/html/

ソースの末尾の/は重要です。 rsyncに、ディレクトリ名なしでそのディレクトリのcontentが必要であることを伝えます。

物事を台無しにする前に、--dry-runman rsyncも検討してください。

7
Stéphane