如何在gdm登录屏幕中更改用户顺序?

我是使用gdm系统唯一频繁用户,但在登录屏幕的用户列表中,我没有因为最频繁使用而向上移动,并且我找不到手动排序用户的可能性。 我确认它们不按数值UID排序。相同的问题已经在此处(和另一个相关的here)得到回答,但是针对的是使用consolekit的旧系统,该系统已被systemd-logind和AccountsService替换。
3个回答

last命令会列出系统上过去成功的登录记录。这些信息存储在/var/log/wtmp文件中,并且从版本3.17.2开始,gdm使用它来对用户列表进行排序。

如果您删除/var/log/wtmp文件然后重新启动,用户列表将恢复为按字母顺序排序。在下一次登录后,您的用户将成为最常用的用户,因此会出现在列表的顶部。

注意:如果您删除/var/log/wtmp文件,将丢失系统的登录历史记录。您可能希望创建该文件的备份。

已在Ubuntu Desktop 20.04.3和21.04中测试通过


1有趣。但是如果azrdev已经是最常用的,为什么他不会首先列出来呢? - sancho.s ReinstateMonicaCellio
3我认为有必要运行last命令并查看输出,以检查发生了什么。也许另一个用户在过去登录了很多次,并且仍然处于最前面,或者可能是因为某种原因导致/var/log/wtmp文件被锁定或未更新。 - Alejandro

借鉴Alejandro的回答,如果您不想删除/var/log/wtmp文件,您可以运行一个脚本通过使用login和expect命令来“操纵结果”,以确保特定的排序顺序。
以下是具体操作步骤:
  1. 打开终端(如果还没有打开)
  2. (如果需要)安装 expect
  3. sudo apt install expect
    
  4. 切换到超级用户并进入 /root 目录,以保持整洁:
  5. sudo su 
    cd ~
    
  6. 创建一个登录给定账户的脚本。在本例中,我们将其称为 logins.sh(但您可以根据需要自行命名):
  7. vi logins.sh
    
  8. 将以下内容粘贴到新文件中:
  9. #!/usr/bin/expect
    
    set timeout 10
    
    set user [lindex $argv 0]
    
    set password [lindex $argv 1]
    
    spawn login $user
    
    expect "Password:"
    
    send "$password\r"
    
    expect "$user@{hostname}:~$"
    
    send "exit\r"
    
    interact
    

    注意:请确保将 {hostname} 替换为您计算机的主机名。

    保存文件并退出。

  10. 将文件设置为可执行:
  11. chmod +x logins.sh
    
  12. 进行测试:
  13. ./logins.sh nozomi superSecretPassword\!123
    

    注意:除非您与我的狗同名,否则请确保将 nozomi 替换为正确的账户名,将 superSecretPassword\!123 替换为正确的密码。如果您的密码包含 bash 可能误解的字符(例如 !),请使用 \ 进行转义。

    如果一切正常,您将看到指定的账户已登录,并在大约 8~10 秒后自动退出。

  14. 验证是否向 /var/log/wtmp 添加了记录:
  15. last
    

    您应该会看到类似下面的内容:

    $ last
    nozomi   pts/1                         Thu Sep  9 00:38 - 00:39  (00:00)
    
  16. 运行脚本数十、数百或数千次:
  17. for i in {1 .. 999}; do /root/logins.sh nozomi superSecretPassword\!123; done
    

    注意:请确保将 999 替换为您希望脚本运行的次数。请注意,该数字应大于零,并且每次运行将需要约 10 秒钟才能完成。还请确保将用户名和密码替换为您希望在顶部设置的账户。

  18. 如果您希望在靠前但不是最靠前的位置添加其他账户,请再次运行第 8 步中的命令,但在 for 循环中减少运行次数。请注意,每分钟大约可运行 6 次,1000 次运行将需要约 2 小时 45 分钟的时间才能完成。您可能希望在夜间运行此操作。
  19. (可选)考虑修改脚本以运行多个账户,并安排其每天或每周运行一次。

这在原始的Ubuntu 20.04 LTS和21.04上进行了测试,但应该适用于从(至少)18.04开始的每个版本的Ubuntu。


不错的技巧!SSH登录是否也会触发gdm逻辑?因为它们会出现在last输出中(即/var/log/wtmp),所以您可以设置公钥登录(~/.ssh/authorized_keys),并使用for i in $(seq 1000); do ssh nozomi@localhost date ; done来做同样的事情,更简单一些。 - azrdev
1另一个@matigo:请不要将密码作为命令行参数,也不要告诉其他人这样做:它们可以被/proc/$PID/cmdline中的每个其他本地用户阅读,并且也会被写入您的shell历史记录。 - azrdev
是的,使用last命令可以查看SSH登录记录(包括源IP)。您的建议确实可以节省一点输入。 - matigo

可能的原因是,您的可能配置为不包括所有用户。

这种行为过去是在/etc/gdm3/custom.conf中的[greeter]部分(Include=)中配置的 - 但是现在似乎不再起作用(请参见gdm忽略/etc/gdm/custom.conf排除用户列表)。

可能是因为用户azrdev被GDM3视为系统帐户,因此根本不会显示在用户列表中,或者系统帐户被错误地分类为非系统帐户,因此排在列表的顶部。

如果是这种情况,您可以添加一个名为/var/lib/AccountsService/users/username的文件,并更改其值。

[User]
SystemAccount=true

从GDM登录界面中删除该用户。