Как я могу возобновить передачу большого файла scp при использовании переадресации портов?

10

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

Редактировать: для ясности, несколько прыжков необходимы для доступа к удаленному компьютеру. Со своей машины я настроил VPN, где я могу получить доступ к 10.255.xx - это единственная машина, к которой я могу подключиться через VPN. После входа в систему .xx я могу подключиться к другим машинам - .yy, являющимся одним из них.

С моей машины:

ssh -L 4567:localhost:4567 me@10.255.x.x

Затем с этой машины:

ssh -L 4567:localhost:22 me@10.255.y.y

Я могу тогда

scp -P 4567 me@localhost:/path/to/large/file.gz .

Я оставил эту работу на ночь, только чтобы обнаружить, что передача умерла в какой-то момент.

Я видел несколько предложений использовать rsync поверх ssh для возобновления передачи, но мне неясно, как это настроить. Это возможно?

Крис
источник
Для чего все эти прыжки? Не scp me@10.255.x.x:/path/to/large/file.gz .достиг бы точно так же? Какая версия scp (ssh) установлена ​​на клиенте и сервере?
Денис
@Dennis: scp не поддерживает возобновление передачи - то, что вы предлагаете, перезапустит загрузку.
Крис
Некоторые версии делают (scp моего ноутбука делает, мои VPS нет). Причина, по которой я спрашиваю, состоит в том, что прыжки кажутся мне ненужными, и повторное выполнение без прыжков будет намного проще.
Денис
Этот ответ также может вам помочь: unix.stackexchange.com/a/43097/14084
Бернхард,

Ответы:

9

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

Следующие ключи rsync удобны для возобновления прерванной передачи, если scp не поддерживает это:

     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -e, --rsh=COMMAND           specify the remote shell to use
     --progress              show progress during transfer

Команда

rsync --append-verify --progress --rsh="ssh -p 4567" me@localhost:/path/to/large/file.gz .

должен иметь желаемый эффект. Обратите внимание, что -pдля ssh переключатель должен быть в нижнем регистре.

Деннис
источник
Прыжки необходимы из-за того, как настроена сеть на конечном сервере. Проблема с использованием rsync через ssh заключается в том, что мне нужно использовать локальный порт 4567, файл не существует на сервере 10.255.xx.
Крис
Моя ошибка. Я предполагал, что это 10.255.y.yбыл клиентский компьютер.
Деннис
Я обновил свой ответ.
Денис
и что делать, если нет возможности использовать rsync? В моем случае у меня есть только FTP на удаленном хосте.
др.димитру
1
@Enzo Вопрос о SCP, ответ должен быть о scp. Вопрос о неполной передаче scp, а не об инструменте scp. Это буквально говорит о том, что я видел несколько предложений использовать rsync поверх ssh для возобновления передачи, но мне неясно, как это настроить. Это возможно? внизу.
Денис
3

Используйте sftp вместо scp

В твоем случае:

sftp -a -P 4567 me@localhost:/path/to/large/file.gz .

Со страницы руководства sftp:

-a      Attempt to continue interrupted downloads rather than overwriting existing partial or complete copies of files.  If the remote file contents differ from the partial local copy then the resultant file is likely to be corrupt.
AlexR
источник
1

rsync по умолчанию использует ssh, вам может потребоваться указать точную команду ssh с помощью ключа -e rsync. Он также имеет --partial, который должен хранить неполный файл, чтобы он мог возобновить передачу.

Люк Холлинс
источник
-1

Я не могу понять, в чем смысл ваших туннелей, поэтому вот как я бы решил вашу проблему:

ssh -R $tunnelPort:localhost:$localSSHPort $remoteUser@$remoteHost -p $remoteSSHPort

это открывает обратный туннель от локальной машины (localhost) к удаленной машине (remotehost). $ tunnelPort - это порт, на котором туннель находится на удаленном хосте. $ localSSHPort - это порт, на котором работает локальный sshd, а $ remoteSSHPort - тот, где слушает sshd удаленного хоста.

Теперь, когда вы находитесь в (обратном!) Туннеле, вы можете более или менее делать то, что предложил Деннис:

rsync --apend-verify -az -e 'ssh -p $tunnelPort' /path/to/large/file $user@localhost:/destination

флаги -a и -z описаны на справочной странице rsync, поэтому я не буду подробно останавливаться на них. Что происходит сейчас, так это то, что когда вы запускаете rsync на удаленном хосте, как указано выше, он помещает все данные в порт $ tunnelPort, который затем перенаправляется на sshd $ localSSHPort вашего локального хоста.

Надеюсь, что это помогло.

изобретательный
источник
@ingenous: я добавил объяснение туннелей.
Крис