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

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

编辑文件/etc/gdm/gdm.schema找到当前如下所示的部分:

   greeter/Exclude s bin,root,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,nobody4,noaccess,postgres,pvm,rpm,nfsnobody,pcap  

并且要排除名为qmail的用户,例如将qmail添加到默认列表,以便该部分看起来像这样。

   greeter/Exclude s qmail, bin,root,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,nobody4,noaccess,postgres,pvm,rpm,nfsnobody,pcap  

这将阻止用户qmail出现在gdm greeter中。 曾经有一个很好的GUI工具来做这个,但是在最近几个版本中还没有在Ubuntu中。

另一种方法是将用户的UID设置为1000以下。这些被认为是系统帐户,也被排除在GDM欢迎之外。

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

  1. 打开终端,然后输入(用登录界面中要隐藏的用户名替换user ):

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

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

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

 sudo usermod -u 999  

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

我知道的另一种方法是完全隐藏列表:

 sudo -u gdm gconftool-2 --type bool --set /apps/gdm/simple-greeter/disable_user_list 'true' 

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

这种方法是在GDM网站的文档中提出的方法,虽然网站和Gilles都显示添加“无人”到排除,但我想确保这显然是必要的(尽管手册页是什么)或在线文档明确提供)。 我在几个10.10系统上测试了这个,以validation可重复性。

我们需要做的就是对/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。

NB#2 :UID低于1000的帐户不显示是可配置参数。 默认情况下, MinimalUID值设置为1000.当且仅当默认设置IncludeAll=true保留在原位并且Include指令未更改为非空值时,GDM greeter是否会扫描passwd文件以查找包含UID大于MinimalUID。 然后显示UID高于MinimalUID且不在排除列表中的用户。

我没有测试反向设置,即在custom.conf中设置Include=user1,user2条目是否会按照提供的方式工作。 它应覆盖任何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,,#,' /etc/gdm/gdm.schemas | \ tr '\n#' '#\n' | \ grep '>greeter/Exclude<' | tr '\n#' '#\n' | \ grep '' | \ sed -e 's,.*,,' -e 's,.*,,'` # 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 { { 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 { { 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 { { 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)  greeter/IncludeAll b true  (after my edit)  greeter/IncludeAll b false  

这样做的结果是所有用户列表都被禁用,如果我正确地解释原始问题,那实际上就是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’,但我个人觉得不需要这样做。 你自己的里程可能不一样……

将用户登录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中的[greeter]下添加Exclude=user1,user2Include=user3 ,或者创建一个/etc/mdm/custom.conf作为另一个框中隐藏了通过useradd添加的用户就好了,同时显示了添加了adduser用户。 将登录shell设置为/ bin / false会拒绝对该用户的所有登录,我仍然希望将其作为su。 但是,如果您希望该用户无法访问,那么也会在登录屏幕中隐藏用户。