Apakah / dev / {udp, tcp} standar atau tersedia di mana-mana?

17

Saya baru-baru ini belajar tentang /dev/udpdan /dev/tcpperangkat palsu di sini . Apakah mereka khusus untuk beberapa distribusi GNU / Linux atau dapatkah saya menemukannya di sistem unix lainnya?

Apakah mereka distandarisasi dalam beberapa cara?

Sejauh ini, saya sudah bisa menggunakannya dengan sukses di OS X, Arch Linux dan CentOS.

Antoine
sumber

Jawaban:

26

Ini adalah fitur dari shell dan bukan sistem operasi.

Jadi, misalnya, pada Solaris 10 dengan ksh88sebagai shell:

% cat < /dev/tcp/localhost/22
ksh: /dev/tcp/localhost/22: cannot open

Namun jika kita beralih ke bash:

% bash
bash-3.2$ cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_1.1.5

Jadi bashmengartikannya /dev/tcptetapi ksh88 tidak.

Pada Solaris 11 dengan ksh93sebagai shell:

% cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_2.2

Jadi kita bisa melihatnya sangat tergantung pada shell yang digunakan.

Stephen Harris
sumber
4
Juga tergantung pada opsi waktu kompilasi - tidak semua bash build akan mengaktifkannya.
Charles Duffy
@CharlesDuffy Cukup benar; juga berlaku untuk ksh (ksh-88 mencoba mendeteksi secara otomatis, tapi saya tidak yakin itu berfungsi dengan baik).
Stephen Harris
1
Mengenai kalimat pertama, POSIX memang membakukan beberapa fitur dasar shell (walaupun /dev/tcp/...bukan salah satunya).
Tanz87
3

Untuk menambahkan, dari simpul Bash Info :

Bash menangani beberapa nama file secara khusus ketika mereka digunakan dalam pengalihan, seperti yang dijelaskan dalam tabel berikut. Jika sistem operasi tempat Bash menjalankan menyediakan file-file khusus ini, bash akan menggunakannya; jika tidak maka akan meniru mereka secara internal dengan perilaku yang dijelaskan di bawah ini.

'/ dev / fd / FD' Jika FD adalah bilangan bulat yang valid, deskriptor file FD diduplikasi.

'/ dev / stdin' File descriptor 0 digandakan.

'/ dev / stdout' File deskriptor 1 digandakan.

'/ dev / stderr' File descriptor 2 digandakan.

'/ dev / tcp / HOST / PORT' Jika HOST adalah nama host atau alamat Internet yang valid, dan PORT adalah nomor port integer atau nama layanan, Bash mencoba untuk membuka soket TCP yang sesuai.

'/ dev / udp / HOST / PORT' Jika HOST adalah nama host atau alamat Internet yang valid, dan PORT adalah nomor port integer atau nama layanan, Bash mencoba untuk membuka soket UDP yang sesuai.

extremeaxe5
sumber