Wysyłanie pliku przez netcat

23

Używam czegoś takiego do wysyłania pliku z jednego komputera na drugi:

Aby udostępnić plik (na komputerze A):

cat something.zip | nc -l -p 1234

Aby odebrać plik (na komputerze B):

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

Moje pytanie brzmi ... czy mogę zrobić coś przeciwnego? Załóżmy, że mam plik na komputerze B i chcę go wysłać do A, ale nie w sposób opisany powyżej, ale poprzez utworzenie komputera, który ma odbierać plik (A), być serwerem „nasłuchującym” i podłączyć komputer, który „wysyła” plik ( B) na serwer i wysłać plik? Czy to możliwe? Myślę, że tak, ale nie jestem pewien, jak to zrobić.

W przypadku, gdy moje powyższe wyjaśnienie zostanie pomieszane: Jak wysłać plik do „serwera” zamiast podawać plik na serwerze, a następnie pobierać go z niego (tak jak to zrobiłem powyżej)?

Phil
źródło
Uwaga: jeśli używasz, ncponieważ scpjest zbyt wolny i nie potrzebujesz szyfrowania, możesz przełączyć na udpcast: superuser.com/questions/692294/…
unhammer

Odpowiedzi:

38

Na twoim serwerze (A):

nc -l -p 1234 -q 1> coś.zip </ dev / null
W „kliencie nadawcy” (B):
kot coś. zip | netcat server.ip.here 1234

martinwguy
źródło
Tak, myślałem, że będę musiał jakoś zmienić strony, ale nie byłem pewien jak :). Dzięki, działa!
Phil
To urocza sztuczka z NetCat.
DaveParillo
2
dlaczego < /dev/nullczęść
törzsmókus
7
Ponieważ netcat zarówno odczytuje stdin, jak i zapisuje stdout jednocześnie, wysyłając wszystko czytane ze stdin do sieci i drukując wszystko otrzymane z sieci na stdout. </ Dev / null zapewnia, że ​​po zakończeniu odebranego pliku netcat nie będzie tam siedział w nieskończoność, czekając na dane wejściowe z konsoli (której i tak nie powinien czytać!), A także zapewnia, że ​​nie pożre wszelkie dane wejściowe, które mogą być dostępne z terminala, takie jak wpisanie następnego polecenia, które chcesz uruchomić.
martinwguy
4
jeśli tak pv, sugeruję obsługę „klienta serwera” pv soemthing.zip | ..., ponieważ wyświetli on postęp odczytu pliku przechodzącego do potoku.
ThorSummoner
6

Uwaga: jeśli chcesz zachować uprawnienia do plików, własność i znaczniki czasu, używamy tar z netcat do wykonywania transferów katalogów i plików.

W systemie odbiorczym:

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

Z systemu wysyłającego:

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

Mam nadzieję, że to pomaga.

B.Kaatz
źródło
1
Dobry dodatek do odpowiedzi, ale proszę zostawić to jako komentarz, a nie jako osobną odpowiedź.
agtoever
2
Nie mogłem dodać powyższego komentarza z powodu braku punktów Rep na tej pod-tablicy, więc musiałem zaoferować go jako odpowiedź, choć najwyraźniej możesz komentować własne odpowiedzi.
B.Kaatz,
3

Komputer A: nc -l -p 1234 > filename.txt

Komputer B: nc server.com 1234 < filename.txt

Powinien też działać;)

znak
źródło
0

Uruchom inną instancję netcata na komputerze B. Po prostu zrób to, co zrobiłeś na komputerze A, ale podaj go z B. Daj nowemu serwerowi nowy port.

DaveParillo
źródło
Nie chcę robić tego samego, chcę zmienić polecenia na coś innego (nie jestem pewien, czy to możliwe) ... spójrz na pogrubiony tekst w moim pytaniu. Chodzi mi o to, że nie chcę obsługiwać z B. Chcę, aby serwer A nasłuchiwał danych wejściowych ... a następnie chcę przesyłać zawartość pliku z niesłuchującego B do nasłuchującego A.
Phil
Nie tak działa Netcat.
DaveParillo,
1
Jak widać z zaakceptowanej odpowiedzi - tak, tak też może działać netcat.
Phil
Masz rację. Codziennie uczę się czegoś nowego!
DaveParillo