Làm cách nào để ẩn người dùng khỏi màn hình đăng nhập GDM?


64

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?


Tôi không biết liệu việc nối thêm Exclude=foobarvào /etc/gdm/gdm.confcông việc, bạn đã thử chưa?
Umang

câu hỏi hay, câu trả lời có thể đã lỗi thời (theo thảo luận về meta).
Thufir

Câu trả lời:


30

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.


afaik, công cụ GUI không hoạt động nữa, do thực tế là GDM đã chuyển từ các tệp văn bản mặt phẳng cho cấu hình của nó sang các lược đồ Gconf.
LassePoulsen

Cảm ơn các Lab thông tin. Tôi đã nhận thấy trong vài bản phát hành gần đây, một số công cụ GUI đã bị mất vì những lý do tương tự.
Richard Holloway

29
Thật ra, tôi không nghĩ bạn nên sửa đổi /etc/gdm/gdm.schema. Thay vào đó, thêm hai dòng [greeter] Exclude=nobody,qmail-foo,qmail-barvà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.)
Gilles 'SO- ngừng trở nên xấu xa'

3
Thông thường bạn nên sử dụng uids dưới 1000 cho việc này.
txwikinger

@RichardHolloway Không thể tìm thấy tập tin như vậy trong Ubuntu 12.04.04, bạn có thể tư vấn?
gotqn

56

Đố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 greeterthiết lập trong custom.conflỗ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:

  1. Mở thiết bị đầu cuối và nhập (thay thế userbằ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
    
  2. Thêm phần sau vào tập tin:

    [User]  
    Language=   
    XSession=gnome  
    SystemAccount=true  
    
  3. Chuyển người dùng hoặc đăng xuất để kiểm tra nếu userkhông được liệt kê nữa.


1
Thật vậy, đây là những gì tôi đã làm sau khi đọc tài liệu Arch . Câu trả lời này nên được nêu lên để mọi người nhìn thấy nó sớm hơn và tiết kiệm thời gian.
Stefan van den Akker

có vẻ như là cách thích hợp hơn là thao túng UID
xuma202

1
Tuyệt vời! Điều này giúp giải quyết vấn đề của người dùng có uids dưới 1000 được ẩn trên màn hình đăng nhập.
biocyberman

1
Sự phân nhánh của việc tạo người dùng thành Tài khoản hệ thống là gì?
Jistanidiot

2
Điều này làm việc cho tôi, nhưng tôi phải khởi động lại để thay đổi có hiệu lực.
benjer3

13

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'

3
Không có thứ gọi là "cấp độ người dùng", đó là id của người dùng.
João Pinto

6
usermod -uTù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ọ.
poolie

Để ẩn danh sách hoàn toàn, bạn cũng có thể chạy gdmsetup và sử dụng hộp kiểm.
belacqua

11

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 nobodyxuấ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, MinimalUIDgiá 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 Includekhô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,user2mục trong custom.conf sẽ hoạt động như được trình bày. Nó sẽ ghi đè bất kỳ IncludeAllcài đặt nào và chỉ hiển thị người dùng được liệt kê rõ ràng.


+1 để tham khảo trang web của GDM và vì điều này hiệu quả với tôi.
Aaron

Không hoạt động nữa trên các phiên bản mới hơn của GDM.
Stefan van den Akker

2

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

2

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 ...


0

Thay đổi vỏ đăng nhập người dùng thành một chuỗi trống trong / etc / passwd

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,user2hoặc Include=user3dướ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 useraddchỉ 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.