问题描述
我最近添加了几个新用户,我需要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设置为1000以下。这些被认为是系统帐户,也被排除在GDM欢迎之外。
次佳解决方案
对于较新的GDM 3.X,旧答案不起作用,除此之外custom.conf
中的greeter
设置为obsolete,即它将不再起作用。如果您想避免更改用户的uid,可以采用一种简单的解决方法:
-
打开终端,然后输入(用登录界面中要隐藏的用户名替换
user
):sudo nano /var/lib/AccountsService/users/user
-
将以下内容添加到文件中:
[User] Language= XSession=gnome SystemAccount=true
-
切换用户或注销以测试
user
是否已不再列出。
第三种解决方案
Hacky但您可以修改用户的ID,以便它们不会显示在列表中:
sudo usermod -u 999 <username>
这是有效的,因为id低于1000的用户被认为是”system”用户(即不是人类)。
我知道的另一种方法是完全隐藏列表:
sudo -u gdm gconftool-2 --type bool --set /apps/gdm/simple-greeter/disable_user_list 'true'
第四种方案
详细阐述了Gilles对已接受的答案的评论,我认为这是目前的”best practices”(Gnome-safe)方式。此更改也将反映在Gnome“指标小程序会话”中。
这个方法是在GDM website的文档中建议的,虽然网站和Gilles都显示”nobody”添加到排除,但我想确保这显然是必要的(尽管手册或在线文档是什么)明确提供)。我在几个10.10系统上测试了这个,以验证可重复性。
我们需要做的就是在one-line上编辑/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 “face browser”上显示的用户名或密码文件条目(例如,qmail,squid等)。
注意:在我的Gnome /GDM版本(2.30)下,如果您没有在排除条目中列出”nobody”,那么您将有一个虚假的登录用户nobody
而不是user1或user2。
N.B.#2:UID低于1000的账户的non-display是可配置参数。默认情况下,MinimalUID值设置为1000.当且仅当默认设置IncludeAll = true保留在原位并且Include指令未更改为non-empty值时,GDM欢迎程序是否扫描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,</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>
这样做的结果是所有user-listing都被禁用,如果我正确地解释原始问题,实际上是OP(gruszczy)打算做的事情。这消除了制作长行排除的需要,因为无论UID号如何都被排除,无论一旦改变该设置,都将排除所有用户ID。我个人将此设置应用于3个独立的CentOS 6.2服务器,这些服务器偶尔通过XDMCP(使用xrdp> vnc-server> xinetd> gdm> gnome)通过RDP访问,这允许我们一些经验不足的Linux管理员工作在这些系统上进行最少的训练。
所有这些都说,虽然我同意一个没有经验的系统管理员应该从一开始就学习从个人帐户(可能是sudo访问)而不是root用户,如果你有经验可以正确使用该帐户,那就没有坏处在这样做。只要确保你事先知道你在做什么。对于我的其他系统管理员,我已将CentrifyDC for Active Directory支持添加到所有这些系统并配置了系统,以便AD-UserIDs可用于桌面会话,同时保持用户的AD安全组权限。但就个人而言,由于我设计了所有这些服务器并且已经使用Linux超过15年了,我认为没有使用root来加快速度。实际上,我倾向于在已被禁用的系统上启用root权限,这样我就可以使用该帐户并通过完成任务来切入追逐。实际上,最重要的是养成在改变文件之前创建任何文件的备份副本的习惯。这样可以安全地防范大多数事故并允许您恢复系统,如果您执行编辑,否则会导致系统无法访问(只需启动到现场CD并修复需要修复的内容)。
恕我直言,我相信“从不以root身份登录”的口号确实只是为了保护自己的n00bie系统管理员。但是如果你达到了Linux的能力水平,你可以在很短的时间内从任何Linux操作系统设计一个系统并且每次都可以工作,那么就没有理由以’永远不能以root身份登录’为生。口头禅,因为到那时你已经准备好处理使用该帐户所带来的责任。在使用CentrifyDC进行AD支持的环境中尤其如此,因为’root’成为本地sysadmin帐户并且(通常)自动启用。因此,我发现最好切入追逐并将root帐户密码的设置作为我现在在任何部署上执行的首要任务之一。当然,我可以做整个’登录作为我自己的ID,然后sudo up’,但我个人觉得不需要这样做。你自己的里程可能不一样……