Назад | Перейти на главную страницу

Использование wget в кластере с ssh-tunnel

Обычно я могу копировать файлы с одной машины на другую, используя

> scp -oProxyJump=user@login.node.org ssh user@main.node.org:/home/user/my_files/* .

что очень медленно для больших наборов данных.

Мне сказали, что машины, которые я использую, имеют очень быструю ссылку, доступ к которой можно получить с помощью wget. Как мне вместо этого выполнить ту же передачу файлов с помощью wget?

Если у вас есть быстрое, безопасное и стабильное сетевое соединение между этими двумя машинами, вы можете использовать комбинацию netcat и tar, как это.

На конечном компьютере запустите:

nc -l 10000 | tar -C /destination/directory -xzf -

На исходной машине запустите:

tar -cz /source/directory | nc dst-machine-ip-address 10000

Имейте в виду, что шифрование не будет использоваться, поэтому трафик можно перехватить, и если по какой-либо причине соединение будет разорвано, вам придется начинать все заново.

Лично я бы не отставал от rsync.

Производительность scp может быть вызвано двумя факторами:

  • Стоимость шифрования, которая может быть слишком высокой для медленных процессоров,
  • Количество циклов, необходимое для запроса одного файла.

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

Решением, которое работает, является использование программы, которая установлена ​​как на клиенте, так и на сервере и отправляет обратно только один поток данных (вместо тысяч ssh каналы):

  • Если у вас есть rsync на удаленном сервере (и вы устанавливаете его на клиенте) используйте:

    rsync -av -e "ssh -oProxyJump=user@login.example.net" user@node.example.net:/home/user/my_files .
    
  • В противном случае вы можете использовать деготь:

    ssh -o ProxyJumbp=user@login.example.net -e none user@node.example.net \
    tar -c /home/user/my_files | tar -x