Mengapa sshd tidak menggunakan terminal semu ketika argumen klien ssh diikuti oleh program interaktif?

11

Cara normal untuk terhubung ke server SSH adalah ssh username@ip_address. Tetapi pengguna mungkin hanya ingin menjalankan program pada mesin jarak jauh. Jadi nama program mengikuti setelah argumen normal yaitu ssh username@ip_address <program_name>. Sebagai contoh ssh username@ip_address ls,. Argumen itu baik-baik saja kecuali untuk program interaktif (yang juga menerima input pengguna serta memberikan output) misalnya top. Outputnya adalah

Variabel lingkungan JANGKA tidak diatur.

yang berarti tidak ada terminal (pseudo-) terpasang antara sshd dan program-program top. Solusinya adalah menambahkan argumen di -tmana seluruh perintah sekarang menjadi ssh -t username@ip_address top.

Pertanyaan saya adalah mengapa tidak bisa sshd secara default juga menggunakan pseudo-terminal untuk berkomunikasi dengan program non-interaktif sehingga tidak perlu menambahkan -targumen untuk program interaktif?

Ron Vince
sumber
3
Jawaban singkatnya adalah "karena itu biasanya bukan yang Anda inginkan".
Celada
Saya memperkirakan pertanyaan Anda akan dimoderasi karena pada dasarnya meminta pendapat / membuat keluhan. Tapi mari kita balikkan pertanyaan: mengapa kita harus mengalokasikan sumber daya tty ketika itu tidak diperlukan dalam sebagian besar kasus? Pertanyaan NYATA adalah: mengapa alokasi force-tty bukan opsi konfigurasi sehingga Anda dapat menjadikannya default atau default khusus host?
Otheus
@Otheus Ini adalah opsi konfigurasi. Anda dapat mengatur RequestTTY yes(atau force) di konfigurasi Anda.
Jakuje
Ya memang. Tampaknya telah diperkenalkan dalam 6 tetapi kereta sampai tak lama setelah itu. Saya hanya menggunakan distribusi yang sangat lama. :)
Otheus
6
Bagaimana SSH dapat dipercaya mengetahui bahwa suatu program bersifat interaktif? Bahkan topbisa berjalan dalam mode batch.
muru

Jawaban:

18

Memang benar bahwa, seperti yang dikatakan orang lain, PTY memiliki overhead tertentu - tetapi alasan utama untuk tidak menggunakan PTY ketika menjalankan perintah jarak jauh adalah bahwa Anda kehilangan informasi.

Biasanya, ketika Anda menjalankan perintah dari jarak jauh melalui ssh, perintah stdoutdan stderraliran dikirim ke lokal stdoutdan stderr, yang berarti Anda dapat mengarahkan / memipangnya secara terpisah - misalnya:

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory

Tetapi jika Anda menggunakan PTY, semua keluaran menjadi stdout, karena PTY tidak memiliki aliran terpisah untuk keluaran / kesalahan:

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$
psmears
sumber
Ini adalah poin bagus yang tidak saya sadari.
Jakuje
1
@ThomasDickey: Hampir ... pertanyaannya bukan "apa alasan historis di balik pilihan pengembang dari default ini", tetapi "mengapa tidak dapat sshd menggunakan pseudo-terminal secara default" (penekanannya adalah milik saya, tetapi kata-kata lebih atau kurang langsung dari pertanyaan). Jadi perbedaan dalam tingkah laku (yang akan memecah sejumlah idiom
penulisan
2
@ThomasDickey: Pernahkah Anda membaca pertanyaannya? Di mana ia menyebutkan pendapat para pengembang?
psmears
1
+1 menunjukkan keunggulan spesifik karena tidak menggunakan pty (selain kinerja). Anda masih bisa berargumen bahwa itu -tseharusnya default, dan opsi yang diperlukan untuk mematikannya, jadi benar-benar keuntungan kinerja kecil adalah yang paling masuk akal bagi saya untuk kasus-kasus di mana itu tidak masalah.
Peter Cordes
7

Halaman manual untuk sshmenjelaskan ini:

Ketika identitas pengguna telah diterima oleh server, server mengeksekusi perintah yang diberikan dalam sesi non-interaktif atau, jika tidak ada perintah yang ditentukan, masuk ke mesin dan memberikan pengguna shell normal sebagai sesi interaktif . Semua komunikasi dengan perintah atau shell jarak jauh akan dienkripsi secara otomatis.

Ini fitur dan mungkin disebabkan oleh alasan historis rshperilaku. Cukup masuk akal. Sebagian besar perintah benar-benar tidak interaktif dan bukan operasi gratis untuk mengalokasikan PTY (yang lebih penting 20 tahun yang lalu).

Jakuje
sumber
Masalah sumber daya masuk akal, tetapi komentar tentangnya rshtidak jelas karena program itu tidak memiliki opsi yang sesuai.
Thomas Dickey
@ThomasDickey Saya tidak pernah menggunakan rsh, tetapi pasti ada beberapa pengaruh, tidak dalam opsi, tetapi dalam perilaku rshdan rlogin(jika ada perintah atau tidak). Anda tidak dapat menjalankan perintah interaktif (seperti rogue (6) atau vi (1)) menggunakan rsh; gunakan rlogin (1) sebagai gantinya. .
Jakuje
1

Bagaimana Anda sshbisa tahu apakah perintah yang Anda gunakan interaktif atau tidak?

Mimpi buruk ini menjadi lebih buruk ketika Anda menyadari bahwa Anda bisa masuk ke mesin yang menjalankan OS non-unix.

Karena tidak ada solusi yang mudah, satu case harus menjadi default.

dmckee --- mantan kucing moderator
sumber
Tidak tahu. Itu tidak bisa tahu. Dan karena itu kami memiliki halaman manual yang menggambarkan perilaku dalam situasi ini.
Jakuje