как сделать двойное туннелирование для отправки больших данных?

В именах файлов можно использовать любые символы, кроме нулевого символа(\0)и косой черты, которая является разделителем пути. Переменные могут содержать любые данные (, за исключением нулевых символов в большинстве оболочек ). При правильном заключении в кавычки имена файлов можно безопасно хранить в переменных и использовать с утилитами.

О ваших баллах:

Для перебора набора файлов (обычных файлов или каталогов )вы можете использовать простой цикл оболочки, например

for name in./*; do
    # some code that uses "$name"
done

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

find. -type f -mtime +N

Точно так же -sizeиспользуется для выбора файлов по размеру и -nameдля сопоставления имени файла с шаблоном подстановки.

Например, чтобы выбрать обычные файлы, имена которых соответствуют *.movи которые были изменены за последнюю неделю:

find. -type f -name '*.mov' -mtime -7

Затем, чтобы на самом деле сделать что-то с этими файлами, например переместить их в каталог $HOME/Movies:

find. -type f -name '*.mov' -mtime -7 -exec mv {} "$HOME/Movies" ';'

{}будет заменено путем к файлу при вызове mv. Вам не нужно заключать{}(в кавычки, это ничего не изменит, если вы сделаете ), так как findне будет вызывать разбиение слов оболочки или расширение имени файла в имени пути.

Дальнейшим улучшением этого будет обнаружение конфликтов имен файлов в целевом каталоге. Для этого мы используем короткий вспомогательный скрипт, который будет принимать несколько имен файлов в своей командной строке:

destdir="$HOME/Movies"
for name do
    if [ -f "$destdir/${name##*/}" ]; then
        printf "%s already exists in %s, not overwriting it!\n" "${name##*/}" "$destdir" >&2
    else
        mv "$name" "$destdir"
    fi
done

или сокращенно:

destdir="$HOME/Movies"
for name do
    [ -f "$destdir/${name##*/}" ] && printf "skipping %s\n" "$name" >&2 && continue
    mv "$name" "$destdir"
done

Подключаем это к нашей команде find:

find. -type f -name '*.mov' -mtime -7 -exec sh -c '
    destdir="$HOME/Movies"
    for name do
        [ -f "$destdir/${name##*/}" ] && printf "skipping %s\n" "$name" >&2 && continue
        mv "$name" "$destdir"
    done' sh {} +

Нигде на этом пути мы не позволяем оболочке выполнять разбиение на слова или подстановку имени файла для пути или имени файла, которые мы в данный момент обрабатываем.

Для получения дополнительной информации:

0
28.04.2021, 12:41
1 ответ

Используйте ProxyJump, это то же самое, что и ssh -J, т.е. подключение через узлы перехода.

scp -oProxyJump=userB@B,userC@C file userD@D:/path/to/target

Пропустить определение пользователей, если в этом нет необходимости:

scp -oProxyJump=B,C file D:/path/to/target

man 5 ssh_config

ProxyJump

Specifies one or more jump proxies as either [user@]host[:port] or an ssh URI. Multiple proxies may be separated by comma characters and will be visited sequentially. Setting this option will cause ssh(1) to connect to the target host by first making a ssh(1) connection to the specified ProxyJump host and then establishing a TCP forwarding to the ultimate target from there.


Учитывая размер ваших файлов, вас может заинтересовать отказоустойчивость на случай прерывания соединения. rsyncможет возобновить прерванную передачу и использовать опцию узла перехода ssh:

rsync -P -e"ssh -oProxyJump=userB@B,userC@C" file userD@D:/path/to/target/
0
28.04.2021, 22:51

Теги

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