แก้ไข: Pseudo-terminal จะไม่ได้รับการจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล

ในกรณีส่วนใหญ่คุณจะได้รับข้อผิดพลาด "pseudo-terminal จะไม่ได้รับการจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล" เกิดข้อผิดพลาดเฉพาะเมื่อคุณเรียกใช้คำสั่ง SSH บางประเภทจากสคริปต์ หากคุณกำลังเรียกใช้คำสั่งเดียวกันจากบรรทัดคำสั่งอาจทำงานได้ดีอย่างสมบูรณ์

ก่อนดำเนินการเพิ่มเติมตรวจสอบให้แน่ใจว่าคุณได้เพิ่มคีย์สาธารณะของคุณไปยังเอเจนต์ SSH แล้วลองใช้ ssh อีกครั้ง คุณอาจเพิ่งทำกุญแจหายไป ในทางกลับกันหากไม่ได้ผลคุณจะต้องทำการแก้ไขปัญหาเล็กน้อยในสคริปต์ของคุณ

วิธีที่ 1: บังคับและปิดการใช้งานการจัดสรรหลอก tty

มีตัวเลือกบรรทัดคำสั่งคู่หนึ่งที่อาจแก้ไขปัญหาให้คุณได้อย่างรวดเร็ว ลอง ssh -t -t -R ตามด้วยสิ่งที่เหลือที่คุณพยายามเชื่อมต่อเพื่อบังคับให้มีการจัดสรรเทอร์มินัลหลอก ตัวอย่างเช่นสมมติว่าคุณจะใช้ ssh -p 80 [email protected] เพื่อลงชื่อเข้าใช้บัญชีของคุณบน example.com ซึ่งแน่นอนว่าเป็นเพียงตัวอย่างสำหรับเอกสารที่ไม่มีอยู่

ลองเรียกใช้เช่น ssh -t -t -R -p 80 [email protected] และดูว่าวิธีนี้ช่วยแก้ปัญหาได้หรือไม่ แน่นอนคุณจะต้องแทนที่ชื่อด้วยบัญชีจริงและชื่อโฮสต์ของคุณเพื่อเข้าสู่ระบบได้สำเร็จ สิ่งนี้บังคับให้มีการจัดสรรเทอร์มินัลดังนั้นคุณไม่ควรเห็นเทอร์มินัลหลอกจะไม่ถูกจัดสรรเนื่องจาก stdin ไม่ใช่ข้อผิดพลาดของเทอร์มินัล

ในทางกลับกันคุณอาจจบลงด้วยข้อความแสดงข้อผิดพลาดคงที่ ผู้ใช้บางคนตั้งข้อสังเกตว่าอาจเป็นเรื่องน่าขบขัน

มันน่าผิดหวังอย่างแน่นอนแม้ว่าจะไม่คำนึงถึงดังนั้นให้ใช้ Ctrl + C เพื่อฆ่ากระบวนการนี้

คุณสามารถลองใช้สวิตช์ -t เพียงตัวเดียวหรือเพิ่มจำนวนก็ได้ หากไม่ได้ผลให้แทนที่สวิตช์ -t ใด ๆ ด้วยสวิตช์ -T ในคำสั่งเช่น ssh -T -R -p 80 [email protected] และดูว่าใช้งานได้หรือไม่

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

เนื่องจากคำสั่ง ssh ทำให้สองอ็อพชันตรงข้ามมีชื่อคล้ายกันโปรดจำไว้ว่า -t บังคับให้มีการจัดสรรเทอร์มินัลหลอกในขณะที่ -T ปิดใช้ ตัวเลือกเหล่านี้เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่และมักจำเป็นจากภายในสคริปต์เนื่องจาก ssh ต้องการเทอร์มินัล TTY แบบเดิมในการทำงาน ตามปกติแล้วในกรณีของคุณคุณจะใช้โปรแกรมจำลองเทอร์มินัลเพื่อจุดประสงค์นี้

วิธีที่ 2: ใช้ sshpass

บางคนอาจพบว่าสคริปต์ของตนทำงานได้ดีขึ้นเมื่อใช้คำสั่ง sshpass ซึ่งไม่รวมอยู่ในค่าเริ่มต้น คุณสามารถติดตั้งด้วย sudo apt-get install sshpass หรือ sudo yum install sshpass ได้ตลอดเวลาหากคุณต้องการทดลองใช้หรือเพราะคุณต้องการมันสำหรับกรณีการใช้งานเฉพาะของคุณ

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

ตัวอย่างเช่นใช้ sshpass -p password ssh -T [email protected] เพื่อบังคับให้ระบบทำงานจากภายในสคริปต์ของคุณ

วิธีที่ 3: แก้ไขข้อผิดพลาดในการจัดการงาน

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

ข้อผิดพลาดนี้เกิดจากสิ่งผิดปกติบนเซิร์ฟเวอร์ระยะไกลที่เกี่ยวข้องกับ csh, tcsh หรือแม้แต่ Almquist หรือเชลล์อื่น ๆ คุณอาจไม่ได้สังเกตเห็นเพราะคุณได้รับข้อความแสดงข้อผิดพลาดอื่น ๆ แต่หากคุณไม่เห็นคนอื่น ๆ เกี่ยวกับเครื่องเทอร์มินัลหลอกควรเป็นไปได้ที่จะดำเนินการต่อไปในลักษณะที่ปกติ

คุณอาจไม่ต้องการลองใช้ Ctrl + Z ในกรณีนี้เพื่อหยุดกระบวนการเนื่องจากอาจไม่มีวิธีใดที่จะเริ่มต้นการสำรองข้อมูลอีกครั้ง หากคุณได้รับข้อความแสดงข้อผิดพลาดที่แจ้งว่ามีงานหยุดเมื่อคุณออกคุณจะไม่ได้รับอนุญาตให้ออกจากระบบ

ใช้คำสั่ง ps และ kill เพื่อปิดงานที่คุณไม่สามารถปิดได้โดยสมมติว่าคุณไม่รังเกียจที่จะสูญเสียงานในกระบวนการนี้ คุณจะสามารถออกได้ทันที

แท็ก Linux how-to ssh