Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การแก้ไขปัญหา >> Linux

แก้ไข: Pseudo-terminal will not be allocated because stdin is not a terminal

ในกรณีส่วนใหญ่ คุณจะเจอข้อความผิดพลาดที่สับสน 「pseudo-terminal will not be allocated because stdin is not a terminal」 เฉพาะเมื่อ รันคำสั่ง SSH จากสคริปต์ (script) หากรันคำสั่งเดียวกันจากบรรทัดคำสั่ง (command line) อาจทำงานได้ปกติ

ก่อนไปต่อ ตรวจสอบว่า เพิ่ม public key ใน SSH agent แล้ว แล้วลองใช้ ssh อีกครั้ง อาจแค่ขาด key แต่ถ้ายังไม่ได้ผล ต้อง troubleshoot ในสคริปต์

วิธีที่ 1: บังคับ และ ปิดการจัดสรร pseudo-tty (Forcing & Disabling pseudo-tty Allocation)

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

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

แต่ด้านอื่น อาจได้ข้อความผิดพลาดซ้ำๆ ติดต่อกัน บางคนว่ามัน "น่าสนใจ" แต่ก็รำคาญ ใช้ Ctrl+C เพื่อหยุด process

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

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

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

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

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

หากยังไม่ได้ใช้ อาจไม่ต้องการ แต่สามารถใช้เทคนิคเดียวกัน กดดับข้อความผิดพลาดเกี่ยวกับ pseudo-terminal allocation ใน environment นี้ได้

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

วิธีที่ 3: แก้ไขข้อผิดพลาดการจัดการ Job (Fixing Job Management Errors)

บางครั้งอาจเจอข้อผิดพลาดอีกอย่าง หลังแก้ไขทั้งหมดแล้ว หากได้คำเตือน no access to tty แล้วบอกว่า no job control in your shell ควรทำงานได้ค่อนข้างปกติ

ข้อผิดพลาดนี้ เกิดจากบางอย่างผิดปกติบน remote server เกี่ยวกับ csh, tcsh หรืออาจเป็น Almquist shell หรืออื่นๆ อาจไม่สังเกตเพราะได้ข้อผิดพลาดอื่นๆ มาก่อน แต่หากไม่เห็นข้อผิดพลาด pseudo-terminal อื่นๆ ควรทำงานต่อได้ค่อนข้างปกติ

อาจไม่ควรใช้ Ctrl+Z หยุด process ในกรณีนี้ เพราะอาจไม่มีทาง start กลับได้ หากได้ข้อความ there are stopped jobs ตอน exit จะ ไม่อนุญาตให้ logout

ใช้คำสั่ง ps และ kill ปิด jobs ที่ปิดไม่ได้ (สมมติว่ายอมเสียงานที่ทำอยู่) จะสามารถ exit ได้