Отправка файла через netcat

23

Я использую что-то вроде этого для отправки файла с одного компьютера на другой:

Для подачи файла (на компьютере A):

cat something.zip | nc -l -p 1234

Чтобы получить файл (на компьютере B):

netcat server.ip.here. 1234 > something.zip

Мой вопрос ... могу ли я сделать наоборот? Допустим, у меня есть файл на компьютере B, и я хочу отправить его на А, но не так, как я писал выше, а сделать компьютер, который должен принимать файл (A), «прослушивающим» сервером и подключить компьютер, «отправляющий» файл ( Б) на сервер и отправить файл? Является ли это возможным? Я думаю, что это может быть, но я не уверен, как это сделать.

В случае, если моё вышеприведённое объяснение испорчено: как отправить файл на «сервер» вместо того, чтобы отправить файл на сервер, а затем забрать его с него (как я это делал выше)?

Фил
источник
Примечание: если вы используете, ncпотому что scpэто слишком медленно и вам не нужно шифрование, вы можете переключиться на udpcast: superuser.com/questions/692294/…
unhammer

Ответы:

38

На вашем сервере (A):

nc -l -p 1234 -q 1> что-то.zip </ dev / null
На вашем "клиенте отправителя" (B):
кошка что-то.zip | netcat server.ip.here 1234

martinwguy
источник
Да, я думал, что мне придется как-то поменяться сторонами, но я не знал, как это сделать :). Спасибо, это работает!
Фил
Это милый трюк с кошкой.
DaveParillo
2
почему < /dev/nullчасть?
törzsmókus
7
Поскольку netcat одновременно читает stdin и записывает stdout, отправляет все данные, считанные со stdin, в сеть и печатает все полученные из сети данные на stdout. </ Dev / null гарантирует, что, когда полученный файл завершится, netcat не будет сидеть там бесконечно в ожидании ввода с консоли (который он не должен читать в любом случае!), А также гарантирует, что он не сожрет любой ввод, который может быть доступен из терминала, например, если вы набираете следующую команду, которую хотите запустить.
martinwguy
4
если у вас есть pv, я бы предложил использовать «серверный клиент» pv soemthing.zip | ..., который будет отображать ход чтения файла, поступающего в канал.
ThorSummoner
6

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

На принимающей системе:

nc -l -p 12345 -q 1 | tar xz -C /path/to/root/of/tree

От отправляющей системы:

tar czf - ./directory_tree_to_xfer | nc <host name or IP address of receiving system> 12345 

Надеюсь, это поможет.

B.Kaatz
источник
1
Хорошее дополнение к ответу, но, пожалуйста, оставьте его как комментарий, а не как отдельный ответ.
agtoever
2
Не удалось добавить комментарий выше из-за отсутствия точек повторений на этой подплате, поэтому мне пришлось предложить его в качестве ответа, хотя, по-видимому, вам разрешено комментировать свои собственные ответы.
Б. Каац
3

Компьютер А: nc -l -p 1234 > filename.txt

Компьютер Б: nc server.com 1234 < filename.txt

Должно работать тоже;)

отметка
источник
0

Запустите другой экземпляр netcat на компьютере B. Просто сделайте то же, что вы сделали на компьютере A, но обслуживайте его с B. Дайте новому серверу новый порт.

DaveParillo
источник
Я не хочу делать то же самое, я хочу изменить команды на что-то другое (я не уверен, если это возможно) ... посмотрите на жирный текст в моем вопросе. Я имею в виду, что я не хочу обслуживать из B. Я хочу, чтобы A был сервером, прослушивающим ввод, а затем я хочу отправить содержимое файла из не слушающего B в прослушивающее A.
Phil
Это не так, как работает Netcat.
DaveParillo
1
Как видно из принятого ответа - да, именно так может работать netcat.
Фил
Ты прав. Я узнаю что-то новое каждый день!
DaveParillo