it-swarm.cn

如何在GDM登录界面中隐藏用户?

我最近添加了几个新用户,我需要qmail。现在它们出现在登录屏幕的框中并使其混乱,我必须滚动才能找到我的用户。如何从登录框中隐藏这些用户?

64
gruszczy

编辑文件/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设置为1000以下。这些被认为是GDM欢迎中排除的系统帐户。

30
Richard Holloway

对于较新的GDM 3.X,旧的答案不起作用,除了这个
custom.conf中的greeter设置是 已废弃 ,即它将不再起作用。如果您想避免更改用户的uid,可以采用一种简单的解决方法:

  1. 打开终端,然后输入(将user替换为您要从登录屏幕隐藏的用户名):

    Sudo nano /var/lib/AccountsService/users/user
    
  2. 将以下内容添加到文件中:

    [User]  
    Language=   
    XSession=gnome  
    SystemAccount=true  
    
  3. 切换用户或注销以测试是否已再次列出user

55
miceagol

Hacky但您可以修改用户的ID,以便它们不会显示在列表中:

Sudo usermod -u 999 <username>

这是有效的,因为id低于1000的用户被认为是“系统”用户(即不是人类)。

我知道的唯一其他方法是完全隐藏列表:

Sudo -u gdm gconftool-2 --type bool --set /apps/gdm/simple-greeter/disable_user_list 'true'
13
Oli

详细阐述Gilles对已接受答案的评论,这就是我认为目前的“最佳实践”(Gnome-safe)方式。此更改也将反映在Gnome“指标小程序会话”中。

这个方法是在 GDM网站 的文档中提出的方法,虽然网站和Gilles都显示添加“无人”到排除,我想确保它很明显这是实际上是必要的(尽管手册或在线文档明确提供)。我在几个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

/etc/gdm/custom.conf的[Greeter]部分中,添加:

Exclude=user1,user2,nobody

其中“user1”和“user2”是您不希望在GDM“面部浏览器”上显示的用户名或密码文件条目(例如,qmail,squid等)。

注意:在我的Gnome/GDM版本(2.30)下,如果您在排除条目中没有列出“nobody”,那么您将有一个伪造的登录用户nobody出现而不是user1或user2。

N.B。#2:UID低于1000的帐户的不显示是可配置参数。默认情况下,MinimalUID值设置为1000.当且仅当缺省设置IncludeAll=true并且Include指令未更改为非空值时,GDM欢迎程序是否会扫描passwd文件以查找UID更大的条目比MinimalUID。然后显示UID高于MinimalUID且不在排除列表中的用户。

我没有测试反向设置,即在custom.conf中设置Include=user1,user2条目是否会按照提供的方式工作。它应覆盖任何IncludeAll设置,并仅显示明确列出的用户。

11
belacqua

我本周末写了一个剧本(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
Hans Vervaart

我必须同意,这里最常被接受的答案是关闭的,但不是死的。

我自己就舔过这个问题,而我的答案是改变以下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)打算做的事情。这消除了制作长行排除的需要,因为无论UID号如何都被排除,无论一旦改变该设置,都将排除所有用户ID。我个人将此设置应用于3个独立的CentOS 6.2服务器,这些服务器偶尔通过XDPCP(使用xrdp> vnc-server> xinetd> gdm> gnome)通过RDP访问,这允许我们一些经验不足的Linux管理员在这些服务器上工作训练最少的系统。

所有这些都说,虽然我同意一个没有经验的系统管理员应该从一开始就从个人帐户(可能是Sudo访问)而不是root用户身上学习,如果你有经验可以正确使用该帐户,那就没有坏处在这样做。只要确保你事先知道你在做什么。对于我的其他系统管理员,我已将CentrifyDC for Active Directory支持添加到所有这些系统并配置系统,以便AD-UserID可用于桌面会话,同时保持用户的AD安全组权限。但就个人而言,由于我设计了所有这些服务器并且已经使用Linux超过15年了,我认为没有使用root来加快速度。实际上,我倾向于在已被禁用的系统上启用root权限,这样我就可以使用该帐户并通过完成任务来切入追逐。实际上,最重要的是养成在改变文件之前创建任何文件的备份副本的习惯。这样可以安全地防范大多数事故并允许您在执行编辑时恢复系统,否则会导致系统无法访问(只需启动到现场CD并修复需要修复的内容)。

恕我直言,我相信“从不以root身份登录”的口号确实只是为了保护自己的n00bie系统管理员。但是如果你达到了Linux的能力水平,你可以在很短的时间内从任何Linux操作系统中设计一个系统并且每次都可以工作,那么就没有理由以'永远不能以root身份登录'为生。口头禅,因为到那时你已准备好处理使用该帐户所带来的责任。在使用CentrifyDC进行AD支持的环境中尤其如此,因为“root”成为本地sysadmin帐户并且(通常)自动启用。所以,我发现最好切入追逐并将root帐户密码的设置作为我现在在任何部署上执行的首要任务之一。当然,我可以做整个'登录作为我自己的ID,然后Sudo up',但我个人觉得不需要这样做。你自己的里程可能不一样......

2
StygianAgenda

将用户登录Shell更改为/ 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, ...)

我花了几周的时间才发现这是用户隐藏在显示管理器登录欢迎中的原因。很明显,MDM会忽略/ var/lib/AccountService/users,并且假设也是GDM。我没有在/etc/mdm/mdm.conf中的Exclude=user1,user2下添加Include=user3[greeter],或创建/etc/mdm/custom.conf,因为另一个框隐藏了通过useradd添加的用户很好,同时显示添加了adduser的用户。将登录Shell设置为/ bin/false会拒绝所有登录该用户,我仍然希望将其作为su。但是,如果您希望该用户无法访问,那么也会在登录屏幕中隐藏用户。

0
ThorSummoner