เหตุใดการเปลี่ยนเส้นทาง 'สคริปต์' ไปยัง / dev / null / อนุญาตให้ 'หน้าจอ' ทำงานในขณะที่ผู้ใช้อื่นเป็นผู้ใช้


36

ฉันถูก su'ed เป็นผู้ใช้เพื่อเรียกใช้สคริปต์ยาวเฉพาะ ฉันต้องการใช้หน้าจอ แต่ได้รับข้อความแสดงข้อผิดพลาด "ไม่สามารถเปิด terminal '/ dev / pts / 4' - โปรดตรวจสอบ"

ดังนั้นผมจึง Googled ไปรอบ ๆ $ script '/dev/null/'และมาข้ามโพสต์ฟอรั่มที่ได้รับคำสั่งให้วิ่ง ฉันทำเช่นนั้นแล้วฉันจะกลั่นกรอง

ทำไมจึงใช้งานได้ หน้าจอนั้นกำลังทำอะไรซูไม่สามารถทำงานในฐานะผู้ใช้ที่เป็นผู้ใช้งานได้? เหตุใดการส่ง 'สคริปต์' ไปยัง / dev / null อีกครั้งจึงถูกป้องกันอย่างอื่น ใช้สคริปต์เพื่อเขียนบันทึกในฐานะผู้ใช้ดั้งเดิมไปยังที่อื่นหรือไม่?


2
Cleaner จะเรียกใช้suจากภายในเซสชันหน้าจอ
justarobert

@justarobert ไม่ได้หากคุณต้องการให้ผู้ใช้หลายคนสามารถแนบไปกับหน้าจอเดียวกันสำหรับบัญชีบริการ / สคริปต์ที่ทำงานด้วยแบทช์
แอชลีย์

คำตอบ:


40

ในทางเทคนิคแล้วคุณไม่ได้เปลี่ยนเส้นทางอะไรเลย

โทรscript /dev/nullเพียงแค่ทำให้scriptประหยัดทั้งtypescriptเข้า/dev/nullซึ่งในทางปฏิบัติวิธีการทิ้งเนื้อหา

ดูman scriptข้อมูลโดยละเอียดและแพคเกจutil-linux-ngสำหรับการนำไปใช้ ( misc-utils/script.c)

นี้มีอะไรจะทำอย่างไรกับความscreenจริง ทำไมงานนี้เป็นที่กล่าวอ้างมีผลข้างเคียงของการสร้างหลอกขั้วสำหรับคุณที่script /dev/pts/Xวิธีนี้คุณไม่ต้องทำด้วยตนเองและหน้าจอจะไม่มีปัญหาสิทธิ์ - ถ้าคุณsuจากผู้ใช้Aไปยังผู้ใช้Bโดยการเรียกใช้โดยตรงscreenคุณพยายามที่จะเข้าครอบครองเทอร์มินัลหลอกของผู้ใช้A สิ่งนี้จะไม่สำเร็จถ้าคุณไม่รูท นั่นเป็นเหตุผลที่คุณเห็นข้อความแสดงข้อผิดพลาด


6

หากต้องการส่งออกไปยังหน้าต่างเทอร์มินัลโดยตรงโปรแกรมที่รันอยู่จะต้องสามารถเขียนไปยังเทอร์มินัลการควบคุมของคุณได้ หากคุณใช้ xterm หรือ ssh หรือการเชื่อมต่อเสมือนอื่น ๆ (ตรงข้ามกับเทอร์มินัลที่เชื่อมต่อโดยตรงแบบสด) เทอร์มินัลการควบคุมของคุณคือหลอก tty (pty)

pty ของคุณถูกตั้งค่าด้วยสิทธิ์เขียนสำหรับคุณเท่านั้นเมื่อคุณเข้าสู่ระบบมิฉะนั้นผู้ใช้รายอื่นสามารถขีดเขียนบนหน้าจอของคุณ (หรืออ่าน) ดังนั้นเมื่อคุณใช้กับผู้ใช้รายอื่น (และผู้ใช้นั้นไม่ใช่ผู้ใช้รูท) ผู้ใช้นั้นจะไม่สามารถเข้าถึง pty พื้นฐานได้

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

การเปลี่ยนเส้นทางสคริปต์ไปยัง / dev / null ทำให้หน้าจอไม่พยายามเขียนไปยังเทอร์มินัลการควบคุมดังนั้นจึงไม่เกิดปัญหาสิทธิ์อนุญาต


2
ดังนั้นฉันจะดูได้อย่างไรว่าหน้าจอเขียนได้อย่างไรถ้ามันไปที่ / dev / null? ฉันค่อนข้างแน่ใจว่าฉันเข้าใจผิดและมันไม่ได้ไปที่ / dev / null แต่มันไปที่ไหน
user63623

"มัน" /dev/nullหมายถึงการส่งออกหน้าจอไม่ได้ไป แม่: สคริปต์บันทึกเซสชันของคุณ (ดู manpage) และคุณไม่จำเป็นต้องที่ทั้งหมด: เพื่อที่จะไป / dev / null แต่มันไม่มีผลข้างเคียง: มันสร้างเทอร์มินัลหลอกและตอนนี้คุณกำลังใช้งานอยู่และหน้าจอสามารถเขียนไปที่ anSee @ karol-piczak ได้
Nanne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.