scpが既存のファイルを上書きしないようにしますか?

scpが既存のファイルを上書きしないようにしますか?

私はしばらくインターネットを検索してきましたが、問題はユーザーが「正しいこと」をし、ファイルの上書きを避けるためにrsyncとさまざまなオプションを使用できるようにすることではありません。実際には何とかscpが既存のファイルを上書きしないようにする必要があります。 scpを使用している人がいるので、rsyncはオプションではありません。だからこれを処理する必要があります。

sshdコードを修正できると思うので、この問題を解決するための潜在的な方法があります。

他にこのナットを壊した人がまたありますか?あなたは何をしましたか?包装紙?

答え1

これは、ターゲットファイルがシステムに存在する場合に物理ファイルを循環して実行を拒否する単純なシェル関数(bashsum)です。ksh93scpscp

function scp
{
    typeset argv="$@"
    typeset target="${argv[-1]}"

    if [[ -e "$target" ]]; then
        echo 'Target file exists, refusing to overwrite' >&2
        return 1
    fi

    command scp "$@"
}

この関数は、最後のコマンドライン引数からターゲットを選択し、それが既存のファイル名と一致することを確認します。その場合、実行を拒否し、scp診断メッセージを表示し、ゼロ以外の終了ステータスを返します。

ターゲットに対応する既存のファイル名がない場合は、引き続き元のscpコマンドラインを使用して実際のファイル名を呼び出します。

一方の方向への伝送と別の方向への伝送とを区別する試みはない。したがって、user@hostname:file-type 形式に対応するファイル名が現在のディレクトリにある場合は失敗します。

ファイルに保護されたファイル名のリストがある場合(このリストは、GNU coreutilsユーティリティによって返された各ファイルの物理パスに対応する1行に1つずつ絶対パス名のリストでなければなりませんrealpath):

function scp
{
    typeset argv="$@"
    typeset target="${argv[-1]}"

    if grep -q -F -x "$( realpath "$target" )" protected_files.txt; then
        echo 'Target filename is protected, refusing to overwrite' >&2
        return 1
    fi

    command scp "$@"
}

関連情報