Evitar que o scp sobrescreva arquivos existentes?

3

Tenho pesquisado isso há algum tempo, e o problema não é tanto quando confio em meus usuários a "fazer a coisa certa" e fazer com que usem o rsync com várias opções para evitar a sobrescrita de arquivos. Eu realmente preciso de alguma forma ter scp não substituir arquivos existentes ... rsync não é uma opção, porque haverá aqueles que usarão scp ... então eu preciso lidar com isso.

Eu acho que é possível modificar o código sshd, então haveria um caminho potencial para resolver isso.

Além disso, alguém mais quebrou essa porca e o que foi feito? Invólucros?

    
por Jon 15.01.2015 / 15:52

1 resposta

1

Esta é uma função de shell simples ( bash e ksh93 ) que envolve scp . Ele se recusará a executar o% realscp se o arquivo de destino existir no sistema.

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 "$@"
}

A função seleciona o destino do último argumento de linha de comando e, em seguida, verifica se ele corresponde a um nome de arquivo existente. Em caso afirmativo, ele se recusará a executar scp , exibindo uma mensagem de diagnóstico e retornando um status de saída diferente de zero.

Se não houver nenhum nome de arquivo existente correspondente ao destino, ele vai em frente e chama o% real% co_de com a linha de comando original.

Nenhuma tentativa é feita para distinguir entre uma transferência em uma direção ou outra. Isso falhará se houver um nome de arquivo correspondente ao formato scp -type no diretório atual.

Se você tiver uma lista de nomes de arquivos protegidos em um arquivo (esta deve ser uma lista de nomes absolutos, um por linha, correspondente ao caminho real de cada arquivo conforme retornado pelo utilitário GNU coreutils user@hostname:file ):

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 "$@"
}
    
por 01.02.2017 / 17:10