Препятствовать тому, чтобы scp перезаписал существующие файлы?

bsdtar cf - . | xz | pv -L 3m | ssh host 'cd /there && xz -d | bsdtar xpSf -'

(здесь использующий bsdtar, поскольку другие обычно не хранят все метаданные файла).

xz вероятно, лучшее сжатие, которое можно получить (но очень интенсивный ЦП), pv для ограничения уровня (отмечают, что это - 3 мега (220)байты в секунду).

Добавьте --numeric-owner опция к второму bsdtar если это для резервного копирования, и Вы хотите сохранить uids/gids.

Это было бы более эффективно (с точки зрения пропускной способности и ресурса на обоих серверах), чем использование rsyncxz сжатие) для полной передачи, но если необходимо возобновить передачу или синхронизирующие папки, у которых есть общие файлы, это то, где rsync прибывает удобный (но читайте rsync страница справочника тщательно для выбора, какие опции необходимо сохранить метаданные, которые Вы хотите сохранить).

3
15.01.2015, 16:52
1 ответ

Это простая функция оболочки ( bash и ksh93 ), который является оболочкой вокруг scp . Он откажется выполнять настоящий scp , если целевой файл существует в системе.

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

Функция выбирает цель из последнего аргумента командной строки, а затем проверяет, соответствует ли она существующему имени файла. Если это так, он отказывается выполнять scp , отображает диагностическое сообщение и возвращает ненулевой статус выхода.

Если имя файла, соответствующее целевому файлу, отсутствует, он продолжает и вызывает реальный scp с исходной командной строкой.

Не делается попыток различить передачу в том или ином направлении. Таким образом, он завершится ошибкой, если в текущем каталоге есть имя файла, соответствующее формату типа user @ hostname: file .

Если у вас есть список защищенных имен файлов в файле (это должен быть список абсолютных путей, по одному в каждой строке, соответствующих реальному пути к каждому файлу, возвращенному утилитой GNU coreutils realpath ):

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 "$@"
}
1
27.01.2020, 21:31

Теги

Похожие вопросы