GNU/Linux >> Belajar Linux >  >> Linux

Mengapa < atau > diperlukan untuk menggunakan /dev/tcp

Karena itu adalah fitur dari shell (dari ksh, disalin oleh bash), dan hanya shell.

/dev/tcp/... bukan file asli, shell mencegat upaya untuk mengalihkan ke /dev/tcp/... file dan kemudian melakukan socket(...);connect(...) (membuat koneksi TCP) alih-alih open("/dev/tcp/..."...) (membuka file itu) dalam kasus itu.

Perhatikan bahwa itu harus dieja seperti itu. cat < /dev/./tcp/... atau ///dev/tcp/... tidak akan berfungsi, dan sebagai gantinya akan mencoba membuka file tersebut (yang pada sebagian besar sistem tidak ada dan Anda akan mendapatkan kesalahan).

Arah pengalihan juga tidak masalah. Apakah Anda menggunakan 3< /dev/tcp/... atau 3> /dev/tcp/... atau 3<> /dev/tcp/... atau bahkan 3>> /dev/tcp/... tidak akan ada bedanya, Anda akan dapat membaca dan menulis dari/ke deskriptor file tersebut untuk menerima/mengirim data melalui soket TCP tersebut.

Ketika Anda melakukan cat /dev/tcp/... , itu tidak berfungsi karena cat tidak mengimplementasikan penanganan khusus yang sama, ia melakukan open("/dev/tcp/...") seperti untuk setiap file (kecuali - ), hanya shell (ksh, bash saja) yang melakukannya, dan hanya untuk target pengalihan.

cat - itu adalah contoh lain dari jalur file yang ditangani secara khusus. Alih-alih melakukan open("-") , dibaca langsung dari deskriptor file 0 (stdin). cat dan banyak utilitas teks melakukan itu, shell tidak melakukannya untuk pengalihannya. Untuk membaca isi dari - file, Anda membutuhkan cat ./- , atau cat < - (atau cat - < - ). Pada sistem yang tidak memiliki /dev/stdin , bash namun akan melakukan hal serupa untuk pengalihan dari file (virtual) itu. GNU awk melakukan hal yang sama untuk /dev/stdin , /dev/stdout , /dev/stderr bahkan pada sistem yang memiliki file seperti itu yang dapat menyebabkan beberapa kejutan pada sistem seperti Linux di mana file tersebut berperilaku berbeda.

zsh juga memiliki dukungan soket TCP (dan aliran domain Unix), tetapi itu dilakukan dengan ztcp (dan zsocket ) bawaan, jadi tidak terlalu terbatas dibandingkan pendekatan ksh/bash. Secara khusus, itu juga dapat bertindak sebagai server yang tidak dapat dilakukan oleh ksh/bash. Itu masih jauh lebih terbatas daripada apa yang dapat Anda lakukan dalam bahasa pemrograman sebenarnya.


Anda sepertinya membingungkan ide atau membaca file dan menjalankan perintah. Perbedaan antara data dan instruksi.

Halaman depan Google bukanlah program yang dapat dieksekusi. Dan jika ya, tidak aman untuk menjalankannya.

Karakter pengalihan (termasuk < dan > ), digunakan untuk mengarahkan data ke dalam perintah.

Kita bisa melakukan cat < /dev/tcp/towel.blinkenlights.nl/23 Namun ini tidak akan berfungsi untuk /dev/tcp/www.google.com/80 karena port ini tidak akan merespons hingga kami mengirim GET / HTTP/1.0\r\n\r\n

Jadi cobalah

{
  printf >&3 'GET / HTTP/1.0\r\n\r\n'
  cat <&3
} 3<>/dev/tcp/www.google.com/80

Linux
  1. Linux:Perbedaan Antara /dev/console , /dev/tty Dan /dev/tty0?

  2. Bagaimana cara menyandikan base64 /dev/random atau /dev/urandom?

  3. DD dari /dev/zero ke /dev/null...apa yang sebenarnya terjadi

  1. Linux:Perbedaan antara /dev/console , /dev/tty dan /dev/tty0

  2. Bagaimana Linux menggunakan /dev/tty dan /dev/tty0

  3. Apakah salah menautkan /dev/random ke /dev/urandom di Linux?

  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Mengapa pada beberapa sistem Linux, sistem file root muncul sebagai /dev/root bukan /dev/<real device node>di mtab?

  3. Haruskah situs web berada di /var/ atau /usr/ sesuai dengan penggunaan yang disarankan?