ฉันเพิ่งเพิ่มผู้ใช้ใหม่หลายคนที่ฉันต้องการสำหรับ qmail ตอนนี้พวกเขาปรากฏในกล่องในหน้าจอเข้าสู่ระบบและถ่วงและฉันต้องเลื่อนเพื่อค้นหาผู้ใช้ของฉัน ฉันจะซ่อนผู้ใช้เหล่านั้นจากกล่องเข้าสู่ระบบได้อย่างไร
ฉันเพิ่งเพิ่มผู้ใช้ใหม่หลายคนที่ฉันต้องการสำหรับ qmail ตอนนี้พวกเขาปรากฏในกล่องในหน้าจอเข้าสู่ระบบและถ่วงและฉันต้องเลื่อนเพื่อค้นหาผู้ใช้ของฉัน ฉันจะซ่อนผู้ใช้เหล่านั้นจากกล่องเข้าสู่ระบบได้อย่างไร
คำตอบ:
แก้ไขไฟล์ /etc/gdm/gdm.schema ค้นหาส่วนที่มีลักษณะดังนี้:
  <schema>
    <key>greeter/Exclude</key>
    <signature>s</signature>
    <default>bin,root,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,nobody4,noaccess,postgres,pvm,rpm,nfsnobody,pcap</default>
  </schema>
และเพื่อแยกผู้ใช้ที่เรียกว่า qmail ตัวอย่างเช่นเพิ่ม qmail ลงในรายการเริ่มต้นดังนั้นส่วนที่มีลักษณะเช่นนี้
  <schema>
    <key>greeter/Exclude</key>
    <signature>s</signature>
    <default>qmail, bin,root,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,nobody4,noaccess,postgres,pvm,rpm,nfsnobody,pcap</default>
  </schema>
ที่จะหยุดผู้ใช้ qmail ปรากฏใน gdm greeter เคยมีเครื่องมือ GUI ที่ดีในการทำเช่นนี้ แต่ไม่ได้อยู่ใน Ubuntu สำหรับรุ่นล่าสุด
อีกทางเลือกหนึ่งคือการตั้งค่า UID ของผู้ใช้ให้ต่ำกว่า 1,000 รายการซึ่งถือว่าเป็นบัญชีระบบที่ไม่รวมอยู่ใน GDM greeter เช่นกัน
/etc/gdm/gdm.schemaอันที่จริงผมไม่คิดว่าคุณควรแก้ไข แทนที่จะเพิ่มสองบรรทัดที่จะ[greeter] Exclude=nobody,qmail-foo,qmail-bar /etc/gdm/custom.conf(นอกเหนือจากnobodyชื่อในรายการเริ่มต้นจะไม่ปรากฏขึ้นเพราะ uid ของพวกเขาคือ <1,000.)
                    Ubuntu 12.04.04คุณสามารถให้คำแนะนำได้ไหม
                    สำหรับ GDM 3.X ที่ใหม่กว่าคำตอบเก่าจะใช้ไม่ได้ยกเว้นในกรณีนี้
 
การgreeterตั้งค่าcustom.confเป็นล้าสมัยนั่นคือมันจะไม่ทำงานอีกต่อไป วิธีแก้ปัญหาง่ายๆหนึ่งวิธีถ้าคุณต้องการหลีกเลี่ยงการเปลี่ยน uid ของผู้ใช้:
เปิดเทอร์มินัลแล้วป้อน (แทนที่userด้วยชื่อผู้ใช้ที่คุณต้องการซ่อนจากหน้าจอเข้าสู่ระบบ):
sudo nano /var/lib/AccountsService/users/user
เพิ่มสิ่งต่อไปนี้ในไฟล์:
[User]  
Language=   
XSession=gnome  
SystemAccount=true  
สลับผู้ใช้หรือออกจากระบบเพื่อทดสอบว่าuserจะไม่อยู่ในรายการอีกต่อไป
แฮ็ค แต่คุณสามารถแก้ไข ID ของผู้ใช้เพื่อไม่ให้แสดงในรายการ:
sudo usermod -u 999 <username>
สิ่งนี้ทำงานได้เนื่องจากผู้ใช้ที่มี ID ต่ำกว่า 1,000 ถือว่าเป็นผู้ใช้ "ระบบ" (เช่นไม่ใช่มนุษย์)
วิธีเดียวที่ฉันรู้ก็คือการซ่อนรายการทั้งหมด:
sudo -u gdm gconftool-2 --type bool --set /apps/gdm/simple-greeter/disable_user_list 'true'
usermod -uตัวเลือกที่น่าสนใจ: มันจะเปลี่ยน UID ในไดเรกทอรีบ้านและระวิงอีเมล (ถ้ามี) เพื่อให้ตรงกับ อย่างไรก็ตามมันอาจทำลายการเข้าถึงไฟล์ใด ๆ ที่พวกเขาเป็นเจ้าของนอกไดเรกทอรีหลักของพวกเขา
                    อธิบายอย่างละเอียดเกี่ยวกับความคิดเห็นของGillesต่อคำตอบที่ยอมรับได้นี่คือสิ่งที่ฉันเชื่อว่าเป็นวิธี "ปฏิบัติที่ดีที่สุด" ในปัจจุบัน (Gnome-safe) วิธีทำสิ่งนี้ การเปลี่ยนแปลงนี้จะปรากฏใน Gnome "ตัวบ่งชี้แอปเพล็ตเซสชัน"
วิธีนี้เป็นวิธีที่แนะนำในเอกสารที่เว็บไซต์ GDMและแม้ว่าทั้งเว็บไซต์และ Gilles จะแสดงการเพิ่ม "ไม่มีใคร" ลงในการยกเว้นฉันต้องการให้แน่ใจว่าชัดเจนว่านี่เป็นสิ่งจำเป็นจริง ๆ (แม้จะเป็น manpages หรือเอกสารออนไลน์ให้อย่างชัดเจน) ฉันได้ทำการทดสอบกับสองระบบ 10.10 เพื่อตรวจสอบการทำซ้ำ
สิ่งที่เราต้องทำคือแก้ไขในบรรทัด/etc/gdm/custom.confเดียว วิธีการอื่น ๆ ส่วนใหญ่ (การเปลี่ยนแปลง default.conf, gdm.conf ฯลฯ ) ถูกคัดค้าน
หากคุณมีอยู่/etc/gdm/custom.confแล้วแก้ไขไฟล์นั้น มิฉะนั้นให้คัดลอกไฟล์ตัวอย่าง:  
sudo cp /usr/share/doc/gdm/examples/custom.conf /etc/gdm/custom.conf
ในส่วน [Greeter] ของ/etc/gdm/custom.confเพิ่ม:  
Exclude=user1,user2,nobody
โดยที่ "user1" และ "user2" เป็นชื่อผู้ใช้หรือรายการไฟล์ passwd (เช่น qmail, squid และอื่น ๆ ) ที่คุณไม่ต้องการแสดงใน GDM "face browser"
หมายเหตุ : ภายใต้รุ่น Gnome / GDM (2.30) ของฉันหากคุณไม่มี "ไม่มีใคร" อยู่ในรายการยกเว้นคุณจะมีผู้ใช้เข้าสู่ระบบปลอมnobodyปรากฏขึ้นแทน user1 หรือ user2  
หมายเหตุ # 2 : การไม่แสดงบัญชีที่มี UID ต่ำกว่า 1,000 รายการเป็นพารามิเตอร์ที่กำหนดค่าได้ โดยค่าเริ่มต้นMinimalUIDค่าจะถูกตั้งไว้ที่ 1,000 ถ้าหากการตั้งค่าเริ่มต้นIncludeAll=trueถูกทิ้งไว้และIncludeคำสั่งจะไม่เปลี่ยนเป็นค่าที่ไม่ว่างเปล่า GDM greeter สแกนไฟล์ passwd สำหรับรายการที่มี UID มากกว่า MinimalUID ผู้ใช้ที่มี UID ข้างต้น MinimalUID ที่ไม่ได้อยู่ในรายการยกเว้นจะปรากฏขึ้น
ฉันยังไม่ได้ทดสอบว่าการตั้งค่าย้อนกลับคือการตั้งค่าInclude=user1,user2รายการใน custom.conf จะทำงานตามที่นำเสนอ ควรแทนที่IncludeAllการตั้งค่าใด ๆและแสดงเฉพาะผู้ใช้ที่ระบุไว้อย่างชัดเจน
ฉันเขียนสคริปต์ (gdm-greeter) สุดสัปดาห์นี้ มันใช้งานได้ดีบน CentOS 6.2 ฉันสงสัยว่ามันจะมีประโยชน์สำหรับ Ubuntu หรือไม่?
#!/bin/bash
#
# $LastChangedDate: 2012-02-17 09:13:10 +0100 (Fri, 17 Feb 2012) $
# $Revision: 1627 $
#
# Get the default exlude list
DefaultExclude=`sed 's,</schema>,#,' /etc/gdm/gdm.schemas | \
                tr '\n#' '#\n' | \
                grep '>greeter/Exclude<' | tr '\n#' '#\n' | \
                grep '<default>' | \
                sed -e 's,.*<default>,,' -e 's,</default>.*,,'`
# Get the Exclude list from the config
eval `grep '^Exclude=' /etc/gdm/custom.conf 2> /dev/null`
# If empty copy the default
if [ "$Exclude" = "" ]
then
   Exclude=$DefaultExclude
fi
# Collect all user accounts with a shell
Users="`grep 'sh$' /etc/passwd | awk -F: '{print $1}' | \
        sort | tr '\n' ',' | sed 's/,$//'`"
#------------------------------------------------------------------------------
# The functions area
PlaceExclude() # $1 new exclude string
{
   # Create a .bak file
   if [ ! -f /etc/gdm/custom.conf.bak ]
   then
      cp /etc/gdm/custom.conf /etc/gdm/custom.conf.bak
   fi
   # Create a tmp file without the Exclude string
   cat /etc/gdm/custom.conf | tr '[\n' '\n[' | \
   sed -e 's/^\(greeter[]].*\)[[]Exclude=[^[]*\([[].*\)/\1\2/' | \
   tr '[\n' '\n[' > /tmp/custom.conf.$$
   # If the tmp file is there and we have non default Exclude
   if [ -f /tmp/custom.conf.$$ ]
   then
      if [ "$1" = "$DefaultExclude" ]
      then
         cat /tmp/custom.conf.$$ > /etc/gdm/custom.conf
      else
         # Place the new Exclude string
         cat /tmp/custom.conf.$$ | tr '[\n' '\n[' | \
         sed -e "s/^greeter[]][[][[]/greeter][Exclude=$1[[/" | \
         tr '[\n' '\n[' > /etc/gdm/custom.conf
      fi
   fi
   rm -f cat /tmp/custom.conf.$$
}
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Command area
add() # Cmd (Add a user to the greeter {<user>
{
   UserFilter=`echo $Users | sed 's/,/|/g'`
   if ! echo $1 | egrep -w $UserFilter &> /dev/null
   then
      echo "Error: user $1 unknown"
      echo
      return 1
   fi
   # Only work with the users not in the default exclude list
   Filter=`echo $DefaultExclude | sed 's/,/|/g'`
   Hidden=`echo $Exclude | tr ',' '\n' | egrep -vw "$Filter" | tr '\n' ','`
   # Check if we need to do something
   if ! echo $Hidden | tr ',' '\n' | grep -w $1 &> /dev/null
   then
      echo
      echo "User $1 is not hidden"
      echo
   else
      # Remove the user from the exclude
      PlaceExclude "`echo $Exclude | tr ',' '\n' | grep -vw $1 | \
                     tr '\n' ',' | sed 's/,$//'`"
      # Tell the action
      echo "User $1 added to the greeter"
      echo
   fi
}
del() # Cmd (Delete/hide a user from the greeter {<user>
{
   UserFilter=`echo $Users | sed 's/,/|/g'`
   if ! echo $1 | egrep -w $UserFilter &> /dev/null
   then
      echo "Error: user $1 unknown"
      echo
      return 1
   fi
   # Check if we need to do something
   if echo $Exclude | tr ',' '\n' | grep -w $1 &> /dev/null
   then
      echo
      echo "User $1 is already excluded from the greeter"
      echo
   else
      # Exclude the user
      PlaceExclude "$1,$Exclude"
      # Tell the action
      echo "User $1 hidden from the greeter"
      echo
   fi
}
hide() # CMD (Delete/hide a user from the greeter {<user>
{
   del $1
}
hidden() # Cmd (List the hidden users {
{
   Filter=`echo $DefaultExclude | sed 's/,/|/g'`
   Hidden=`echo $Exclude | tr ',' '\n' | egrep -vw "$Filter" | tr '\n' ','`
   if [ ${#Hidden} -eq 0 ]
   then
      echo "No hidden users"
      echo
   else
      echo
      echo "Users hidden from the greeter:"
      echo
      echo $Hidden | tr ',' '\n' | sed 's/^/   /'
   fi
}
users() # Cmd (List the users in the greeter {
{
   Filter=`echo $Exclude | sed 's/,/|/g'`
   Greeters=`echo $Users | tr ',' '\n' | egrep -vw "$Filter" | tr '\n' ','`
   if [ ${#Greeters} -eq 0 ]
   then
      echo "No users in the greeter"
      echo
   else
      echo
      echo "Users in the greeter:"
      echo
      echo $Greeters | tr ',' '\n' | sed 's/^/   /'
   fi
}
list() # CMD (List the users in the greeter {
{
   users
}
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Framework area
help() # Cmd (Command help {[command]
{
   if [ "$1" = "" ]
   then
      CMD=help
   else
      CMD=$1
   fi
   if ! grep \^${CMD}*\(\).*#.*Cmd $0 > /dev/null 2>&1
   then
   (
      echo
      echo "Error: unknown cmd"
      echo
   ) >&2
   else
   (
      echo
      echo "Usage: `basename $0` $CMD `grep \^${CMD}*\(\).*#.*Cmd $0 | \
                    sed 's/.* {//g'`"
      echo
   ) >&2
   fi
}
#
# Main
#
if [ "$1" != "" ] && grep -i $1\(\).*#.*Cmd $0 > /dev/null 2>&1
then
   $*
else
   echo
   echo "Usage: `basename $0` command [parm1] [parm2] [..]"
   echo
   echo "  Available Commands:"
   echo
   grep \^[0-9a-z_A-Z]*\(\).*#.*Cmd $0  | \
   awk -F\( '{printf "%-16s %s\n",$1,$3}' | sed 's/ {.*//g' | sort
   echo
fi
ฉันต้องยอมรับว่าคำตอบที่ได้รับการยอมรับมากที่สุดอยู่ใกล้ แต่ไม่ตาย
ฉันเพิ่งเลียปัญหานี้ด้วยตัวเองและคำตอบสำหรับฉันคือแก้ไขรายการ gdm.schema ต่อไปนี้:
(original)
<schema>
      <key>greeter/IncludeAll</key>
      <signature>b</signature>
      <default>true</default>
    </schema>
(after my edit)
<schema>
      <key>greeter/IncludeAll</key>
      <signature>b</signature>
      <default>false</default>
    </schema>
ผลของสิ่งนี้คือการที่รายชื่อผู้ใช้ทั้งหมดถูกปิดใช้งานซึ่งหากฉันตีความคำถามเดิมอย่างถูกต้องจริง ๆ แล้วสิ่งที่ OP (gruszczy) ตั้งใจจะทำ สิ่งนี้ช่วยลดความจำเป็นในการสร้างการแยกบรรทัดที่ยาวเนื่องจาก userID ทั้งหมดที่ไม่คำนึงถึงหมายเลข UID จะถูกแยกออกโดยไม่คำนึงถึงเมื่อมีการเปลี่ยนแปลงการตั้งค่านี้ ฉันได้ใช้การตั้งค่านี้เป็นการส่วนตัวกับเซิร์ฟเวอร์ CentOS 6.2 3 แห่งในที่ทำงานซึ่งเข้าถึงได้เป็นครั้งคราวผ่าน XDMCP (โดยใช้ xrdp> vnc-server> xinetd> gdm> gnome) ผ่าน RDP ซึ่งช่วยให้ผู้ดูแลระบบ Linux ที่มีประสบการณ์น้อยของเรา ระบบที่มีการฝึกอบรมน้อยที่สุด
จากที่กล่าวมาทั้งหมดในขณะที่ฉันยอมรับว่าระบบดูแลระบบที่ไม่มีประสบการณ์ควรเรียนรู้ตั้งแต่เริ่มต้นเพื่อทำงานจากบัญชีส่วนตัว (อาจเข้าถึง sudo) แทนที่จะเป็นรูทหากคุณมีประสบการณ์ในการทำงานกับบัญชีนั้นอย่างถูกต้องจะไม่มีอันตรายใด ๆ ในการทำเช่นนั้น. เพียงให้แน่ใจว่าคุณรู้ว่าสิ่งที่คุณทำก่อนมือ ในกรณีของ sysadmins อื่น ๆ ฉันได้เพิ่ม CentrifyDC สำหรับ Active Directory ให้กับระบบเหล่านี้ทั้งหมดและกำหนดค่าระบบเพื่อให้ AD-UserID สามารถใช้สำหรับเซสชันเดสก์ทอปในขณะที่รักษาสิทธิ์ AD Security Group ของผู้ใช้ แต่โดยส่วนตัวเนื่องจากฉันออกแบบเซิร์ฟเวอร์ทั้งหมดเหล่านี้และใช้ Linux มานานกว่า 15 ปีแล้วฉันจึงไม่คิดว่าจะใช้รูทเพื่อเร่งความเร็วสิ่งต่าง ๆ ในความเป็นจริงฉันมักจะเปิดใช้งานรูทบนระบบที่มัน ' ถูกปิดการใช้งานเพื่อให้ฉันสามารถใช้บัญชีนั้นและตัดการไล่ล่าด้วยการทำสิ่งต่าง ๆ ให้สำเร็จ สิ่งที่สำคัญจริง ๆ ก็คือการสร้างนิสัยในการสร้างสำเนาสำรองของไฟล์ใด ๆ ก่อนที่จะทำการเปลี่ยนแปลง สิ่งนี้จะปลอดภัยจากอุบัติเหตุส่วนใหญ่และช่วยให้คุณสามารถกู้คืนระบบได้หากคุณทำการแก้ไขที่อาจทำให้ระบบไม่สามารถเข้าถึงได้ (เพียงแค่บูตเข้าสู่ซีดีสดและแก้ไขสิ่งที่ต้องแก้ไข)
IMHO ฉันเชื่อว่ามนต์ของ 'ไม่เคยเข้าสู่ระบบในฐานะที่เป็นราก' จริงๆมีเพียงเพื่อป้องกัน nysbie sysadmins จากตัวเอง แต่ถ้าคุณมีความสามารถในระดับสูงด้วย Linux จนถึงจุดที่คุณสามารถสร้างระบบจากระบบปฏิบัติการ Linux ใด ๆ ในระยะเวลาอันสั้นและทำงานได้ทุกครั้งดังนั้นจึงไม่มีเหตุผลที่จะมีชีวิตอยู่โดย มนต์เพราะ ณ จุดนี้คุณพร้อมที่จะจัดการกับความรับผิดชอบที่มาพร้อมกับการใช้บัญชีนั้น นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งในสภาพแวดล้อมที่ใช้ CentrifyDC สำหรับการสนับสนุนโฆษณาเนื่องจาก 'รูท' กลายเป็นบัญชีดูแลระบบท้องถิ่นและเปิดใช้งาน (โดยปกติ) โดยอัตโนมัติ ดังนั้นฉันคิดว่ามันดีที่สุดที่จะตัดการไล่ล่าและทำการตั้งค่ารหัสผ่านของบัญชีรูทเป็นหนึ่งในภารกิจแรกที่ฉันทำในการปรับใช้ใด ๆ ในปัจจุบัน แน่นอนว่า ฉันสามารถ 'เข้าสู่ระบบเป็น ID ของตัวเองทั้งหมดแล้วทำ sudo' แต่โดยส่วนตัวฉันไม่รู้สึกว่าจำเป็นต้องทำสิ่งต่างๆ ไมล์สะสมของคุณอาจแตกต่างกันไป ...
ตัวอย่างเช่นเปลี่ยน:
# Change
example:x:2001:2001:Example User,,,:/home/example:/bin/bash
# To
example:x:2001:2001:Example User,,,:/home/example:
ฉันรีสตาร์ทเครื่องมือจัดการหน้าจอและสังเกตว่าสิ่งนี้มีผลบังคับใช้
sudo service lightdm restart
# (or gdm, mdm, ...)
ฉันใช้เวลาหลายสัปดาห์ในการระบุว่าสิ่งนี้เป็นสาเหตุที่ทำให้ผู้ใช้ถูกซ่อนใน greeter ล็อกอินของผู้จัดการการแสดงผล เป็นที่ชัดเจนว่า MDM ถูกละเว้นโดย / var / lib / AccountService / users และ GDM ก็เช่นกัน ฉันไม่ได้ไปไกลเท่าที่จะเพิ่มExclude=user1,user2หรือInclude=user3ภายใต้[greeter]ใน /etc/mdm/mdm.conf หรือสร้าง /etc/mdm/custom.conf เนื่องจากกล่องอื่นซ่อนผู้ใช้ที่เพิ่มเข้ามาuseraddในขณะที่ผู้ใช้ เพิ่มด้วยadduserถูกแสดง การตั้งค่าเปลือกเข้าสู่ / bin / false ปฏิเสธการเข้าสู่ระบบทั้งหมดให้กับผู้ใช้นั้นซึ่งฉันยังคงต้องการที่จะเป็น แต่นั่นยังซ่อนผู้ใช้ในหน้าจอเข้าสู่ระบบหากคุณต้องการให้ผู้ใช้นั้นไม่สามารถเข้าถึงได้ธรรมดา
Exclude=foobarใน/etc/gdm/gdm.confงานมีคุณพยายามมันได้หรือไม่