เหตุใด sshd จึงไม่ใช้เทอร์มินัลเทียมหลอกเมื่ออาร์กิวเมนต์ของลูกค้า ssh ตามมาด้วยโปรแกรมแบบโต้ตอบ


11

วิธีปกติในการเชื่อมต่อกับเซิร์ฟเวอร์ SSH ssh username@ip_addressคือ แต่ผู้ใช้อาจต้องการเรียกใช้โปรแกรมบนเครื่องระยะไกลเท่านั้น ssh username@ip_address <program_name>ดังนั้นชื่อโปรแกรมดังต่อไปนี้หลังจากอาร์กิวเมนต์ปกติซึ่งเป็น ตัวอย่างเช่นssh username@ip_address ls. อาร์กิวเมนต์นั่นคือดียกเว้นสำหรับโปรแกรมโต้ตอบ (ที่ยังยอมรับการป้อนข้อมูลของผู้ใช้เช่นเดียวกับการส่งออก) topเช่น ผลลัพธ์คือ

ไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม TERM

ซึ่งหมายความว่าไม่มีเทอร์มินัล (หลอก) ติดอยู่ระหว่างโปรแกรม sshd และโปรแกรมยอดนิยม การแก้ปัญหาคือการเพิ่มการโต้แย้งที่คำสั่งทั้งตอนนี้กลายเป็น-tssh -t username@ip_address top

คำถามของฉันคือทำไมไม่สามารถใช้ sshd เป็นค่าเริ่มต้นใช้เทอร์มินัลหลอกเพื่อสื่อสารกับโปรแกรมที่ไม่ต้องมีการโต้ตอบดังนั้นจึงไม่จำเป็นต้องเพิ่ม-tอาร์กิวเมนต์สำหรับโปรแกรมเชิงโต้ตอบ


3
คำตอบสั้น ๆ คือ "เพราะปกติแล้วไม่ใช่สิ่งที่คุณต้องการ"
Celada

ฉันคาดการณ์ว่าคำถามของคุณจะได้รับการกลั่นกรองโดยการขอร้องแสดงความคิดเห็น / ทำการจับ แต่ลองพลิกคำถามรอบ ๆ : ทำไม ssh ควรจัดสรรทรัพยากร tty เมื่อไม่จำเป็นในหลายกรณี? คำถามจริงคือ: ทำไมไม่จัดสรรตัวเลือกการกำหนดค่าแรงเพื่อให้คุณสามารถทำให้มันเป็นค่าเริ่มต้นหรือเริ่มต้นเฉพาะโฮสต์?
Otheus

@Ousus มันเป็นตัวเลือกการกำหนดค่า คุณสามารถตั้งค่าRequestTTY yes(หรือforce) ในการกำหนดค่าของคุณ
Jakuje

เอ่อแน่นอน ดูเหมือนว่าจะได้รับการแนะนำใน 6 แต่บั๊กกี้จนกระทั่งไม่นานหลังจากนั้น ฉันใช้การแจกแจงแบบเก่ามากเท่านั้น :)
Otheus

6
SSH จะรู้ได้อย่างไรว่าโปรแกรมโต้ตอบ? แม้กระทั่งtopสามารถทำงานในโหมดแบทช์
muru

คำตอบ:


18

มันเป็นความจริงที่คนอื่น ๆ บอกว่า PTY มีค่าใช้จ่ายที่แน่นอน - แต่เหตุผลใหญ่ที่ไม่ได้ใช้ PTY เมื่อเรียกใช้คำสั่งระยะไกลคือการที่คุณสูญเสียข้อมูล

โดยปกติเมื่อคุณเรียกใช้คำสั่งจากระยะไกลผ่าน ssh คำสั่งstdoutและstderrสตรีมจะถูกส่งไปยังโลคัลstdoutและstderrซึ่งหมายความว่าคุณสามารถเปลี่ยนเส้นทาง / ไพพ์แยกต่างหาก - ตัวอย่างเช่น:

$ 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

แต่ถ้าคุณใช้ PTY เอาต์พุตทั้งหมดจะไปที่stdoutเนื่องจาก PTY ไม่มีสตรีมแยกต่างหากสำหรับเอาต์พุต / ข้อผิดพลาด:

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

นี่เป็นจุดที่ดีที่ฉันไม่ทราบ
Jakuje

1
@ThomasDickey: แทบจะไม่ ... คำถามคือ "อะไรคือเหตุผลทางประวัติศาสตร์ที่อยู่เบื้องหลังการเลือก 'เริ่มต้นนี้ของนักพัฒนา" แต่ "ทำไมไม่ sshd ใช้หลอกหลอก terminal โดยค่าเริ่มต้น" (เน้นเป็นของฉัน แต่ การใช้ถ้อยคำตรงจากคำถามไม่มากก็น้อย) ดังนั้นความแตกต่างในพฤติกรรม (ซึ่งจะทำให้สำนวนสคริปต์จำนวนมาก) มีความเกี่ยวข้องโดยไม่ขึ้นกับว่านักพัฒนาเลือกตัวเลือกนั้น :-)
psmears

2
@ThomasDickey: คุณยังอ่านคำถามหรือไม่ มันพูดถึงความคิดเห็นของนักพัฒนาที่ไหน?
psmears

1
+1 ชี้ให้เห็นถึงข้อได้เปรียบเฉพาะของการไม่ใช้ pty (นอกเหนือจากประสิทธิภาพ) คุณยังคงสามารถยืนยันได้ว่า-tควรเป็นค่าเริ่มต้นและตัวเลือกที่จำเป็นในการปิดใช้งานดังนั้นข้อได้เปรียบเล็กน้อยของประสิทธิภาพการทำงานคือสิ่งที่สมเหตุสมผลที่สุดสำหรับฉันในกรณีที่ไม่สำคัญ
Peter Cordes

7

หน้าคู่มือเพื่อsshอธิบายสิ่งนี้:

เมื่อตัวตนของผู้ใช้ที่ได้รับการยอมรับจากเซิร์ฟเวอร์เซิร์ฟเวอร์ทั้งรันคำสั่งที่กำหนดในเซสชั่นที่ไม่ใช่แบบโต้ตอบหรือหากไม่มีคำสั่งได้รับการระบุบันทึกลงในเครื่องและช่วยให้ผู้ใช้เปลือกปกติเป็นเซสชั่นแบบโต้ตอบ การสื่อสารทั้งหมดด้วยคำสั่งระยะไกลหรือเปลือกจะถูกเข้ารหัสโดยอัตโนมัติ

มันเป็นคุณสมบัติและอาจเกิดจากเหตุผลทางประวัติศาสตร์ของrshพฤติกรรม มันค่อนข้างสมเหตุสมผล คำสั่งส่วนใหญ่นั้นไม่ได้มีการโต้ตอบและไม่สามารถทำการจัดสรร PTY ได้ฟรี (ซึ่งมีความสำคัญมากกว่าเมื่อ 20 ปีก่อน)


ปัญหาทรัพยากรเป็นไปได้ แต่ความคิดเห็นเกี่ยวกับrshไม่ชัดเจนเนื่องจากโปรแกรมนั้นไม่มีตัวเลือกที่เกี่ยวข้อง
Thomas Dickey

@ThomasDickey ฉันไม่เคยใช้rshแต่มีบางอย่างที่มีอิทธิพลไม่ได้อยู่ในตัวเลือก แต่ในพฤติกรรมของrshและrlogin(ถ้ามีคำสั่งหรือไม่) คุณไม่สามารถเรียกใช้คำสั่งแบบโต้ตอบ (เช่น rogue (6) หรือ vi (1)) โดยใช้ rsh; ใช้ rlogin (1) แทน .
Jakuje

1

เป็นวิธีการsshคิดที่จะบอกว่าคำสั่งที่คุณได้รับการกล่าวอ้างที่มีการโต้ตอบหรือไม่?

ฝันร้ายนี้แย่ลงไปอีกเมื่อคุณรู้ว่าคุณอาจเข้าสู่ระบบที่ใช้ระบบปฏิบัติการที่ไม่ใช่ยูนิกซ์

ไม่มีวิธีแก้ปัญหาที่ง่ายอย่างหนึ่งกรณีต้องเป็นค่าเริ่มต้น


มันไม่รู้ ไม่รู้หรอก ดังนั้นเราจึงมีหน้าคู่มือซึ่งอธิบายพฤติกรรมในสถานการณ์เหล่านี้
Jakuje
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.