Apa yang disimpan dalam file / dev / pts dan bisakah kita membukanya?

73

Menurut pengetahuan saya, /dev/ptsfile dibuat untuk sesi ssh atau telnet.

pengguna2720323
sumber
6
echo Hello > /dev/pts/1... Lihat apa yang terjadi, ini terminal Anda.
Sepahrad Salour
5
Lihat juga Bagaimana cara kerja terminal Linux?
Gilles 'SANGAT berhenti menjadi jahat'
1
@SepahradSalour kita harus menyesuaikan nomor pts dengan konteksnya. sshd saya telah menggunakan / dev / pts / 30 untuk sesi saya.
Gab 是 好人
2
@Gab 是 好人 Untuk mendapatkan lokasi terminal Anda saat ini, Anda dapat menggunakan perintah tty.
JeromeJ

Jawaban:

110

Tidak ada yang disimpan di /dev/pts. Sistem file ini hidup murni di memori.

Entri dalam /dev/ptsadalah pseudo-terminal (pty). Kernel Unix memiliki gagasan umum tentang terminal . Terminal menyediakan cara bagi aplikasi untuk menampilkan output dan menerima input melalui perangkat terminal . Suatu proses mungkin memiliki terminal pengendali - untuk aplikasi mode teks, ini adalah bagaimana ia berinteraksi dengan pengguna.

Terminal dapat berupa terminal perangkat keras ("tty", kependekan dari "teletype") atau terminal semu ("pty"). Terminal perangkat keras terhubung melalui beberapa antarmuka seperti port serial ( ttyS0, ...) atau USB ( ttyUSB0, ...) atau melalui layar PC dan keyboard ( tty1, ...). Pseudo-terminal disediakan oleh emulator terminal, yang merupakan aplikasi. Beberapa jenis terminal semu adalah:

  • Aplikasi GUI seperti xterm, gnome-terminal, konsole, ... mengubah peristiwa keyboard dan mouse menjadi input teks dan menampilkan output secara grafis dalam beberapa font.
  • Aplikasi multiplexer seperti layar dan input dan output relay tmux dari dan ke terminal lain, untuk memisahkan aplikasi mode teks dari terminal aktual.
  • Aplikasi shell jarak jauh seperti sshd, telnetd, rlogind, ... relay input dan output antara terminal jarak jauh pada klien dan pty pada server.

Jika suatu program membuka terminal untuk menulis, output dari program itu muncul di terminal. Adalah umum untuk memiliki beberapa program yang mengeluarkan ke terminal pada saat yang sama, meskipun hal ini dapat membingungkan pada waktu-waktu tertentu karena tidak ada cara untuk mengetahui bagian mana dari keluaran yang berasal dari program mana. Proses latar belakang yang mencoba menulis ke terminal pengendali mereka dapat ditangguhkan secara otomatis oleh sinyal SIGTTOU .

Jika suatu program membuka terminal untuk membaca, input dari pengguna diteruskan ke program itu. Jika beberapa program membaca dari terminal yang sama, setiap karakter dialihkan secara independen ke salah satu program; ini tidak disarankan. Biasanya hanya ada satu program yang secara aktif membaca dari terminal pada waktu tertentu; program yang mencoba membaca dari terminal pengendali mereka ketika mereka tidak berada di latar depan secara otomatis ditangguhkan oleh sinyal SIGTTIN .

Untuk bereksperimen, jalankan ttydi terminal untuk melihat apa perangkat terminal itu. Katakan saja itu /dev/pts/42. Dalam sebuah shell di terminal lain, jalankan echo hello >/dev/pts/42: string helloakan ditampilkan di terminal lain. Sekarang jalankan cat /dev/pts/42dan ketik terminal lain. Untuk mematikan catperintah itu (yang akan membuat terminal lain sulit digunakan), tekan Ctrl+ C.

Menulis ke terminal lain kadang-kadang berguna untuk menampilkan pemberitahuan; misalnya writeperintah melakukan itu. Membaca dari terminal lain biasanya tidak dilakukan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Entah saya salah memahami apa yang ingin Anda katakan, atau informasi Anda tidak aktif. Proses yang dilatar belakangi penulisan ke terminal tidak akan menghasilkan SIGTTIN. Beberapa program juga tidak dapat membaca dari terminal secara bersamaan (pernyataan Anda bahwa "setiap karakter dirutekan secara independen"). Hanya satu program yang dapat membaca dari terminal kapan saja, dan upaya oleh program berlatar belakang untuk membaca dari terminal tersebut akan menghasilkan SIGTTIN. Itulah satu-satunya kasus di mana SIGTTIN dikirim secara otomatis.
Patrick
Anda juga tidak dapat membaca dari terminal lain. Untuk melakukannya akan menjadi kerentanan keamanan yang signifikan karena Anda akan dapat mencegat data. Anda dapat straceinput program membaca, tetapi hanya itu.
Patrick
4
@Patrick Background proses menulis ke terminal mendapatkan SIGTTOU, itu salah ketik. Beberapa program dapat membaca dari terminal secara bersamaan (coba dan lihat, cara saya jelaskan dalam paragraf berikutnya; Anda harus melakukannya dari proses yang terminal pengontrolnya bukan terminal itu). Ya, Anda dapat membaca dari terminal lain, asalkan itu milik Anda - mengapa Anda pikir itu tidak mungkin?
Gilles 'SO- stop being evil'
Latar belakang proses menulis ke terminal hanya mendapatkan SIGTTOU jika tostopbendera tty diatur. Bendera ini tidak disetel secara default. Dan saya berdiri dikoreksi pada bacaan dari TTT anoter. Saya mencobanya dan itu berhasil, tapi ini berdasarkan per-baca, bukan per-karakter (ketika duduk di shell prompt mereka sama dengan shell membaca 1 karakter sekaligus). Mungkin baik untuk memperjelas hal ini karena sekarang saya menafsirkan jawaban Anda.
Patrick
2
@Patrick Tentu, readpanggilan hanya akan mengembalikan karakter berturut-turut (atau lebih tepatnya byte, saya harus katakan), tetapi aplikasi tidak memiliki kontrol atas berapa byte readpanggilan akan kembali, jadi tidak lebih baik.
Gilles 'SO- stop being evil'
18

File dalam /dev/ptsadalah "pseudo-ttys". Mereka seperti pipa bernama sampai batas tertentu, tetapi mereka juga meniru terminal koneksi serial lama, seperti VT-100. Pseudo-ttys melakukan pekerjaan mentransfer byte dari keyboard ke program, dan dari program ke perangkat keluaran, yang terdengar sederhana. Tetapi itu menjawab pertanyaan eksplisitas Anda: kernel tidak menyimpan apa-apa /dev/pts/0sebagai contoh. Hanya aliran byte dari stdout dari program yang terhubung ke pseudo-tty masuk, dan program yang stdin terhubung ke pseudo-tty yang sama membaca byte tersebut.

Pseudo-ttys juga menempatkan lapisan tipuan ke dalam aliran byte tersebut. Kernel dapat memeriksa byte untuk nilai-nilai khusus seperti "Control-C" atau "Control-D" atau "Control-U" (yang semuanya dapat dikonfigurasi, lihat man stty) dan mengirim SIGINT, mengatur end-of-file pada stdin, atau menghapus baris pada input. Ada juga fungsi penyangga di sana, jadi "toko saya tidak ada" agak salah, tetapi hanya beberapa kilobyte.

Kernel dapat memeriksa nilai byte pada output dan melakukan hal-hal seperti mengubah baris baru (ASCII linefeed, LF atau "\n") menjadi dua byte, carriage-return dan linefeed (CRLF atau "\r\n"), atau byte apa pun yang dibutuhkan perangkat keras terminal serial. Tipuan pseudo-tty memungkinkan independensi dari perangkat keras.

Pseudo-ttys juga memungkinkan semua "set baud rate", "set parity" dan sebagainya ioctl()system calls, dan mungkin tidak melakukan apa-apa dengan mereka. Hal ini memungkinkan program yang ditulis kembali pada hari VT-100, ADM-3 dan Wyse apa pun tetap bekerja tanpa kesalahan. Perangkat lunak, driver perangkat pseudo-ttys, bertindak seperti perangkat keras.

Pseudo-ttys dapat digunakan oleh sshddan telnet, tetapi mereka juga digunakan antara terminal emulator (seperti xtermatau rxvt) dan shell yang biasanya berjalan di dalam xterm.

Linux dan banyak Unix memiliki pseudo-ttys. Plan 9 tidak. Pseudo-ttys adalah sedikit peninggalan, yang tersisa dari zaman terminal perangkat keras yang terhubung dengan kabel serial.

Bruce Ediger
sumber
13

/dev/adalah direktori khusus untuk file perangkat. Ini adalah abstraksi, mereka bukan file nyata pada disk. Direktori diisi saat boot dan dapat berubah untuk mencerminkan antarmuka perangkat yang ada, yang dibuat dan dihancurkan oleh kernel dan daemon userspace udevd,.

Banyak perangkat yang direpresentasikan adalah virtual. Ini termasuk entri di /dev/pts, yang merupakan perangkat konsol. Inilah sebabnya mengapa dibuat untuk sesi jarak jauh; mereka juga dibuat ketika Anda membuka terminal GUI lokal.

Anda dapat membukanya sebagai file, meskipun tidak banyak menggunakan nilai. Untuk membuat /dev/ptssimpul shell Anda terhubung, gunakan tty:

> tty
/dev/pts/4

Sekarang beralihlah ke konsol lain dan coba:

> echo "duck!" > /dev/pts/4

Pintar. Sekarang coba:

> cat /dev/pts/4

Kemudian coba dan gunakan shell di / dev / pts / 4. Anda terjebak sampai Anda keluar catdari sisi lain, tetapi sebagian besar dari apa yang Anda ketikkan pada Poin / 4 akan melewati (misalnya mencoba "halo dunia" saya berakhir dengan hlpada Poin / 4 dan ello wordpada catkonsol).

Dugaan saya di sini adalah bahwa perangkat mengambil input dari shell, dan mengeluarkannya melalui sistem, yang merupakan hal-hal yang muncul di layar - shell tidak berurusan dengan perangkat keras, sistemnya. Coba strace bash(dan lihat man straceapakah Anda tidak tahu apa itu); Anda mendapatkan kesibukan awal saat bash dimulai. Sekarang mulailah menekan tombol:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Untuk setiap huruf yang diketik ada bacaan dari input standar dan write to standard out. Tapi apa standar shell yang terhubung? Sekarang coba stracepada terminal GUI Anda - Anda harus mencari tahu nama jika Anda tidak mengetahuinya, misalnya pada KDE itu konsole, dan GNOME memiliki gnome-terminal, saya percaya. Output dari itu stracemungkin lebih samar - milik saya punya banyak poll()dan recvfrom(). Saya tidak melihat ada tulisan, tetapi jika sekarang Anda menarik cattrik dari terminal lain, Anda akan melihat ketika Anda mengetik, goresan kunci yang dibaca oleh kucing tidak menghasilkan respons sama sekali dalam output strace - terminal tidak t menerimanya. Jadi aplikasi terminal GUI dan kucing bersaing untuk membaca dari perangkat yang sama, yang menjadi keluaran shell.

goldilocks
sumber
apa gunanya 'cat / dev / pts / 4' saat kita macet dan mengapa kita berhenti saat menjalankan perintah ini.
user2720323
Saya menambahkan beberapa paragraf untuk mencoba dan menjelaskan ini.
goldilocks