ทำไมเอาต์พุตจาก 'groups' จึงแตกต่างจาก `กลุ่มผู้ใช้ 'ถ้าฉันลงชื่อเข้าใช้ด้วยชื่อผู้ใช้ในปัจจุบัน?


21

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

jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare

jacob@box:~$ groups jacob
jacob : jacob

นอกจากนี้มันหมายถึงอะไร "กลุ่มของกระบวนการปัจจุบัน" (จากหน้ากลุ่มคน)? พวกเขาตั้งอยู่ที่ไหน

หมายเหตุ: distro ของฉันคือ Ubuntu


@Jake ลองออกจากระบบแล้วกลับมาใหม่

1
ฉันมีปัญหานี้ในสิ่งที่ตรงกันข้าม 'groups myname' ให้กลุ่มทั้งหมดที่ฉันมีในไฟล์ / etc / groups แต่การทำเพียง 'กลุ่ม' จะแสดงเฉพาะกลุ่มหลักของฉัน และแน่นอนคำสั่งที่ต้องการให้ฉันอยู่ในกลุ่มเสริมบางอย่างล้มเหลวเนื่องจากขาดการอนุญาต แน่นอนว่าฉันรู้ว่าอะไรเป็นสาเหตุของสิ่งนี้
ทอดด์วอลตัน

คำตอบ:


11

อาจเป็นหนึ่งในสิ่งต่อไปนี้:

  • อาจเป็นข้อผิดพลาด (แม้ว่าฉันจะสงสัยก็ตาม)
  • คุณอาจต้องออกจากระบบและลงชื่อเข้าใช้อีกครั้ง

/etc/groupกลุ่มตั้งอยู่ใน


8

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

เมื่อคุณเรียกใช้groupsโดยไม่มีอาร์กิวเมนต์ท้ายที่สุดจะเรียกใช้getgroups ()เพื่อรับรายการกลุ่มเสริมจากเคอร์เนล (บนระบบ Linux ของฉัน / usr / bin / groups เป็นเชลล์สคริปต์ที่รัน "id -Gn" ซึ่งจะเรียกใช้ getgroups ()

เมื่อคุณเรียกใช้groups usernameคำสั่งจะต้อง "คาดเดา" สิ่งที่กลุ่มเสริมจะเป็นเมื่อผู้ใช้นั้นเข้าสู่ระบบโดยทั่วไปแล้วจะทำเช่นนี้โดยการอ่าน / etc / กลุ่มหรือพูดคุยกับ NIS หรือพูดคุยกับ nscd หรือ ... หลายวิธีที่อาจใช้งานได้

สิ่งที่คุณกำลังสังเกตอยู่นั้นคล้ายคลึงกับการค้นพบว่า ID ผู้ใช้จริงปัจจุบันของคุณและรายการของคุณใน / etc / passwd นั้นไม่สอดคล้องกัน นี่หมายความว่ามีบางอย่างแปลก ๆ เกี่ยวกับการกำหนดค่าระบบของคุณ แต่ก็ยากที่จะพูดในสิ่งที่ไม่มีการตรวจสอบเพิ่มเติม


3

(หมายเหตุ: groupsคำสั่งแม้ว่าจะยังมีประโยชน์ แต่ส่วนใหญ่จะถูกแทนที่ด้วยคำสั่ง id )

ผู้ใช้มีกลุ่มหลักที่กำหนดไว้ตามธรรมเนียมในไฟล์ /etc/passwdไฟล์ที่เขาเข้าสู่ระบบ แต่วันนี้อาจมีแหล่งข้อมูลอื่น เขาอาจเป็นสมาชิกของกลุ่มเพิ่มเติมที่รู้จักกันในชื่อกลุ่มรองหรือกลุ่มเสริมตามธรรมเนียมที่ระบุไว้ในไฟล์/etc/groupsแต่วันนี้สามารถมาจากหรือถูกบอกเป็นนัยโดยแหล่งที่มาเพิ่มเติม (เช่น NIS, LDAP, SAMBA เป็นต้น)

กลุ่มหลักและบัตรเสริมจะมีการกำหนดช่วงเวลาของการเข้าสู่ระบบและยังคงอยู่ในปัจจุบัน อย่างไรก็ตามผู้ใช้สามารถเปลี่ยนแปลงกลุ่มหลักที่ใช้งานอยู่ในปัจจุบันได้ตลอดเวลา โดยใช้newgrpคำสั่ง

กระบวนการล็อกอินตั้งค่ากลุ่มหลักและกลุ่มเสริม สำหรับในภายหลังโดยทั่วไปจะเรียกใช้ฟังก์ชัน libc กลุ่มเริ่มต้นซึ่งรวบรวมรายการข้อมูลกลุ่มเสริมและส่งต่อไปยัง ฟังก์ชันsetgroupsซึ่งกำหนดไว้ในบริบทของกระบวนการ

แหล่งข้อมูลสำหรับinitgroups:

  • / etc / passwdสำหรับการเข้าสู่ระบบหลัก
  • / etc / กลุ่ม สำหรับกลุ่มเสริม
  • /etc/nsswitch.conf สำหรับแหล่งข้อมูลไปยังกลุ่มเสริมซึ่งอธิบายไว้เป็น:

ใช้โดยไลบรารี GNU C และแอปพลิเคชันอื่น ๆ เพื่อกำหนดแหล่งที่มาเพื่อรับข้อมูลชื่อบริการในช่วงของหมวดหมู่และในลำดับใด ข้อมูลแต่ละหมวดหมู่จะถูกระบุด้วยชื่อฐานข้อมูล

groupsคำสั่งแสดงให้เห็นว่ากลุ่มตามที่นำมาใช้ในขณะนี้ให้กับผู้ใช้ของคุณและรายการที่จะเริ่มต้นด้วยกลุ่มหลักในปัจจุบันตามด้วยกลุ่มเสริมจากเวลาของการเข้าสู่ระบบ การเปลี่ยนแปลงใด ๆ กับแหล่งที่มาของข้อมูลจากหลังจากเวลาล็อกอินจะไม่ปรากฏในรายการที่แสดง

groups usernameคำสั่งจะขอ Linux เพื่อคำนวณกลุ่มสำหรับผู้ใช้ซึ่งจะทำโดยใช้หลักไฟล์/etc/password และ/etc/groupsแล้วแหล่งที่มาเพิ่มเติม สิ่งนี้จะสะท้อนถึงสถานการณ์ปัจจุบันของไฟล์ระบบและอาจไม่เท่ากับกลุ่มปัจจุบันที่ยังคงมีผลตั้งแต่เวลาเข้าสู่ระบบ

groups usernameคำสั่งอาจจะให้ผลที่แตกต่างกันเมื่อมันไม่ได้ใช้แหล่งที่มาทั้งหมดที่กระบวนการเข้าสู่ระบบที่ใช้ในการคำนวณกลุ่มเสริมของคุณซึ่งเป็นสิ่งที่เห็นได้ชัดว่าเกิดขึ้นในกรณีของคุณ แหล่งข้อมูลเหล่านี้อาจไม่สามารถเข้าถึงได้จากการเข้าสู่ระบบของคุณหรืออาจไม่ได้รับคำปรึกษาจากคำสั่ง

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

ในขณะที่groupsคำสั่งให้ผลลัพธ์ที่แม่นยำและถูกต้องคุณได้แสดงให้เห็นว่าgroups usernameคำสั่งไม่สามารถขึ้นอยู่กับการทำเช่นเดียวกัน

หากไม่มีการตรวจสอบซอร์สโค้ดของgroupsคำสั่งฉันจะเดาว่าการดำเนินการตามgroups usernameคำสั่งในการวิเคราะห์การกระจาย Linux ของคุณ/etc/groupsซึ่งในกรณีของคุณไม่มีอะไร แต่ไม่ได้ใช้/etc/nsswitch.confซึ่งกลุ่มเสริมทั้งหมดของคุณเข้ามา ดังนั้นจะแสดงรายการเฉพาะชื่อกลุ่มหลัก jacob .

สำหรับข้อมูลเพิ่มเติมดู:

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