ฉันต้องการคำสั่งเพื่อแสดงรายการผู้ใช้ทั้งหมดที่มีสิทธิ์ใช้งานรูทเช่น sudo หรือไม่
สมมติว่าฉันเป็นผู้ใช้ sudoer ฉันจะรู้ผู้ใช้ sudoer คนอื่น ๆ ได้อย่างไร?
ฉันต้องการคำสั่งเพื่อแสดงรายการผู้ใช้ทั้งหมดที่มีสิทธิ์ใช้งานรูทเช่น sudo หรือไม่
สมมติว่าฉันเป็นผู้ใช้ sudoer ฉันจะรู้ผู้ใช้ sudoer คนอื่น ๆ ได้อย่างไร?
คำตอบ:
หากคุณเพียงแค่ต้องการแสดงรายการ sudoers ที่ระบุไว้ในsudo
กลุ่มฉันคิดว่าวิธีที่ดีที่สุดที่จะทำคือเรียกใช้คำสั่งนี้ (ซึ่งควรจะเบากว่าคำสั่งอื่น ๆ ในคำตอบนี้):
grep -Po '^sudo.+:\K.*$' /etc/group
นอกจากนี้ตามที่แนะนำในความคิดเห็นโดย muru รูปแบบของรายการใน/etc/group
สามารถจัดการได้อย่างง่ายดายโดยcut
:
grep '^sudo:.*$' /etc/group | cut -d: -f4
อีกครั้งตามที่แนะนำในความคิดเห็นโดย muru หนึ่งสามารถใช้getent
แทนgrep
:
getent group sudo | cut -d: -f4
คำสั่งใด ๆ เหล่านี้จะพิมพ์ผู้ใช้ทั้งหมดที่ระบุไว้ในsudo
กลุ่มใน/etc/group
(ถ้ามี)
การแยกย่อยคำสั่ง # 1:
grep
: พิมพ์บรรทัดทั้งหมดที่ตรงกับ regex ในไฟล์-P
: ทำให้การgrep
จับคู่สไตล์ regexes Perlo
: ทำให้grep
พิมพ์เฉพาะสตริงที่ตรงกัน'^sudo.+:\K.*$'
: ทำให้grep
ตรงกับ regex ระหว่างคำพูดรายละเอียด Regex # 1:
^
: จุดเริ่มต้นของบรรทัด.+
: หนึ่งตัวหรือมากกว่านั้น\K
: ยกเลิกการแข่งขันก่อนหน้า.*
: ศูนย์หรือมากกว่าตัวละคร$
: สิ้นสุดบรรทัดการแยกย่อยคำสั่ง # 2:
grep
: พิมพ์บรรทัดทั้งหมดที่ตรงกับ regex ในไฟล์'^sudo.+:\K.*$'
: ทำให้grep
ตรงกับ regex ระหว่างคำพูดcut
: พิมพ์เฉพาะส่วนที่ระบุของแต่ละบรรทัดในไฟล์-d:
: ทำให้cut
ตีความ:
เป็นตัวคั่นฟิลด์-f4
: ทำให้cut
พิมพ์เฉพาะฟิลด์ที่สี่รายละเอียด Regex # 2:
^
: จุดเริ่มต้นของบรรทัด.*
: ศูนย์หรือมากกว่าตัวละคร$
: สิ้นสุดบรรทัดgetent group sudo | cut -d: -f4
หรือใช้ awk แต่วิธีใดก็ตามโปรดจำไว้ว่ากลุ่มและ passwd มีรูปแบบคงที่พร้อมตัวคั่น
getent group
- คุณไม่จำเป็นต้องใช้ grep เลย getent group foo
เป็นเหมือนgrep foo /etc/group
แต่มีความสามารถมากกว่า
getent
เลยว่ามีวิธีใดgrep
และgetent
เปรียบเทียบการคำนวณอย่างไร มันจะเบากว่าgetent
หรือไม่ในการทำงาน
sudo
กลุ่ม UNIXes บางคนมีกลุ่มอื่น ๆ wheel
เช่น คำตอบโดย @muru จะรวมถึง sudoers ทั้งหมดไม่ว่าพวกเขาจะอยู่ในกลุ่มใด
ตามที่ระบุไว้ที่นี่ฉันพิจารณาวิธีที่ง่ายที่สุดในการค้นหาด้วย-l
& -U
ตัวเลือกด้วยกันเพียงพิมพ์users
มันจะแสดงรายการเช่น: John
จากนั้น:
หากผู้ใช้มีsudo
การเข้าถึงก็จะพิมพ์ระดับการsudo
เข้าถึงสำหรับผู้ใช้นั้น:
sudo -l -U John
User John may run the following commands on this host:
(ALL : ALL) ALL
หากผู้ใช้ไม่มีการเข้าถึง sudo จะพิมพ์ว่าผู้ใช้ไม่ได้รับอนุญาตให้ทำงานsudo
บน localhost:
sudo -l -U John
User John is not allowed to run sudo on localhost.
"%domain admins@mycompany.intra" ALL=(ALL) ALL
นั้นจะใช้ได้ คุณประหยัดเวลาได้มากเพราะฉันไม่ทราบว่าวิธีนี้ใช้ได้ผลกับผู้ใช้ที่ไม่ใช่คนท้องถิ่น
ตามที่ได้มีการระบุไว้แล้วคำตอบสามารถพบได้ในUnix & Linux Stack Exchange :
สิ่งนี้แสดงให้เห็นว่าผู้ใช้ "saml" เป็นสมาชิกของกลุ่มล้อ
$ getent group wheel wheel:x:10:saml
ข้อแตกต่างคือกลุ่มใน Ubuntu ไม่ใช่wheel
แต่sudo
(หรือadmin
ใน Ubuntu รุ่นเก่ากว่า) ดังนั้นคำสั่งจะกลายเป็น:
getent group sudo
geten group
และฉันเห็นตัวเลขที่แตกต่างกันมากมาย คำถามเดิมของฉันคือวิธีการที่จะดูว่าผู้ใช้เป็นผู้ใช้ระบบ (สร้างขึ้นด้วยuseradd -r
)
เมื่อขยายการsudo -l -U
ทดสอบเราสามารถใช้getent passwd
เพื่อกำหนดผู้ใช้ที่สามารถsudo
ใช้ได้ การใช้getent
ช่วยให้เราสามารถเข้าถึงผู้ใช้ที่อาจไม่ปรากฏในpasswd
ไฟล์เช่นผู้ใช้ LDAP:
getent passwd | cut -f1 -d: | sudo xargs -L1 sudo -l -U | grep -v 'not allowed'
sudo -U
ไม่ส่งคืนค่าออกที่ไม่เป็นศูนย์ซึ่งเราสามารถใช้ประโยชน์ได้ดังนั้นเราจึงลดการ grepping ผลลัพธ์
sudo
นี่คือคำตอบที่ดีที่สุดเพราะมันไม่ได้คิดว่ามีกลุ่มที่เรียกว่า
บนระบบที่เหมือน Unix ส่วนใหญ่ที่มีคำสั่ง sudo และมีไฟล์คอนฟิกูเรชัน sudo ใช้ visudo เป็น root:
:~$ sudo bash
หรือ
:~$ su
:~# visudo
จะอนุญาตให้ผู้ดูแลระบบตรวจสอบและแก้ไขสิทธิ์ของกลุ่มที่สามารถใช้คำสั่ง sudo
สำหรับระบบ Unix-Debian ที่ใช้ Debian เช่น Ubuntu กลุ่มที่ 4 และ 27 จะมีสิทธิ์การเข้าถึงสิทธิ์ sudo
กลุ่ม 4 คือกลุ่มผู้ดูแลระบบ (adm) และกลุ่ม 27 คือ sudo gid
หากต้องการดูว่าผู้ใช้ใดที่ได้รับมอบหมายให้กลุ่มเหล่านี้แมวไฟล์ / etc / group ดังแสดงด้านล่าง:
:~$ cat /etc/group
ตัวอย่างผลลัพธ์บน Ubuntu (แต่ไม่ใช่ Redhat based, Oracle Solaris / Solaris หรือระบบที่ใช้ BSD) จะให้สิ่งนี้:
adm:x:4:youruser
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:youruser,mybrother
floppy:x:25:
tape:x:26:
sudo:x:27:youruser,mybrother
อย่างที่เราบอกได้ว่าผู้ใช้ของคุณเป็นผู้ดูแลระบบและเป็นสมาชิกของกลุ่ม 4 (adm) แต่ youruser และ mybrother เป็นสมาชิกของกลุ่ม 27 ซึ่งเป็นหมายเลข gid (การระบุกลุ่ม) ของกลุ่ม sudo ดังนั้น mybrother ยังสามารถได้รับสิทธิ์รูต (ผู้ใช้ระดับสูง)
ระบบ linux จำนวนมากเช่น Fedora และ Slackware รวมกลุ่มล้อ gid = 10 ซึ่งอนุญาตสิทธิ์ผู้ดูแลระบบเมื่อใช้คำสั่ง sudo บนระบบที่ใช้ BSD (เช่น FreeBSD) ผู้ใช้รูทเป็นสมาชิกของกลุ่มล้อซึ่งเป็น gid 0
นอกจากนี้โดยใช้คำสั่ง id ผู้ใช้สามารถค้นหาข้อมูลกลุ่มของผู้ใช้รายอื่นที่รู้จักในระบบ
ตัวอย่างเช่น:
:~$ id mybrother
ตัวอย่างผลลัพธ์
uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
คำสั่งนี้ส่งคืนรายการผู้ใช้ที่มีสิทธิ์ sudo:
awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' /etc/passwd
ผลลัพธ์คือ (เช่น):
<username> : <username> adm cdrom sudo dip plugdev lpadmin sambashare docker
หากมีเพียงชื่อผู้ใช้ที่จะแสดงดังนั้นคำสั่งนี้:
awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
คำสั่ง:
cat /etc/group | grep sudo
เอาท์พุท:
sudo:x:27:Tom,Stacy
Tom, Stacy เป็นผู้ใช้ที่มีสิทธิ์ sudo
cat
ผมอึ้งเกี่ยวกับวิธีการที่vagrant
ผู้ใช้สามารถใช้งานsudo
ได้โดยไม่ต้องได้รับการกล่าวถึงใน/etc/sudoers
หรือในมิได้พบกับ/etc/group
getent
เปิดออกยังอ่านรายการจากไฟล์ทั้งหมดภายใต้sudo
/etc/sudoers.d/
ดังนั้นหากคุณยังไม่ได้ดูในไดเรกทอรีนั้นคุณอาจไม่ทราบว่ามีผู้ใช้กี่คนที่sudo
สามารถเข้าถึงได้
ชนิดของsudo
การเข้าถึงสามารถตรวจพบโดยคำตอบโจ๊กโดยใช้sudo -l -U vagrant
แต่ไม่ถูกตรวจจับโดยใด ๆ ของคำตอบอื่น ๆ ที่นี่ที่ทุกคนต้องพึ่งพาทั้งหรือgetent
/etc/group