Mengapa <atau> diminta untuk menggunakan / dev / tcp

13

Ketika mencoba menelepon /dev/tcp/www.google.com/80 , dengan mengetik

/dev/tcp/www.google.com/80

Kata Bash no such file or directory . Saat melihat kode orang lain secara daring, mereka menggunakan sintaksis seperti

 3<>/dev/tcp/www.google.com/80

Saya perhatikan bahwa ini juga berfungsi:

</dev/tcp/www.google.com/80

Mengapa simbol-simbol ini diperlukan untuk memanggil hal-hal tertentu dalam bash?

john doe
sumber
2
Apa yang Anda maksud dengan "panggilan"? Tolong tunjukkan kepada kami apa yang Anda lakukan, ketika Anda mendapatkan kesalahan. Apakah Anda mencoba untuk mengeksekusinya? Bahkan jika halaman depan google adalah kode yang dapat dieksekusi, saya tidak akan merekomendasikannya.
ctrl-alt-delor
/dev/tcp/www.google.com/80
john doe
Saya mengedit pertanyaan Anda, untuk mengatakan apa yang Anda maksudkan.
ctrl-alt-delor

Jawaban:

29

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

/dev/tcp/...bukan file nyata, shell mencegat upaya untuk mengarahkan ulang 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 akan mencoba membuka file-file itu (yang pada kebanyakan 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/...bahkan 3>> /dev/tcp/...tidak akan membuat perbedaan, Anda akan dapat membaca dan menulis dari / ke deskriptor file itu untuk menerima / mengirim data melalui soket TCP tersebut.

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

Itu cat -adalah contoh lain dari jalur file yang ditangani secara khusus. Alih-alih melakukan open("-"), itu membaca langsung dari file descriptor 0 (stdin). catdan banyak utilitas teks melakukan itu, shell tidak untuk pengalihannya. Untuk membaca konten -file, Anda perlu cat ./-, atau cat < -(atau cat - < -). Pada sistem yang tidak memiliki /dev/stdin, bashakan melakukan sesuatu yang serupa untuk pengalihan dari file (virtual) itu. GNU awkmelakukan hal yang sama untuk /dev/stdin, /dev/stdout, /dev/stderrbahkan pada sistem yang memiliki file tersebut yang dapat menyebabkan beberapa kejutan pada sistem seperti Linux di mana file-file berperilaku berbeda.

zshjuga memiliki dukungan soket TCP (dan Unix domain stream), tapi itu dilakukan dengan ztcp(dan zsocket) builtins, jadi itu kurang terbatas daripada pendekatan ksh / bash. Secara khusus, ini juga dapat bertindak sebagai server yang tidak dapat dilakukan ksh / bash. Ini masih jauh lebih terbatas daripada apa yang dapat Anda lakukan dalam bahasa pemrograman nyata sekalipun.

Stéphane Chazelas
sumber
4

Anda tampaknya 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 akan aman untuk menjalankannya.

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

Kita bisa melakukan cat < /dev/tcp/towel.blinkenlights.nl/23Namun ini tidak akan berhasil karena /dev/tcp/www.google.com/80port ini tidak akan merespons sampai kami mengirimGET / HTTP/1.0\r\n\r\n

Jadi coba

{
  printf >&3 'GET / HTTP/1.0\r\n\r\n'
  cat <&3
} 3<>/dev/tcp/www.google.com/80
ctrl-alt-delor
sumber
1
Anda akan mendapatkan kesalahan yang berbeda jika file ada tetapi tidak dapat dieksekusi.
Barmar