#!/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
这样做的效果是所有用户列表都被禁用,如果我正确解释了原始问题,这实际上是 OP (gruszczy) 打算做的。这消除了制作一长串排除项的需要,因为无论 UID 编号如何,一旦更改此设置,所有用户 ID 都会被排除。我亲自将此设置应用于工作中的 3 个单独的 CentOS 6.2 服务器,这些服务器偶尔通过 RDP 上的 XDMCP(使用 xrdp > vnc-server > xinetd > gdm > gnome)访问,这允许我们一些经验不足的 Linux 管理员在这些服务器上工作培训最少的系统。
综上所述,虽然我确实同意没有经验的系统管理员应该从一开始就学习从个人帐户(可能具有 sudo 访问权限)而不是 root 工作,但如果您有正确使用该帐户的经验,那么没有害处在这样做。只要确保你事先知道你在做什么。对于我的其他系统管理员,我已经为所有这些系统添加了用于 Active Directory 支持的 CentrifyDC,并配置了系统,以便 AD-UserID 可用于桌面会话,同时维护用户的 AD 安全组权限。但就个人而言,由于我设计了所有这些服务器并且使用 Linux 已经超过 15 年,我认为使用 root 来加快速度并不重要。事实上,我倾向于在它所在的系统上启用 root s 已被禁用,以便我可以使用该帐户并直接完成任务。实际上,主要的事情就是养成在更改任何文件之前创建任何文件的备份副本的习惯。这将防止大多数事故发生,并允许您在执行会导致系统无法访问的编辑时恢复系统(只需启动到实时 CD 并修复需要修复的内容)。
恕我直言,我相信“永远不要以 root 身份登录”的口头禅实际上只是为了保护 n00bie 系统管理员免受自己的侵害。但是,如果您对 Linux 的掌握程度达到了可以在很短的时间内从任何 Linux 操作系统设计系统并且每次都能正常工作的程度,那么就没有理由过着“从不以 root 身份登录”的生活口头禅,因为到那时,您已经准备好承担使用该帐户所带来的责任。在使用 CentrifyDC 支持 AD 的环境中尤其如此,因为“root”成为本地系统管理员帐户并且(通常)自动启用。因此,我发现最好切入正题,将 root 帐户的密码设置作为我现在在任何部署中所做的首要任务之一。当然,我可以完成整个“以我自己的 ID 登录,然后 sudo up”,但我个人认为没有必要这样做。您自己的里程可能会有所不同...
对于较新的 GDM 3.X,旧答案不起作用,除了这个
The
greeter
settingcustom.conf
is obsolete,即它不再起作用。如果您想避免更改用户的 uid,一种简单的解决方法:打开终端,然后输入(替换
user
为要从登录屏幕隐藏的用户名):将以下内容添加到文件中:
切换用户或注销以测试是否
user
不再列出。编辑文件 /etc/gdm/gdm.schema 找到当前看起来像这样的部分:
并且要排除一个名为 qmail 的用户,例如将 qmail 添加到默认列表中,因此该部分看起来像这样。
这将阻止用户 qmail 出现在 gdm 问候语中。曾经有一个很好的 GUI 工具可以做到这一点,但在最近的几个版本中还没有出现在 Ubuntu 中。
另一种选择是将用户的 UID 设置为 1000 以下。这些被认为是系统帐户,也被排除在 GDM 问候语中。
哈克,但您可以修改用户的 id,这样它们就不会显示在列表中:
这是因为 id 低于 1000 的用户被认为是“系统”用户(即不是人类)。
我知道的唯一其他方法是完全隐藏列表:
详细说明Gilles对已接受答案的评论,这是我认为当前的“最佳实践”(Gnome 安全)方式来做到这一点。这一变化也将反映在 Gnome “Indicator Applet Session”中。
这种方法是GDM 网站上的文档中建议的一种方法,尽管该网站和 Gilles 都显示将“nobody”添加到排除项中,但我想确保很明显这实际上是必要的(尽管手册页或在线文档明确提供)。我已经在几个 10.10 系统上对此进行了测试,以验证可重复性。
我们需要做的就是对
/etc/gdm/custom.conf
. 大多数其他方法(更改 default.conf、gdm.conf 等)已被弃用。如果您有现有的
/etc/gdm/custom.conf
,请编辑该文件。否则,复制示例文件:在 的 [Greeter] 部分中
/etc/gdm/custom.conf
,添加:其中“user1”和“user2”是您不希望在 GDM“人脸浏览器”上显示的用户名或密码文件条目(例如,qmail、squid 等)。
注意:在我的 Gnome/GDM (2.30) 版本下,如果您没有在 Exclude 条目中列出“nobody”,那么您将看到一个虚假的登录用户
nobody
,而不是 user1 或 user2。NB#2:UID 低于 1000 的账户不显示是一个可配置的参数。默认情况下,该
MinimalUID
值设置为 1000。当且仅当IncludeAll=true
保留默认设置并且该Include
指令未更改为非空值时,GDM 欢迎程序会扫描 passwd 文件以查找 UID 大于 MinimalUID 的条目。然后显示 UID 高于 MinimalUID 且不在排除列表中的用户。我还没有测试反向设置,即
Include=user1,user2
在 custom.conf 中设置一个条目是否可以正常工作。它应该覆盖任何IncludeAll
设置,并且只显示明确列出的用户。这个周末我写了一个脚本(gdm-greeter)。它在 CentOS 6.2 上运行良好,我想知道它对 Ubuntu 是否有用?
我不得不同意这里最被接受的答案是接近的,但不是死的。
我只是自己解决了这个问题,我的答案是更改以下 gdm.schema 条目:
这样做的效果是所有用户列表都被禁用,如果我正确解释了原始问题,这实际上是 OP (gruszczy) 打算做的。这消除了制作一长串排除项的需要,因为无论 UID 编号如何,一旦更改此设置,所有用户 ID 都会被排除。我亲自将此设置应用于工作中的 3 个单独的 CentOS 6.2 服务器,这些服务器偶尔通过 RDP 上的 XDMCP(使用 xrdp > vnc-server > xinetd > gdm > gnome)访问,这允许我们一些经验不足的 Linux 管理员在这些服务器上工作培训最少的系统。
综上所述,虽然我确实同意没有经验的系统管理员应该从一开始就学习从个人帐户(可能具有 sudo 访问权限)而不是 root 工作,但如果您有正确使用该帐户的经验,那么没有害处在这样做。只要确保你事先知道你在做什么。对于我的其他系统管理员,我已经为所有这些系统添加了用于 Active Directory 支持的 CentrifyDC,并配置了系统,以便 AD-UserID 可用于桌面会话,同时维护用户的 AD 安全组权限。但就个人而言,由于我设计了所有这些服务器并且使用 Linux 已经超过 15 年,我认为使用 root 来加快速度并不重要。事实上,我倾向于在它所在的系统上启用 root s 已被禁用,以便我可以使用该帐户并直接完成任务。实际上,主要的事情就是养成在更改任何文件之前创建任何文件的备份副本的习惯。这将防止大多数事故发生,并允许您在执行会导致系统无法访问的编辑时恢复系统(只需启动到实时 CD 并修复需要修复的内容)。
恕我直言,我相信“永远不要以 root 身份登录”的口头禅实际上只是为了保护 n00bie 系统管理员免受自己的侵害。但是,如果您对 Linux 的掌握程度达到了可以在很短的时间内从任何 Linux 操作系统设计系统并且每次都能正常工作的程度,那么就没有理由过着“从不以 root 身份登录”的生活口头禅,因为到那时,您已经准备好承担使用该帐户所带来的责任。在使用 CentrifyDC 支持 AD 的环境中尤其如此,因为“root”成为本地系统管理员帐户并且(通常)自动启用。因此,我发现最好切入正题,将 root 帐户的密码设置作为我现在在任何部署中所做的首要任务之一。当然,我可以完成整个“以我自己的 ID 登录,然后 sudo up”,但我个人认为没有必要这样做。您自己的里程可能会有所不同...
在 /etc/passwd 中将用户登录 shell 更改为空字符串
例如,更改:
我重新启动了我的显示管理器并观察到此效果。
我花了数周时间才确定这是用户隐藏在显示管理器登录欢迎程序中的原因。很明显,/var/lib/AccountService/users 被 MDM 忽略了,并且假设 GDM 也是如此。我没有在 /etc/mdm/mdm.conf 中添加一个
Exclude=user1,user2
或一个Include=user3
下[greeter]
,或者创建一个 /etc/mdm/custom.conf,因为另一个框隐藏了通过useradd
就好了添加的用户,而用户添加了adduser
显示。将登录 shell 设置为 /bin/false 会拒绝该用户的所有登录,我仍然希望这样做。但是,如果您希望该用户完全无法访问,这也会将用户隐藏在登录屏幕中。这在 Zorin 16 上对我有用 - gdm3
取消注释 /etc/gdm3/greeter.dconf-defaults 中的 disable-user-list=true 行
然后