Bagaimana mencegah keluaran konsol acak memecahkan terminal?


23

Ada banyak pertanyaan di SE yang menunjukkan bagaimana memulihkan dari terminal yang rusak cat /dev/urandom. Bagi mereka yang tidak terbiasa dengan masalah ini - ini tentang apa:

  1. Anda menjalankan cat /dev/urandomatau setara (misalnya, cat binary_file.dat).
  2. Sampah dicetak.
  3. Itu akan baik-baik saja ... kecuali terminal Anda terus mencetak sampah bahkan setelah perintah selesai! Berikut adalah tangkapan layar dari teks yang salah ditulis yang sebenarnya merupakan keluaran g ++:

    Contoh tangkapan layar

    Saya kira orang-orang benar tentang kesalahan C ++ terkadang terlalu samar!

Solusi yang biasa adalah menjalankan stty sane && reset, meskipun agak menjengkelkan untuk menjalankannya setiap kali ini terjadi.

Karena itu, apa yang ingin saya fokuskan dalam pertanyaan ini adalah alasan awal mengapa ini terjadi, dan bagaimana mencegah terminal dari kerusakan setelah perintah tersebut dikeluarkan. Saya tidak mencari solusi seperti memipipkan perintah yang menyinggung ke tratau xxd, karena ini mengharuskan Anda untuk mengetahui bahwa program / file menghasilkan biner sebelum Anda benar-benar menjalankan / mencetaknya, dan perlu diingat setiap kali Anda menghasilkan data seperti itu .

Saya perhatikan perilaku yang sama di URxvt, Putty dan Linux frame buffer jadi saya tidak berpikir ini adalah masalah khusus terminal. Tersangka utama saya adalah bahwa output acak berisi beberapa kode pelarian ANSI yang membalik pengkodean karakter (pada kenyataannya, jika Anda menjalankan cat /dev/urandomlagi, kemungkinan itu akan membuka terminal, yang tampaknya mengkonfirmasi teori ini). Jika ini benar, kode melarikan diri apa ini? Apakah ada cara standar untuk menonaktifkannya?

Jawaban:


22

Tidak:

  • tidak ada cara standar untuk "menonaktifkannya", dan
  • rincian kerusakan sebenarnya khusus terminal, tetapi
  • ada beberapa fitur yang umum diterapkan yang bisa Anda dapatkan dari perilaku buruk.

Untuk fitur yang diimplementasikan secara umum, lihat kumpulan karakter alternatif gaya VT100, yang diaktifkan oleh ^Ndan ^O(aktifkan / nonaktifkan). Yang dapat ditekan di beberapa terminal ketika menggunakan UTF-8 modus, tetapi terminal yang sama memiliki kesempatan yang cukup untuk mencemari layar Anda (berbicara tentang layar GNU, Linux konsol, Putty di sini) dengan urutan escape mereka lakukan mengakui.

Beberapa dari sekuens escape lainnya misalnya bergantung pada respons dari terminal ke queri (escape sequence) oleh host. Jika tuan rumah tidak mengharapkannya, hasilnya adalah sampah di layar.

Dalam kasus lain (terlihat misalnya pada perangkat jaringan dengan urutan pelarian hardcoded untuk konsol Linux), terminal lain akan melihatnya sebagai salah kode, dan sepertinya membeku.

Jadi ... Anda bisa fokus hanya pada satu terminal, pangkas apa pun yang tampak seperti gangguan (seperti misalnya, beberapa menyarankan menghapus kemampuan untuk menggunakan mouse untuk memposisikan di editor), dan Anda mungkin mendapatkan sesuatu yang tidak memiliki lubang yang jelas. Tapi itu hanya satu terminal.


0

Jika kendali Anda dan tahu perintah akan mengacaukan Anda, saya biasanya akan melihat output dalam sesuatu seperti kurang.

head -n4 /dev/urandom | less

Ini biasanya tampaknya menangkap sampah dan mencetaknya dengan representasi waras, tidak pernah ada masalah yang saya ingat setelah keluar dengan q , yang saya berani ajak Anda terbiasa dengan berhenti sedikit.


2
Pertanyaannya secara spesifik mengatakan bahwa dia tidak mencari solusi yang mengharuskan Anda mengetahui sebelumnya bahwa program tersebut menghasilkan keluaran biner.
Barmar

-1

Pipa output dari perintah Anda, dll ke tee -


2
Bagaimana itu akan membantu? Itu masih akan mencetak output, tetapi juga menyimpannya dalam file.
Barmar

Mungkin maksud Anda moreatau less?
Barmar

per OP dengan penekanan saya: "... setelah . perintah tersebut dikeluarkan Saya tidak mencari solusi seperti pipa perintah menyinggung"
Jeff Schaller
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.