Gần đây tôi đã thêm một số người dùng mới, mà tôi cần cho qmail. Bây giờ chúng xuất hiện trong hộp trong màn hình đăng nhập và làm lộn xộn nó, và tôi phải cuộn để tìm người dùng của mình. Làm cách nào để ẩn những người dùng đó khỏi hộp đăng nhập?
Gần đây tôi đã thêm một số người dùng mới, mà tôi cần cho qmail. Bây giờ chúng xuất hiện trong hộp trong màn hình đăng nhập và làm lộn xộn nó, và tôi phải cuộn để tìm người dùng của mình. Làm cách nào để ẩn những người dùng đó khỏi hộp đăng nhập?
Câu trả lời:
Chỉnh sửa tệp /etc/gdm/gdm.schema tìm phần hiện tại trông như thế này:
<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>
Và để loại trừ người dùng được gọi là qmail, ví dụ, hãy thêm qmail vào danh sách mặc định để phần này trông như thế này.
<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>
Điều đó sẽ ngăn người dùng qmail xuất hiện trong phần chào của gdm. Đã từng có một công cụ GUI đẹp để làm điều này nhưng chưa có trong Ubuntu trong vài lần phát hành gần đây.
Cách khác là đặt UID của người dùng dưới 1000. Những tài khoản này được coi là tài khoản hệ thống được loại trừ trong lời chào GDM.
/etc/gdm/gdm.schema
. Thay vào đó, thêm hai dòng [greeter]
Exclude=nobody,qmail-foo,qmail-bar
vào /etc/gdm/custom.conf
. (Ngoài ra nobody
, các tên trong danh sách mặc định sẽ không xuất hiện vì dù sao thì uid của chúng là <1000.)
Ubuntu 12.04.04
, bạn có thể tư vấn?
Đối với 3.x GDM mới hơn, câu trả lời cũ không làm việc, trừ trường hợp này
Các greeter
thiết lập trong custom.conf
là lỗi thời , tức là nó sẽ không có tác dụng nữa. Một cách giải quyết dễ dàng nếu bạn muốn tránh thay đổi uid của người dùng:
Mở thiết bị đầu cuối và nhập (thay thế user
bằng tên người dùng bạn muốn ẩn khỏi màn hình đăng nhập):
sudo nano /var/lib/AccountsService/users/user
Thêm phần sau vào tập tin:
[User]
Language=
XSession=gnome
SystemAccount=true
Chuyển người dùng hoặc đăng xuất để kiểm tra nếu user
không được liệt kê nữa.
Hacky nhưng bạn có thể sửa đổi id người dùng để họ không hiển thị trong danh sách:
sudo usermod -u 999 <username>
Điều này hoạt động vì người dùng có id dưới 1000 được coi là người dùng "hệ thống" (tức là không phải con người).
Cách khác duy nhất tôi biết là ẩn danh sách hoàn toàn:
sudo -u gdm gconftool-2 --type bool --set /apps/gdm/simple-greeter/disable_user_list 'true'
usermod -u
Tùy chọn đó rất thú vị: nó tự động thay đổi uid trên thư mục chính và bộ đệm thư (nếu có) để khớp. Tuy nhiên, nó có thể phá vỡ quyền truy cập của họ vào bất kỳ tệp nào họ sở hữu bên ngoài thư mục chính của họ.
Xây dựng nhận xét của Gilles cho câu trả lời được chấp nhận, đây là điều tôi tin là "cách thực hành tốt nhất" hiện tại (an toàn Gnome) để làm điều này. Thay đổi này cũng sẽ được phản ánh trong "Phiên bản ứng dụng chỉ số" của Gnome.
Phương pháp này là một gợi ý trong các tài liệu tại trang web GDM , và mặc dù cả trang web và Gilles đều cho thấy việc thêm "không ai" vào loại trừ, tôi muốn chắc chắn rằng điều này thực sự cần thiết (mặc dù các trang này có gì hoặc tài liệu trực tuyến cung cấp rõ ràng). Tôi đã thử nghiệm điều này trên một vài hệ thống 10.10 để xác minh độ lặp lại.
Tất cả những gì chúng ta cần làm là thực hiện chỉnh sửa một dòng thành /etc/gdm/custom.conf
. Hầu hết các phương thức khác (thực hiện thay đổi đối với default.conf, gdm.conf, v.v.) đều không được chấp nhận.
Nếu bạn có sẵn /etc/gdm/custom.conf
, chỉnh sửa tập tin đó. Nếu không, sao chép tập tin ví dụ:
sudo cp /usr/share/doc/gdm/examples/custom.conf /etc/gdm/custom.conf
Trong phần [Greeter] của /etc/gdm/custom.conf
, thêm:
Exclude=user1,user2,nobody
Trong đó "user1" và "user2" là tên người dùng hoặc mục nhập tệp passwd (ví dụ: qmail, mực, v.v.) mà bạn không muốn hiển thị trên "trình duyệt khuôn mặt" GDM.
Lưu ý : Trong phiên bản Gnome / GDM của tôi (2.30), nếu bạn không có "không ai" được liệt kê trong mục Loại trừ, thì bạn sẽ có một người dùng đăng nhập không có thật nobody
xuất hiện thay vì user1 hoặc user2.
NB # 2 : Việc không hiển thị các tài khoản có UID dưới 1000 là thông số có thể định cấu hình. Theo mặc định, MinimalUID
giá trị được đặt thành 1000. Nếu và chỉ khi cài đặt mặc định IncludeAll=true
được đặt đúng vị trí và lệnh Include
không được thay đổi thành giá trị không trống, thì lời chào GDM có quét tệp passwd cho các mục có UID lớn hơn MinimalUID không. Người dùng có MinimalUID ở trên UID không có trong danh sách Loại trừ sẽ được hiển thị.
Tôi đã không kiểm tra xem cài đặt ngược, cụ thể là, thiết lập một Include=user1,user2
mục trong custom.conf sẽ hoạt động như được trình bày. Nó sẽ ghi đè bất kỳ IncludeAll
cài đặt nào và chỉ hiển thị người dùng được liệt kê rõ ràng.
Tôi đã viết một kịch bản (gdm-helloer) vào cuối tuần này. Nó hoạt động tốt trên CentOS 6.2, tôi tự hỏi liệu nó có hữu ích cho Ubuntu không?
#!/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
Tôi phải đồng ý rằng câu trả lời được chấp nhận nhiều nhất ở đây là gần, nhưng không chết.
Tôi chỉ tự mình giải quyết vấn đề này và câu trả lời cho tôi là thay đổi mục gdm.schema sau đây:
(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>
Ảnh hưởng của việc này là tất cả danh sách người dùng bị vô hiệu hóa, nếu tôi diễn giải chính xác câu hỏi ban đầu, thì thực sự đó là điều OP (gruszczy) đang có ý định làm. Điều này giúp loại bỏ sự cần thiết phải tạo ra một dòng dài loại trừ, vì tất cả các ID người dùng bất kể số UID được loại trừ bất kể khi cài đặt này bị thay đổi. Cá nhân tôi đã áp dụng cài đặt này cho 3 máy chủ CentOS 6.2 riêng biệt tại nơi làm việc đôi khi được truy cập qua XDMCP (sử dụng xrdp> vnc-server> xinetd> gdm> gnome) trên RDP, cho phép một số quản trị viên Linux ít kinh nghiệm của chúng tôi làm việc trên các hệ thống với đào tạo tối thiểu.
Tất cả những gì đã nói, trong khi tôi đồng ý rằng một sysadmin thiếu kinh nghiệm nên học từ đầu để làm việc từ tài khoản cá nhân (có thể với quyền truy cập sudo) chứ không phải là root, nếu bạn có kinh nghiệm làm việc với tài khoản đó đúng cách, sẽ không có hại làm như vậy. Chỉ cần chắc chắn rằng bạn biết những gì bạn đang làm trước khi ra tay. Trong trường hợp các hệ thống quản trị hệ thống khác của tôi, tôi đã thêm hỗ trợ CentrifyDC cho Active Directory cho tất cả các hệ thống này và định cấu hình các hệ thống để AD-UserID có thể được sử dụng cho các phiên trên máy tính để bàn trong khi duy trì quyền của Nhóm bảo mật AD của người dùng. Nhưng cá nhân tôi, vì tôi đã thiết kế tất cả các máy chủ này và đã sử dụng Linux hơn 15 năm nay, tôi nghĩ không có gì sử dụng root để tăng tốc mọi thứ. Trên thực tế, tôi có xu hướng kích hoạt root trên các hệ thống có nó ' s đã bị vô hiệu hóa để tôi có thể sử dụng tài khoản đó và cắt theo đuổi để hoàn thành công việc. Điều chính ở đó, thực sự, chỉ là tạo thói quen tạo một bản sao lưu của bất kỳ tập tin nào trước khi bạn thay đổi nó. Điều đó sẽ bảo vệ an toàn trước hầu hết các rủi ro và cho phép bạn khôi phục hệ thống nếu bạn thực hiện chỉnh sửa khiến hệ thống không thể truy cập được (chỉ cần khởi động vào đĩa CD trực tiếp và sửa chữa những gì cần khắc phục).
IMHO, tôi tin rằng câu thần chú 'không bao giờ đăng nhập với quyền root' thực sự chỉ ở đó để bảo vệ các sysadmin của n00bie khỏi chính họ. Nhưng nếu bạn đạt đến một mức độ năng lực với Linux đến mức bạn có thể thiết kế một hệ thống từ bất kỳ HĐH Linux nào trong một khoảng thời gian rất ngắn và nó hoạt động mọi lúc, thì không có lý do gì để sống theo 'không bao giờ đăng nhập như root' thần chú bởi vì vào thời điểm đó, bạn đã sẵn sàng để xử lý trách nhiệm đi kèm với việc sử dụng tài khoản đó. Điều này đặc biệt đúng trong các môi trường sử dụng CentrifyDC để hỗ trợ AD, vì 'root' trở thành tài khoản sysadmin cục bộ và (thường) được bật tự động. Vì vậy, tôi thấy tốt nhất nên cắt theo đuổi và thực hiện cài đặt mật khẩu của tài khoản root là một trong những nhiệm vụ đầu tiên tôi làm trong bất kỳ triển khai nào hiện nay. Chắc chắn rồi, Tôi có thể thực hiện toàn bộ 'đăng nhập dưới dạng ID của riêng mình, sau đó sudo lên', nhưng cá nhân tôi không cảm thấy cần phải làm theo cách đó. Số dặm của bạn có thể thay đổi ...
Ví dụ: thay đổi:
# Change
example:x:2001:2001:Example User,,,:/home/example:/bin/bash
# To
example:x:2001:2001:Example User,,,:/home/example:
Tôi khởi động lại trình quản lý hiển thị của mình và quan sát thấy hiệu quả này.
sudo service lightdm restart
# (or gdm, mdm, ...)
Tôi đã mất nhiều tuần để xác định đây là lý do tại sao người dùng bị ẩn trong trình chào đăng nhập của trình quản lý hiển thị. Rõ ràng là / var / lib / AccountService / người dùng đang bị MDM bỏ qua và cũng giả sử là GDM. Tôi đã không đi xa đến mức thêm Exclude=user1,user2
hoặc Include=user3
dưới [greeter]
/etc/mdm/mdm.conf hoặc tạo /etc/mdm/custom.conf, vì một hộp khác đã ẩn người dùng được thêm vào useradd
chỉ trong khi người dùng vẫn ổn thêm với adduser
đã được hiển thị. Đặt shell đăng nhập thành / bin / false từ chối tất cả thông tin đăng nhập cho người dùng đó, mà tôi vẫn muốn su là. Nhưng điều đó cũng ẩn người dùng trong màn hình đăng nhập nếu bạn muốn người dùng đó không thể truy cập được.
Exclude=foobar
vào/etc/gdm/gdm.conf
công việc, bạn đã thử chưa?