Sudo เป็นผู้ใช้ที่แตกต่างกันและหน้าจอทำงาน


167

ค้นพบในวันนี้ว่าหน้าจอที่ใช้งานในฐานะผู้ใช้อื่นที่ฉัน sudo ลงไปจะไม่ทำงาน!

กล่าวคือ

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails: Cannot open your terminal '/dev/pts/0'

ฉันมีสคริปต์ที่ทำงานเป็นผู้ใช้ "ตรวจสอบ" เรารันในเซสชันหน้าจอเพื่อดูผลลัพธ์บนหน้าจอ ปัญหาคือเรามีผู้ใช้จำนวนมากที่เข้าสู่ระบบด้วยบัญชีของตัวเอง (เช่น bob, james, susie, etc ... ) จากนั้นพวกเขา sudo ลงในผู้ใช้ "monitor" การให้พวกเขาเข้าถึงผู้ใช้ "มอนิเตอร์" นั้นไม่อยู่ในคำถาม


13
นี่เป็นข้อผิดพลาดที่คุณได้รับหรือไม่? "ไม่สามารถเปิดเทอร์มินัล '/ dev / pts / 0' - โปรดตรวจสอบ"
จิม

ใช่นั่นคือหนึ่ง ฉันเข้าใจว่าทำไมมันเกิดขึ้น แต่มีวิธีแก้ปัญหาหรือไม่
luckytaxi

4
ความคิดเห็นเกี่ยวกับคำสั่งของคุณ - sudo su "user" -ฉันให้เห็นคนทำงาน ทำไมไม่ใช้sudo -u user -s?
Andrew Aylett

2
@Jim: +1 สำหรับการส่งข้อความแสดงข้อผิดพลาดที่ขาดหายไป
Dennis Williamson

1
@ อันธพาลคนส่วนใหญ่ที่ฉันรู้sudo su- ฉันคิดว่ามันเป็นสิ่งที่ผู้คนคุ้นเคย (ในกรณีของฉันมันเป็นเพราะคุณไม่จำเป็นต้องรู้ธง sudo ใด ๆsudo su- ฉันไม่คิดว่าฉันเคยอ่าน manpage sudo :)
voretaq7

คำตอบ:


245

ลองใช้script /dev/nullในฐานะผู้ใช้ของคุณsuก่อนที่จะเปิดหน้าจอ - แฮ็คสลัมเล็ก ๆ น้อย ๆ แต่ควรทำให้หน้าจอมีความสุข


5
เรื่องผลกระทบด้านความปลอดภัยไม่มีฉันรู้ (แต่นั่นไม่ได้หมายความว่าไม่มี :) - IIRC นี้อาศัยผลข้างเคียงของ "สคริปต์" เปิดอุปกรณ์เทอร์มินัลใหม่ (ตามที่ผู้ใช้เรียกใช้) และเนื่องจากคุณกำลังส่งเอาต์พุตของสคริปต์ไปยัง / dev / null จึงไม่มีอะไรให้จับได้ นอกจากนี้ยังปลอดภัยกว่าการเพิ่มผู้ใช้ไปยังกลุ่ม tty (IMHO) แน่นอน
voretaq7

2
@nalply ตรงไปตรงมาคุณไม่ควรพบว่ามีหลายเชลล์ที่สับสนหากคุณเป็นผู้ดูแลระบบของ Unix - ที่กล่าวมาscriptสามารถใช้เปิดตัวscreenได้ จากนั้นคุณจะต้องออกสองครั้ง (ครั้งเดียวสำหรับscreenครั้งเดียวsu) (นี่คือสิ่งที่scriptหน้าคนสามารถชี้แจงให้คุณถ้าคุณใช้เวลาในการอ่านมัน ... )
voretaq7

10
sudo -u bob script -q -c 'screen -dr myscreen' /dev/nullหรือเรียกใช้เพียง จากนั้นคุณมีเพียงหนึ่งเทอร์มินัลสำหรับออก / ถอด
Andy Shulman

4
ขอบคุณสิ่งนี้ช่วยฉัน แต่ทำไมถึงแก้ไขได้? จากสิ่งที่ฉันเข้าใจมันพิมพ์ทุกอย่างตั้งแต่ stdout ถึง ... ไม่มีที่ไหนเลย และนั่นก็แก้ไขหน้าจอ
sudo

3
@sudo เพื่อที่จะทำสิ่งที่scriptเปิดอุปกรณ์ tty ของตัวเองเป็นเจ้าของโดยผู้ใช้ที่วิ่ง (ดูใน/devและคุณจะเห็นมันปรากฏขึ้นหลังจากที่คุณเรียกใช้script) screenจากนั้นคว้าอุปกรณ์ tty นั้น (ซึ่งผู้ใช้เป็นเจ้าของซึ่งทำงานอยู่screenดังนั้นจึงไม่มีปัญหาในการเข้าถึง) มันเป็นงานแฮ็คทั้งหมด แต่ใช้งานได้ เมื่อมองไปที่เครื่องของฉันมันดูเหมือนว่าหน้าจอเวอร์ชั่นใหม่ดูเหมือนจะติดตั้ง setuid-root ซึ่งก็ใช้งานได้ แต่หมายความว่าคุณมีไบนารี setuid-root ตัวอื่นที่ลอยอยู่รอบ ๆ ซึ่งทำให้บางคนรู้สึกไม่สบายใจ
voretaq7

33

ฉันใช้ฟังก์ชั่น wrapper screenสำหรับผู้ใช้ที่ฉันsudo suต้องการ นี่คือฟังก์ชั่น wrapper ที่ฉันเพิ่มให้กับผู้ใช้~/.bashrc:

หน้าจอฟังก์ชั่น () {
  / usr / bin / script -q -c "/ usr / bin / screen $ {*}" / dev / null
}

สิ่งนี้ทำให้ฉันสามารถใช้ตัวเลือกและพารามิเตอร์ทั้งหมดscreenที่ฉันอาจต้องการใช้ ฉันใคร่ครวญที่จะวางฟังก์ชั่นนี้ทั้งระบบ


1
ทำงานได้อย่างสมบูรณ์แบบ สำหรับผู้ที่ต้องการทั้งระบบฉันขอแนะนำให้เพิ่มสิ่งนี้ลงใน /etc/bash.bashrc - ใช้ได้กับผู้ใช้ทุกคน
Someguy123

2
สิ่งนี้จะไม่อ้างถึงการโต้แย้งเพื่อคัดกรองอย่างถูกต้องมิฉะนั้นเป็นทางออกที่ดี
59

7

สมมติว่าพวกเขาเป็น SSHing ในโฮสต์คุณสามารถเพิ่มคีย์ ssh สาธารณะสำหรับผู้ใช้แต่ละคนที่ต้องการเข้าถึงบัญชีจอภาพในไฟล์ ~ monitor / .ssh / authorized_keys จากนั้นในเครื่องระยะไกลของผู้ใช้แต่ละคนก็สามารถเรียกใช้

ssh -t monitor@remote.machine หน้าจอ -RD


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

2
ฉันไม่แน่ใจว่าจะตอบยังไงในคำตอบของฉันเพราะเขาพูดว่า "ให้พวกเขาเข้าถึง ... หมดคำถาม" แต่ก็พูดว่า "... พวกเขา sudo ไปยังผู้ใช้ 'มอนิเตอร์' แต่ฉันเห็นด้วยการบังคับใช้ข้อ จำกัด คำสั่งใน authorized_keys ควรดูแลสิ่งนั้น
อเล็กซ์

7

สมมติว่าเรากำลังพูดถึงข้อผิดพลาดนี้:

$ sudo su - bob
$ screen
Cannot open your terminal '/dev/pts/5' - please check.

ต่อไปนี้เป็นหนึ่งซับ (สามารถใช้เป็น "alias gobob" เป็นต้น):

sudo su - bob -c "script -c bash /dev/null"'

คำอธิบาย:

สิ่งนี้จะเริ่มเชลล์ (เช่นล็อกอินเชลล์) ในฐานะผู้ใช้ bob ผู้ใช้ bob เริ่มต้นscriptซึ่งถูกบอกให้เรียกใช้ bash (อาจเป็นเส้นประหรือ ksh ... ) และสำเนาของเซสชันจะถูกโยนทิ้งไป


0

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


0

คุณบอกว่าคุณทำ:

sudo su "monitor" -

ฉันสงสัยเกี่ยวกับเส้นประต่อท้าย ฉันมักจะทำ:

sudo su - username

เครื่องหมายขีดกลาง (ต่อหน้า su man) บอกให้ su เป็น "ทำให้เชลล์เป็นเชลล์ล็อกอิน" ซึ่งหมายความว่ามันจะจัดหาสคริปต์เริ่มต้นเชลล์ปกติทั้งหมดและตั้งค่าต่างๆเช่น PATH และ HOME อย่างถูกต้อง


3
Nope sudo su - usernameและsudo su username -ทำสิ่งเดียวกัน
Tim Ludwinski

-4

ฉันเพิ่งพบปัญหานี้ แก้ไขมันด้วยchmod +rw $(tty)ก่อนที่จะใช้ sudo ปัญหาเกี่ยวกับการแก้ปัญหานี้คือทุกคนสามารถเชื่อมต่อและสอดแนมบนเทอร์มินัลของคุณหลังจากนั้น


2
ฟังดูเหมือนเป็นคำตอบที่ยอดเยี่ยม
Evan Carroll

10
@EvanCarroll มันเป็นทางออกที่ดียกเว้นส่วนที่ให้ทั้งโลกอ่านและเขียนเข้าถึงเทอร์มินัลของเขา ปัญหาด้านความปลอดภัยเพียงเล็กน้อย - ไม่มีโปรแกรมใดที่ให้ความสำคัญกับเรื่องนี้ยกเว้นหลักสูตรที่ตรวจสอบความปลอดภัยของเครื่องก่อนที่จะยอมรับรหัสผ่าน ( gpgตัวอย่าง) และแน่นอนเขาจะไม่อยู่ในระบบที่มีผู้ใช้ที่เป็นอันตรายที่จะดูttyและดมรหัสผ่าน ...
voretaq7

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