วิธีซ่อนผู้ใช้จากหน้าจอเข้าสู่ระบบ GDM


64

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


ผมไม่ทราบว่าท้ายExclude=foobarใน/etc/gdm/gdm.confงานมีคุณพยายามมันได้หรือไม่
Umang

คำถามที่ดีคำตอบอาจจะล้าสมัย (ตามการอภิปรายในเมตาดาต้า)
Thufir

คำตอบ:


30

แก้ไขไฟล์ /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 เช่นกัน


ตอนนี้, เครื่องมือ GUI ไม่ทำงานอีกต่อไป, เนื่องจากข้อเท็จจริงที่ว่า GDM เปลี่ยนจาก textfiles ของเครื่องบินสำหรับการตั้งค่าเป็น schema ของ Gconf
LassePoulsen

ขอบคุณสำหรับแล็บแหล่งข้อมูล ฉันสังเกตว่าในช่วงไม่กี่รุ่นที่ผ่านมาเครื่องมือ GUI หลายอย่างได้สูญหายไปด้วยเหตุผลที่คล้ายกัน
Richard Holloway

29
/etc/gdm/gdm.schemaอันที่จริงผมไม่คิดว่าคุณควรแก้ไข แทนที่จะเพิ่มสองบรรทัดที่จะ[greeter] Exclude=nobody,qmail-foo,qmail-bar /etc/gdm/custom.conf(นอกเหนือจากnobodyชื่อในรายการเริ่มต้นจะไม่ปรากฏขึ้นเพราะ uid ของพวกเขาคือ <1,000.)
Gilles

3
โดยปกติคุณควรใช้ uids ที่ต่ำกว่า 1,000
txwikinger

@RichardHolloway ไม่พบไฟล์ดังกล่าวUbuntu 12.04.04คุณสามารถให้คำแนะนำได้ไหม
gotqn

56

สำหรับ GDM 3.X ที่ใหม่กว่าคำตอบเก่าจะใช้ไม่ได้ยกเว้นในกรณีนี้
การgreeterตั้งค่าcustom.confเป็นล้าสมัยนั่นคือมันจะไม่ทำงานอีกต่อไป วิธีแก้ปัญหาง่ายๆหนึ่งวิธีถ้าคุณต้องการหลีกเลี่ยงการเปลี่ยน uid ของผู้ใช้:

  1. เปิดเทอร์มินัลแล้วป้อน (แทนที่userด้วยชื่อผู้ใช้ที่คุณต้องการซ่อนจากหน้าจอเข้าสู่ระบบ):

    sudo nano /var/lib/AccountsService/users/user
    
  2. เพิ่มสิ่งต่อไปนี้ในไฟล์:

    [User]  
    Language=   
    XSession=gnome  
    SystemAccount=true  
    
  3. สลับผู้ใช้หรือออกจากระบบเพื่อทดสอบว่าuserจะไม่อยู่ในรายการอีกต่อไป


1
แท้จริงนี้คือสิ่งที่ฉันได้หลังจากที่ได้อ่านเอกสาร Arch คำตอบนี้ควรอัปเดตเพื่อให้ผู้คนเห็นเร็วขึ้นและประหยัดเวลา
Stefan van den Akker

ดูเหมือนจะเป็นวิธีที่เหมาะสมมากกว่าจัดการกับ UIDs
xuma202

1
Fantastic! สิ่งนี้จะช่วยในการแก้ปัญหาของผู้ใช้ที่มี uids น้อยกว่า 1,000 จะถูกซ่อนไว้ในหน้าจอเข้าสู่ระบบ
biocyberman

1
การทำให้ผู้ใช้เป็นบัญชีระบบคืออะไร
Jistanidiot

2
สิ่งนี้ใช้ได้สำหรับฉัน แต่ฉันต้องรีบูตเพื่อให้การเปลี่ยนแปลงมีผล
benjer3

13

แฮ็ค แต่คุณสามารถแก้ไข 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'

3
ไม่มีสิ่งเช่น "ระดับผู้ใช้" เป็นรหัสผู้ใช้
João Pinto

6
ว่าusermod -uตัวเลือกที่น่าสนใจ: มันจะเปลี่ยน UID ในไดเรกทอรีบ้านและระวิงอีเมล (ถ้ามี) เพื่อให้ตรงกับ อย่างไรก็ตามมันอาจทำลายการเข้าถึงไฟล์ใด ๆ ที่พวกเขาเป็นเจ้าของนอกไดเรกทอรีหลักของพวกเขา
14701 poolie

หากต้องการซ่อนรายการทั้งหมดคุณสามารถเรียกใช้ gdmsetup และใช้ช่องทำเครื่องหมาย
belacqua

11

อธิบายอย่างละเอียดเกี่ยวกับความคิดเห็นของ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การตั้งค่าใด ๆและแสดงเฉพาะผู้ใช้ที่ระบุไว้อย่างชัดเจน


+1 สำหรับการอ้างอิงถึงเว็บไซต์ของ GDM และเพราะสิ่งนี้ใช้ได้สำหรับฉัน
แอรอน

ไม่สามารถทำงานกับ GDM เวอร์ชันที่ใหม่กว่าได้อีก
Stefan van den Akker

2

ฉันเขียนสคริปต์ (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

2

ฉันต้องยอมรับว่าคำตอบที่ได้รับการยอมรับมากที่สุดอยู่ใกล้ แต่ไม่ตาย

ฉันเพิ่งเลียปัญหานี้ด้วยตัวเองและคำตอบสำหรับฉันคือแก้ไขรายการ 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' แต่โดยส่วนตัวฉันไม่รู้สึกว่าจำเป็นต้องทำสิ่งต่างๆ ไมล์สะสมของคุณอาจแตกต่างกันไป ...


0

เปลี่ยนเชลล์ล็อกอินของผู้ใช้เป็นสตริงว่างใน / etc / passwd

ตัวอย่างเช่นเปลี่ยน:

# 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 ปฏิเสธการเข้าสู่ระบบทั้งหมดให้กับผู้ใช้นั้นซึ่งฉันยังคงต้องการที่จะเป็น แต่นั่นยังซ่อนผู้ใช้ในหน้าจอเข้าสู่ระบบหากคุณต้องการให้ผู้ใช้นั้นไม่สามารถเข้าถึงได้ธรรมดา

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