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진단 메시지를 표시하며 0이 아닌 종료 상태를 반환합니다.

대상에 해당하는 기존 파일 이름이 없으면 계속해서 scp원래 명령줄을 사용하여 실제 파일 이름을 호출합니다.

한 방향으로의 전송과 다른 방향의 전송을 구별하려는 시도는 없습니다. 따라서 user@hostname:file-type 형식에 해당하는 파일 이름이 현재 디렉터리에 있으면 실패합니다.

파일에 보호된 파일 이름 목록이 있는 경우(이 목록은 GNU coreutils 유틸리티에서 반환한 각 파일의 실제 경로에 해당하는 한 줄에 하나씩 절대 경로 이름 목록이어야 합니다 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 "$@"
}

관련 정보