/ dev / tcp dengarkan bukannya nc dengarkan


39

Dengan pendengar netcat seperti:

nc -l <port> < ~/.bashrc

Saya dapat mengambil .bashrc saya di mesin baru (tidak memiliki ncatau LDAP) dengan:

cat < /dev/tcp/<ip>/<port> > ~/.bashrc

Pertanyaan saya adalah: Apakah ada cara untuk meniru kemampuan nc -l <port>di baris pertama saya dengan / dev / tcp bukan nc?

Mesin yang saya kerjakan adalah lingkungan lab / kotak pasir yang sangat keras RHEL (no ssh, no nc, no LDAP, no yum, saya tidak dapat menginstal perangkat lunak baru, dan mereka tidak terhubung ke internet)


singkat menulis skrip python untuk menjaga soket terbuka apakah ada cara mudah untuk mencapai ini
h3rrmiller

Jawaban:


23

Jika Perl diinstal (karena akan berada di mesin RHEL):

perl -MIO::Socket::INET -ne 'BEGIN{$l=IO::Socket::INET->new(
  LocalPort=>1234,Proto=>"tcp",Listen=>5,ReuseAddr=>1);
  $l=$l->accept}print $l $_' < ~/.bashrc

akan berfungsi, kecuali jika firewall lokal tidak mengizinkan koneksi masuk ke 1234.

Jika socat diinstal:

socat -u - tcp-listen:1234,reuseaddr < ~/.bashrc

Jika zsh diinstal:

zmodload zsh/net/tcp
ztcp -ld3 1234 && # start listening socket on fd 3
  ztcp -ad4 3 && # accept connection on fd 4
  ztcp -c 3 && # close the listening socket that is no longer needed
  cat < ~/.bashrc >&4 && # send the data
  ztcp -c 4 # close the communication socket to tell the other end we're finished

Bukankah seharusnya ztcp -c 4perintah terakhir membaca 3? Jika tidak, info hebat, tip bagus.
dezza

@dezza, lihat edit. Soket pada fd 3 memang tidak sedang ditutup (meskipun saat skrip berakhir). Kita harus menutup soket pada fd 4 sehingga ujung yang lain mendapatkan EOF.
Stéphane Chazelas

42

Sayangnya tidak mungkin dilakukan hanya dengan bash. /dev/tcp/<ip>/<port>file virtual diimplementasikan dengan cara bash mencoba untuk terhubung ke fungsi <ip>:<port>menggunakan yang ditentukan connect(2). Untuk membuat soket pendengaran, itu harus memanggil bind(2)fungsi.

Anda dapat memeriksa ini dengan mengunduh bashsumber dan melihatnya. Ini diimplementasikan dalam fungsi lib/sh/netopen.cfile _netopen4(atau _netopen6, yang juga mendukung IPv6). Fungsi ini digunakan oleh fungsi wrapper netopendari file yang sama, yang pada gilirannya secara langsung digunakan dalam file redir.c( redir_special_openfungsi) untuk mengimplementasikan pengalihan virtual ini.

Anda harus menemukan beberapa aplikasi lain yang dapat membuat soket pendengaran pada mesin Anda.


Memberi +1 pada bash untuk membuat soket klien tetapi soket server yang dapat Anda gunakan nc atau dapat diimplementasikan dengan perl atau c, sebenarnya proses server akan mengulang menerima koneksi dan proses pemijahan atau membuat utas atau hanya dapat menerima satu koneksi dengan satu
Nahuel Fouilleul

2
@NahuelFouilleul: Itu tidak sepenuhnya benar. Anda dapat memproses banyak klien hanya dengan satu utas / proses menggunakan yang disebut pemrograman jaringan "asynchronious" atau "event driven" (coba googling untuk fungsi select () dan bagaimana itu dapat digunakan dalam pemrograman jaringan). Dalam banyak kasus itu jauh lebih baik (lebih cepat) cara menerima banyak klien.
Krzysztof Adamski

Terima kasih saya tidak
memikirkan

4
Ini untuk apa xinetd. Ia mendengarkan, dan memunculkan proses / skrip arbitrer Anda untuk koneksi apa pun yang masuk. Dengan itu, apa pun bisa menjadi server TCP / IP.
Evi1M4chine

0

Tidak ada cara untuk mendengarkan karena mendengarkan tidak dalam bash seperti yang ditunjukkan oleh Adamski.

Tetapi Anda tidak perlu mendengarkan klien sehingga Anda tidak perlu netcat pada klien untuk mentransfer file, misalnya:

## To send a file to the locked down computer: 
 ## Local server where you do have netcat 
cat ~/.bashrc | nc -l -q 1 -p 8998

 ## Remote locked down computer without netcat
cat < /dev/tcp/local.server.ip.addr/8998 > latest.bashrc 

## To grab a file from the locked down computer: 
 ## First - on the local server run 
nc -l -p 8998 -q 1 > remote.bashrc < /dev/null 

 ## Then on the locked down computer run: 
cat ~/.bashrc > /dev/tcp/local.server.ip.addr/8998 0<&1 2>&1

-3

Anda dapat melakukannya seperti yang Anda katakan, bertanya / dev / tcp, dengan bash:

</dev/tcp/host/port

jika itu berjalan segera, itu mendengarkan, bagaimanapun juga waktu habis


4
Tidak. Anda pasti tidak menguji ini dan jika Anda melakukannya Anda tidak harus memahami hasilnya. Saran Anda akan membuka soket (tidak mendengarkan) dan mengarahkan kembali ke perintah apa pun yang Anda jalankan. Jawaban yang benar telah ditemukan (hampir 6 tahun yang lalu ...) jadi saya tidak yakin mengapa Anda memilih untuk menghapus pertanyaan ini.
h3rrmiller
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.