3

Я только что прочитал вопрос о проблеме с командой scp в Linux, и он напомнил мне, что я регулярно забываю указывать двоеточие в основной части команды scp и, таким образом, копирую файл локально, а не на удаленный хост, например, я делаю

scp foo host

вместо

scp foo host:

Но я никогда не использую scp для локального копирования файла. Поэтому мне интересно, есть ли способ заставить scp провалиться, если оба (исходный и целевой) аргументы ссылаются на локальные файлы.

1 ответ1

1

Вы можете написать в 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"
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .