Computer >> คอมพิวเตอร์ >  >> การแก้ไขปัญหา >> Linux

แก้ไข:เทอร์มินัลหลอกจะไม่ถูกจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล

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

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

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

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

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

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

แม้ว่าจะเป็นเรื่องที่น่าหงุดหงิดก็ตาม ดังนั้นให้ใช้ Ctrl+C เพื่อหยุดกระบวนการ

แก้ไข:เทอร์มินัลหลอกจะไม่ถูกจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล

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

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

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

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

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

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

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

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

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

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

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

แก้ไข:เทอร์มินัลหลอกจะไม่ถูกจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล

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