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?
linux
bash
io-redirection
devices
john doe
sumber
sumber
Jawaban:
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 melakukansocket(...);connect(...)
(membuat koneksi TCP) alih-alihopen("/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/...
atau3> /dev/tcp/...
atau3<> /dev/tcp/...
bahkan3>> /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 karenacat
tidak menerapkan penanganan khusus yang sama, itu memangopen("/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 melakukanopen("-")
, itu membaca langsung dari file descriptor 0 (stdin).cat
dan banyak utilitas teks melakukan itu, shell tidak untuk pengalihannya. Untuk membaca konten-
file, Anda perlucat ./-
, ataucat < -
(ataucat - < -
). Pada sistem yang tidak memiliki/dev/stdin
,bash
akan melakukan sesuatu yang serupa untuk pengalihan dari file (virtual) itu. GNUawk
melakukan hal yang sama untuk/dev/stdin
,/dev/stdout
,/dev/stderr
bahkan pada sistem yang memiliki file tersebut yang dapat menyebabkan beberapa kejutan pada sistem seperti Linux di mana file-file berperilaku berbeda.zsh
juga memiliki dukungan soket TCP (dan Unix domain stream), tapi itu dilakukan denganztcp
(danzsocket
) 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.sumber
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/23
Namun ini tidak akan berhasil karena/dev/tcp/www.google.com/80
port ini tidak akan merespons sampai kami mengirimGET / HTTP/1.0\r\n\r\n
Jadi coba
sumber