Передайте соединение TCP от одного поля Linux до другого позади NAT?

Обычно, если Вы помещаете что-то в фоновом режиме, что это продолжит работать даже за своими родительскими выходами оболочки. На самом деле я могу создать тестовый сценарий как это:

/bin/sh -c 'while true; do echo hi; sleep 5; done' &

и затем выйдите из оболочки и использования ps Я вижу, что это все еще работает, навсегда, пока я не уничтожаю его.

Существует одно различие между перенаправлением вывода и нет: если Вы не перенаправляете вывод, и Вы выходите из своей оболочки, то stdout/stderr дескрипторы файлов закрываются и в следующий раз, когда Вы пытаетесь записать в них, операция записи перестанет работать. Если Ваш сценарий проверяет на это или работает с -e (выход на ошибке), набор опции, затем Ваш сценарий остановится. Сравните поведение вышеупомянутого с этой версией:

/bin/sh -c 'while true; do echo hi || exit 1; sleep 5; done' &

или

/bin/sh -ec 'while true; do echo hi; sleep 5; done' &

Если Вы оставляете это выполнение, выходите из оболочки и использования ps Вы будете видеть это, когда это попытается работать echo это перестанет работать, и выход.

Если необходимо было перенаправить вывод в файл затем, очевидно, запись больше не перестанет работать, и сценарий продолжит работать.

3
31.05.2013, 03:43
3 ответа

Это не имеет смысла в большинстве случаев. Прервите загрузку, скопируйте то, что уже загружается на сервер и использование wget возобновлять загрузку.

1
27.01.2020, 21:28
  • 1
    Это не действительно решение, когда Вы будете использовать бесплатные сервисы как Rapidshare - Вы не сможете возобновить загрузку затем. –  d33tah 31.05.2013, 13:49
  • 2
    @d33tah я записал наиболее намеренно. :-) –  Hauke Laging 31.05.2013, 14:08

Я не думаю, что это возможно, учитывая основы того, как соединение TCP/IP работает в дополнение к брандмауэру NAT если Вы способность совместно использовать Ваш внешний IP-адрес среди нескольких компьютеров на Вашей LAN. Это сказанное существует некоторые подсказки/приемы, которые могли бы помочь, один Вы понимаете, как они работают.

Подсказка № 1 - screen/tmux

Обычно то, что я делаю, - то, если у меня будет большой файл для загрузки, то я буду ssh в другой компьютер в моей сети и выполненный screen/tmux там. С screen/tmux сессией я могу запустить длительные программы (такие как загрузка) в терминале, не имея их остановка, когда я разъединяюсь ssh соединение с этой вторичной машиной.

Шаблон похож на это:

laptop$ ssh remotemachine

...login...

remote$ screen -S mydownload

...now have a screen session called "mydownload"...

remote$ wget http://www.bigfiles.com/somebigfile

...Ctrl+A Ctrl+D.... <--- (disconnect from screensession)

...a little while later...

laptop$ ssh remotemachine
remote$ screen -r mydownload

...wget is still running in here...

Подсказка № 2 - xdg-открытый

Эта программа позволяет Вам петлять и/или URL через предпочтительное приложение. Например, у меня есть Firefox установки на удаленной машине на моей LAN так, чтобы это имело ассоциацию для 'magnet://' обработчик. С этим на удаленной машине я могу выполнить команды как это:

ssh remotemachine "DISPLAY=:0.0; xdg-open magnet://url_of_magnet_link...."

На моем ноутбуке, и это "инициирует" мой remotemachine, чтобы начать загружать ту магнитную ссылку через Firefox, который затем передаст тот URL на приложение, это связано с обработкой magnet://ссылки. В этом случае я использую Vuze, чтобы сделать обработку.

Если Вам любопытно, как установить Firefox, чтобы сделать это, я записал об этом на моем блоге некоторое время назад. Статьи названы: [острота]: практическое руководство заставляет Firefox 10.x Запускать Клиент БитТоррента по Магнитной Ссылке на Linux.

1
27.01.2020, 21:28

От IP, TCP и перспективы NAT, это определенно возможно. Я могу предположить, что сервер берет IP-адрес ПК. Я могу, также отображая ядро Linux сервера, готовят передачу соединения путем инициализации необходимых структур данных сокета и блока управления протокола. Передача фактического соединения потребовала бы некоторой координации между двумя ядрами Linux.

И действительно один многообещающий подход существует: Передача соединения TCP. Это состоит из патча ядра, который расширяет сокет API для передачи соединения и ряда инструментов для инициирования передачи. Этот подход принимает роль во внимание прикладного уровня.

Вещь: соединение TCP также включает состояние приложения, совместно использованное двумя концами. Оба конца ожидают друг друга действие согласно тому состоянию. Таким образом, при замене одного конца некоторой общей сущностью, которая просто сосет данные, ничему не отвечая, Вы рискуете повреждать состояние (и таким образом соединение) только, не ведя себя правильно. Это не могло бы быть проблемой для сценария, который Вы описали, но он ограничивает применимость общего соединения передающая схема, которую Вы имеете в виду. Так не, я не думаю вполне, что такая вещь существует, но Передача соединения TCP является хорошим началом. Можно адаптировать его в соответствии с потребностями.

0
27.01.2020, 21:28

Теги

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