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