Вы можете написать в Bash функцию-обертку и назвать ее scp
которая использует getopts
для обработки параметров в новом массиве, оставляя исходные и конечные значения в позиционных параметрах, а затем проверять их на наличие «@» и «:» и, если отсутствует, выдайте сообщение об ошибке. Если они присутствуют, тогда вызовите реальный scp
с помощью command scp "${args[@]}" "$source" "$dest"
. command
команда заставляет Bash вызывать программу, найденную в PATH
вместо функции с тем же именем.
Так как, по крайней мере, в моей системе scp
поддерживает только тип коротких опций, getopts
(который также поддерживает только короткие опции) будет хорошо работать для этого.
Функция будет выглядеть примерно так (не проверено):
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"
}