Evitar que o scp copie arquivos locais?

3

Acabei de ler a questão do problema do comando scp do Linux e me lembrou que regularmente esqueço para especificar os dois pontos na parte do host de um comando scp e, assim, copiar um arquivo localmente em vez de copiar para um host remoto, por exemplo Eu faço

scp foo host

em vez de

scp foo host:

Mas eu nunca uso o scp para copiar um arquivo localmente. Então, pergunto-me se existe uma maneira de fazer o scp falhar se ambos os argumentos (a origem e o destino) referirem-se a arquivos locais.

    
por ashcatch 17.05.2010 / 09:19

1 resposta

1

Você pode escrever uma função de wrapper no Bash e nomeá-la como scp , que usa getopts para processar as opções em um novo array, deixando a origem e o destino nos parâmetros posicionais e verificando a presença de "@" e ":" e, se ausente, emite uma mensagem de erro. Se eles estiverem presentes, chame o% realscp usando algo como command scp "${args[@]}" "$source" "$dest" . O comando command faz com que o Bash chame o programa encontrado no PATH em vez da função com o mesmo nome.

Como, pelo menos no meu sistema, scp suporta apenas o tipo de opção curta, getopts (que também suporta apenas opções curtas) funcionará bem para isso.

A função seria algo como isto (não testado):

scp () {
    # wrapper function to prevent scp of local-only files
    options="1246BCpqrvc:F:i:l:o:P:S:
    while getopts $options option
    do
        case $option in
            1 | 2 | 4 | 6 | B | C | p | q | r | v)
                args+=($option)
                ;;
            c | F | i | l | o | P | S)
                args+=($option "$OPTARG")
                ;;
        esac
    done
    if [[ $1 != *@*:* && $2 != *@*:* ]]
    then
        echo "Local-only copy not permitted"
        echo "to override, use 'command scp ARGS'"
        return 1
    fi
    command scp "${args[@]}" "$1" "$2"
}
    
por 17.05.2010 / 09:58

Tags