Обратите внимание, что я не могу сначала сохранить файл локально - он слишком большой.
Эта (отвратительная) страница (прокручивается до конца), кажется, дает ответ, но у меня возникают проблемы при распутывании части, специфичной для ленточных накопителей:
Чтобы сделать это более конкретным, вот как вы думаете, это может работать:
На локальной машине:
% echo "pretend this string is a huge amt of data" | scp - remote.com:big.txt
(Это использует соглашение - которое scp на самом деле не поддерживает - заменяет черту для исходного файла, чтобы сказать ему вместо этого получить его из stdin.)
Ответы:
Вы можете подключиться к ssh и запустить удаленную команду. В этом случае удаленная команда
cat > big.txt
будет копировать стандартныйbig.txt
файл в файл.Это просто и понятно, если вы можете использовать ssh для подключения к удаленному концу.
Вы также можете использовать
nc
(NetCat) для передачи данных. На принимающем компьютере (например, host.example.com):Это настроит
nc
прослушивание порта 1234 и копирование всегоbig.txt
файла, отправленного на этот порт, в файл. Затем на отправляющей машине:Эта команда сообщит
nc
отправляющей стороне подключиться к порту 1234 на приемнике и скопировать данные со стандартного ввода через сеть.Однако у
nc
решения есть несколько недостатков:ssh
.ssh
решения вы можете инициировать передачу только с одной из конечных точек.источник
tar -cvzf >(ssh destination 'cat > file') huge_directory_tree
nc
ним также предлагает шифрование и сжатие ваших данных по умолчанию и, что более важно: обнаружение ошибок. У меня были ситуации, когда я использовалnc
неисправный сетевой драйвер, и поврежденные данные передавались незамеченными. В этом случае SSH потерпит неудачу, потому что он не может расшифровать / распаковать ошибочные данные.Используя ssh:
источник
Используйте nc (Net Cat), которому не нужно сохранять файл локально.
источник
nc
для этого. Однажды я выгружал необработанный образ диска с одной машины на другую, чтобы гораздо позже выяснить, что мой сетевой драйвер был неисправен и передал неисправные биты. Используйтеscp
,ssh
или что - нибудь еще , что скажет вам , когда есть ошибка передачи.Используйте трубу FIFO:
источник
scp
жаловался, что mypipe не был обычным файлом.mkfifo
чтобы создать трубу, хотя.)scp <(ls) destination
Спасибо Денису Щербакову!
Когда я попробовал твой скрипт на облаке Гетцнера, я получил
Но только файл без содержания был создан. Поскольку фактический контент уже зашифрован с помощью openssl, нам на самом деле не нужен scp. Встроенный linux
ftp
также обладает большими возможностями трубопровода. Итак, вот мое (все еще довольно ручное) решение:источник
Вот альтернативное решение:
Во всех приведенных выше примерах, предлагающих ssh + cat, предполагается, что "cat" доступна в системе назначения.
В моем случае система (резервное копирование Hetzner) имела очень ограниченный набор инструментов, предлагающих sftp, но не полную оболочку. Таким образом, использование ssh + cat было невозможно. Я придумал решение, которое использует недокументированный флаг "scp -t". Полный сценарий может быть найден ниже.
Обновление 2019.05.08:
Согласно запросу, ниже приведена гораздо более простая и короткая версия.
источник
scp -t
? Прямо сейчас у вас есть полный сценарий, который полностью настроен для вашей среды. Хорошая вещь для вики Hetzner, но не для суперпользователя, где большинство людей просто ищут способ передать ввод через scp.