为什么需要这份教程

在开始配置之前,让我们先了解一下你可能遇到的困境。

一个令人沮丧的场景

想象一下这个场景:你在公司或学校有一台 Ubuntu 桌面机器,希望下班后或在家时能远程访问它。你兴冲冲地配置好了远程桌面共享,设置了一个好记的密码,又开启了自动登录(这样重启后不用跑到机器前输入密码)。

一切看起来完美——直到你第一次重启机器,打开 Windows 的远程桌面连接,输入你设置的密码……

“用户名或密码不正确”

你确信没有输错,于是跑到机器前查看远程桌面设置,发现密码变成了一串随机字符!你重新设置密码,这次记得更牢,回到座位测试——成功了。

然后第二天,机器因为某种原因重启了,密码又变了……

这不是 Bug,而是”特性”

如果你搜索这个问题,会发现很多人都遇到过。这并不是 Ubuntu 的 Bug,而是 GNOME 安全机制的”副作用”。简单来说:

  • 远程桌面密码存储在一个叫做”密钥环”(Keyring) 的加密保险箱里
  • 密钥环的钥匙就是你的登录密码
  • 自动登录跳过了输入密码的步骤,所以密钥环没有被解锁
  • 远程桌面服务发现打不开保险箱,就只好临时生成一个随机密码

这是一个安全与便利之间的冲突。GNOME 的设计者认为:如果你选择了自动登录(牺牲了一定的安全性),那么敏感信息(如远程桌面密码)就不应该自动暴露。

但对于我们这些在局域网内使用、主要追求便利性的用户来说,这个”保护”反而成了障碍。

本教程将帮你实现

通过本教程,你将获得以下体验:

  • 开机即用:系统启动后自动进入桌面,无需站在机器前输入密码
  • 密码固定:远程桌面使用你设置的固定密码,不再随机变化
  • 随时连接:从任何支持 RDP 的设备(Windows、macOS、手机)远程访问
  • 最小侵入:方案不修改任何系统配置,不影响其他软件,完全可逆

技术架构概览

我们的解决方案原理很简单:既然密钥环需要密码才能解锁,那就让系统启动后自动输入密码来解锁它。

1
2
3
4
5
6
7
8
9
10
11
12
13
开机启动

GDM 自动登录 → GNOME 桌面加载

systemd 检测到桌面就绪

触发我们的解锁服务

脚本读取保存的密码 → 解锁密钥环

重启远程桌面服务 → 读取正确的凭据

✓ 远程桌面使用固定密码

整个过程在开机后几秒内自动完成,你完全感知不到。

本教程适用场景

本教程专为以下情况设计:

  • 你的 Ubuntu 机器在局域网内,安全性要求不高
  • 你希望无人值守运行,能够随时远程访问
  • 你已经或计划开启自动登录功能
  • 你受够了每次重启后密码随机变化的问题

重要提示:本方案需要将你的登录密码以明文形式保存在文件中。虽然文件权限设置为仅所有者可读,但如果你的机器可能被他人物理接触,请谨慎考虑。对于局域网内的个人机器,这通常不是问题。


实际环境说明

本教程基于以下实际环境编写和验证,你可以根据自己的情况调整:

项目 本教程环境 说明
操作系统 Ubuntu 24.04 LTS 也适用于其他使用 GNOME 的发行版
桌面环境 GNOME 46 其他版本步骤类似
用户名 cpu 替换为你的实际用户名
用户密码 cpu 替换为你的实际密码
远程桌面协议 RDP (端口 3389) Ubuntu 24.04 默认使用
测试客户端 Windows 11 远程桌面连接 任何 RDP 客户端均可

占位符说明:本教程中的 cpu 是示例用户名和密码,请在实际操作时替换为你自己的。


第一部分:理解问题

在动手之前,让我们先深入理解问题的本质。这不仅有助于你理解后续的解决方案,也能在遇到类似问题时举一反三。

什么是 GNOME 密钥环

GNOME 密钥环(Keyring)是一个安全的密码存储系统,你可以把它想象成一个加密的保险箱。很多应用程序会把敏感信息存放在这里:

  • WiFi 密码
  • 浏览器保存的网站密码
  • 邮件客户端的账户密码
  • 远程桌面的连接凭据

这个保险箱有一把”主钥匙”,默认情况下就是你的登录密码。当你正常登录系统时(输入密码),这把钥匙就会自动打开保险箱,各个应用程序就能读取自己存放的信息。

为什么自动登录会出问题

当你开启自动登录后,登录过程变成了这样:

  1. 系统启动,GDM(登录管理器)检测到自动登录配置
  2. GDM 直接启动你的 GNOME 会话,不询问密码
  3. 密钥环没有收到密码,保持锁定状态
  4. 远程桌面服务启动,尝试从密钥环读取凭据
  5. 密钥环说:”抱歉,我是锁着的,给不了你”
  6. 远程桌面服务只好生成一个随机密码

这就是问题的根源:没有密码输入,就没有钥匙来开锁

查看问题的证据

如果你想亲眼看到这个问题,可以在自动登录后执行以下命令:

1
journalctl --user -u gnome-remote-desktop.service --no-pager -n 20

你很可能会看到类似这样的错误信息:

1
[RDP] Couldn't retrieve RDP credentials: The name :1.4 was not provided by any .service files

这就是远程桌面服务在抱怨:”我找不到凭据!”


第二部分:解决方案设计

理解了问题,解决方案就呼之欲出了:我们需要在自动登录后,自动提供密码来解锁密钥环

方案对比

在确定最终方案之前,我们考虑了几种可能的解决方法:

方案 做法 优点 缺点
取消密钥环加密 将密钥环密码设为空 简单直接 Chrome/Edge/VS Code 会频繁弹窗要求创建安全存储
创建专用密钥环 为远程桌面单独创建无密码的密钥环 隔离影响 GNOME 可能不遵循设置,可靠性差
启动脚本解锁 开机后用脚本自动输入密码解锁 对系统无侵入,完全可逆 需要明文保存密码

为什么选择启动脚本方案

我们最终选择了启动脚本方案,原因如下:

  1. 零侵入:不修改任何系统文件或配置
  2. 完全可逆:删除我们创建的 3 个文件即可恢复原状
  3. 对其他软件无影响:密钥环解锁后,一切如常,Chrome 等软件正常工作
  4. 可靠性高:使用 systemd 标准机制,有日志可查

唯一的代价是需要将密码保存在文件中。考虑到这是局域网内的个人机器,这个代价是可以接受的。

方案工作流程

我们的方案包含三个组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌─────────────────────────────────────────────────────────────┐
│ ~/.local/share/keyring-unlock/.password │
│ ↑ 存储你的登录密码(权限 600,仅自己可读) │
└─────────────────────────────────────────────────────────────┘
↓ 读取
┌─────────────────────────────────────────────────────────────┐
│ ~/.local/bin/unlock-keyring.sh │
│ ↑ 解锁脚本:等待密钥环就绪 → 解锁 → 重启远程桌面服务 │
└─────────────────────────────────────────────────────────────┘
↑ 执行
┌─────────────────────────────────────────────────────────────┐
│ ~/.config/systemd/user/unlock-keyring.service │
│ ↑ systemd 服务:在 GNOME 会话初始化后自动触发脚本 │
└─────────────────────────────────────────────────────────────┘

现在,让我们开始动手实现。


第三部分:前置准备

在开始配置之前,请确保已完成以下准备工作。

确认自动登录已开启

打开「设置」应用,导航到「系统 → 用户」,确认「自动登录」开关已开启。

如果还没开启,点击「解锁」按钮,输入密码后开启它。

确认远程桌面已配置

打开「设置」应用,导航到「系统 → 远程桌面」:

  1. 确认「远程桌面」开关已开启
  2. 确认「远程控制」开关已开启
  3. 在「如何连接」部分,记下你设置的用户名密码

这里设置的用户名和密码,就是你希望用于远程连接的固定凭据。

确认问题存在

重启系统后,执行以下命令检查当前的远程桌面凭据:

1
grdctl status --show-credentials

如果显示的密码与你设置的不同(变成了随机字符串),说明问题确实存在,可以继续本教程。


第四部分:详细配置步骤

接下来是具体的配置步骤。每一步都只包含一个操作,并附有详细解释和预期结果,方便你逐步验证。

步骤 1:创建脚本目录

首先,创建用于存放解锁脚本的目录。

1
mkdir -p ~/.local/bin

命令解释

  • mkdir:创建目录的命令(make directory)
  • -p:如果目录已存在则不报错,如果父目录不存在则一并创建
  • ~/.local/bin:用户级别的可执行文件目录,这是 Linux 标准目录结构的一部分

预期结果:命令执行后没有任何输出,表示成功。

验证方法

1
ls -la ~/.local/bin

应该看到类似这样的输出:

1
2
3
总计 8
drwxrwxr-x 2 cpu cpu 4096 12月 24 10:00 .
drwxr-xr-x 4 cpu cpu 4096 12月 24 10:00 ..

步骤 2:创建密码存储目录

创建专门用于存放密钥环解锁密码的目录。

1
mkdir -p ~/.local/share/keyring-unlock

命令解释

  • ~/.local/share/:用户数据目录,符合 XDG 基础目录规范
  • keyring-unlock:我们自定义的目录名,专门存放密钥环解锁相关的文件

预期结果:没有输出表示成功。


步骤 3:创建 systemd 服务目录

创建用于存放 systemd 用户服务配置的目录。

1
mkdir -p ~/.config/systemd/user

命令解释

  • ~/.config/systemd/user/:systemd 用户级服务的标准配置目录
  • 放在这个目录下的 .service 文件会被 systemctl --user 命令识别和管理

预期结果:没有输出表示成功。


步骤 4:创建密码文件

将你的登录密码保存到文件中。这是解锁密钥环所需的”钥匙”。

1
echo -n "你的登录密码" > ~/.local/share/keyring-unlock/.password

命令解释

  • echo:输出文本的命令
  • -n:不在末尾添加换行符(非常重要,多余的换行会导致密码错误)
  • "你的登录密码":替换为你的实际登录密码
  • >:重定向符号,将输出写入文件
  • .password:文件名以点开头,表示这是一个隐藏文件

实际示例(假设你的密码是 cpu):

1
echo -n "cpu" > ~/.local/share/keyring-unlock/.password

预期结果:没有输出表示成功。

验证方法

1
cat ~/.local/share/keyring-unlock/.password

应该直接显示你的密码,没有换行:

1
cpu

如果密码后面有空行,说明你没有使用 -n 参数,需要重新执行命令。


步骤 5:设置密码文件权限

将密码文件的权限设置为仅所有者可读写,防止其他用户读取。

1
chmod 600 ~/.local/share/keyring-unlock/.password

命令解释

  • chmod:修改文件权限的命令(change mode)
  • 600:权限数字,每一位代表一类用户的权限
    • 第一个 6(所有者)= 读(4) + 写(2) = 可读可写
    • 第二个 0(同组用户)= 无任何权限
    • 第三个 0(其他用户)= 无任何权限

预期结果:没有输出表示成功。

验证方法

1
ls -la ~/.local/share/keyring-unlock/.password

应该看到权限是 -rw-------

1
-rw------- 1 cpu cpu 3 12月 24 10:00 .password

步骤 6:创建解锁脚本

现在创建核心的解锁脚本。这个脚本会在系统启动后自动执行,负责解锁密钥环并重启远程桌面服务。

1
nano ~/.local/bin/unlock-keyring.sh

命令解释

  • nano:一个简单易用的文本编辑器
  • 如果你更喜欢其他编辑器,可以使用 gedit(图形界面)或 vim

在编辑器中,输入以下完整内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash
#
# 自动解锁 GNOME 密钥环脚本
# 用于配合自动登录,确保远程桌面密码不会随机变化
#
# 创建时间: 2024-12-24
# 用途: 在 GNOME 自动登录后解锁 Login 密钥环,并重启远程桌面服务
#

set -euo pipefail

PASSWORD_FILE="$HOME/.local/share/keyring-unlock/.password"
LOG_TAG="unlock-keyring"
MAX_WAIT_SECONDS=30
CHECK_INTERVAL=1

log_info() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1"
logger -t "$LOG_TAG" "INFO: $1" 2>/dev/null || true
}

log_error() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" >&2
logger -t "$LOG_TAG" "ERROR: $1" 2>/dev/null || true
}

# 检查 gnome-keyring-daemon 是否在运行
check_keyring_daemon() {
pgrep -u "$(whoami)" -f "gnome-keyring-da" > /dev/null 2>&1
}

# 检查密码文件是否存在
if [[ ! -f "$PASSWORD_FILE" ]]; then
log_error "密码文件不存在: $PASSWORD_FILE"
exit 1
fi

# 读取密码
PASSWORD=$(cat "$PASSWORD_FILE")
if [[ -z "$PASSWORD" ]]; then
log_error "密码文件为空"
exit 1
fi

log_info "开始等待 gnome-keyring-daemon 就绪..."

# 等待 gnome-keyring-daemon 启动
waited=0
while ! check_keyring_daemon; do
if [[ $waited -ge $MAX_WAIT_SECONDS ]]; then
log_error "等待 gnome-keyring-daemon 超时 (${MAX_WAIT_SECONDS}秒)"
exit 1
fi
sleep $CHECK_INTERVAL
waited=$((waited + CHECK_INTERVAL))
done

log_info "gnome-keyring-daemon 已就绪,等待了 ${waited} 秒"

# 额外等待确保密钥环完全初始化
sleep 2

# 解锁密钥环
log_info "正在解锁 Login 密钥环..."

unlock_success=false

if echo -n "$PASSWORD" | gnome-keyring-daemon --replace --unlock > /dev/null 2>&1; then
log_info "密钥环解锁成功"
unlock_success=true
else
log_error "密钥环解锁失败,尝试备用方法..."

# 备用方法:使用 --login 参数
if echo -n "$PASSWORD" | gnome-keyring-daemon --login > /dev/null 2>&1; then
log_info "密钥环解锁成功 (备用方法)"
unlock_success=true
else
log_error "所有解锁方法均失败"
exit 1
fi
fi

# 解锁成功后,重启 gnome-remote-desktop 服务以重新读取凭据
if [[ "$unlock_success" == "true" ]]; then
log_info "等待密钥环稳定..."
sleep 2

log_info "重启 gnome-remote-desktop 服务以加载凭据..."
if systemctl --user restart gnome-remote-desktop.service 2>/dev/null; then
log_info "gnome-remote-desktop 服务重启成功"
else
log_error "gnome-remote-desktop 服务重启失败,尝试 start..."
systemctl --user start gnome-remote-desktop.service 2>/dev/null || true
fi

# 等待服务启动
sleep 2

# 验证服务状态
if systemctl --user is-active gnome-remote-desktop.service > /dev/null 2>&1; then
log_info "gnome-remote-desktop 服务运行正常"
else
log_error "gnome-remote-desktop 服务未运行"
fi
fi

log_info "全部完成"
exit 0

保存并退出

  • 如果使用 nano:按 Ctrl+O 保存,按 Enter 确认文件名,按 Ctrl+X 退出
  • 如果使用 gedit:按 Ctrl+S 保存,然后关闭窗口

脚本功能说明

功能 说明
智能等待 循环检测密钥环守护进程是否就绪,最多等待 30 秒
双重保险 主方法失败后自动尝试备用解锁方法
日志记录 所有操作都记录到 systemd 日志,便于排查问题
服务重启 解锁成功后重启远程桌面服务,确保它能读取正确的凭据

💡 为什么要重启 gnome-remote-desktop 服务?

这是整个方案的关键步骤。原因如下:

  1. 服务启动时机问题gnome-remote-desktop 服务在 GNOME 会话启动时就已经运行,此时密钥环尚未解锁,服务无法读取你设置的固定凭据,只能使用随机生成的临时密码。

  2. 重启后重新读取凭据:当我们解锁密钥环后,必须重启该服务,让它重新从已解锁的密钥环中读取你设置的用户名和密码。

潜在影响

  • 如果此时有活跃的远程桌面连接,该连接会被短暂中断(约 2-3 秒)
  • 中断后客户端通常会自动重连,或者你需要手动重新连接
  • 这种情况只在系统刚启动时发生一次,日常使用中不会再触发

步骤 7:设置脚本执行权限

脚本文件默认没有执行权限,需要手动添加。

1
chmod +x ~/.local/bin/unlock-keyring.sh

命令解释

  • chmod +x:添加可执行权限
  • 没有这个权限,脚本将无法被执行

预期结果:没有输出表示成功。

验证方法

1
ls -la ~/.local/bin/unlock-keyring.sh

应该看到权限中包含 x(可执行):

1
-rwxrwxr-x 1 cpu cpu 2547 12月 24 10:00 unlock-keyring.sh

步骤 8:创建 systemd 服务文件

创建 systemd 服务配置,让系统在启动时自动执行我们的解锁脚本。

1
nano ~/.config/systemd/user/unlock-keyring.service

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Unit]
Description=Unlock GNOME Keyring for auto-login
Documentation=man:gnome-keyring-daemon(1)
# 在 GNOME 会话初始化完成后启动
After=gnome-session-initialized.target
After=gnome-keyring-daemon.service
# 确保 graphical session 存在
Requires=graphical-session.target
After=graphical-session.target

[Service]
Type=oneshot
ExecStart=%h/.local/bin/unlock-keyring.sh
RemainAfterExit=yes
# 失败时不重启,避免死循环
Restart=no
# 超时设置
TimeoutStartSec=60

[Install]
WantedBy=gnome-session-initialized.target

保存并退出

配置说明

配置项 含义
After=gnome-session-initialized.target 等待 GNOME 会话完全初始化后再执行
Type=oneshot 这是一次性任务,执行完就结束
%h systemd 变量,自动替换为用户的家目录
RemainAfterExit=yes 脚本退出后服务仍标记为”活动”状态
WantedBy=gnome-session-initialized.target 随 GNOME 会话自动启动

步骤 9:重新加载 systemd 配置

让 systemd 识别我们新创建的服务文件。

1
systemctl --user daemon-reload

命令解释

  • systemctl --user:操作用户级别的 systemd 服务(不是系统级别的)
  • daemon-reload:重新扫描并加载所有服务配置文件

预期结果:没有输出表示成功。


步骤 10:启用服务

设置服务开机自动启动。

1
systemctl --user enable unlock-keyring.service

命令解释

  • enable:启用服务,创建必要的符号链接,使其随指定目标自动启动

预期结果

1
Created symlink /home/cpu/.config/systemd/user/gnome-session-initialized.target.wants/unlock-keyring.service → /home/cpu/.config/systemd/user/unlock-keyring.service.

这表示服务已成功配置为开机自启动。


步骤 11:手动测试脚本

在重启之前,让我们先手动测试一下脚本是否能正常工作。

1
~/.local/bin/unlock-keyring.sh

预期输出

1
2
3
4
5
6
7
8
9
[2025-12-24 10:00:00] INFO: 开始等待 gnome-keyring-daemon 就绪...
[2025-12-24 10:00:00] INFO: gnome-keyring-daemon 已就绪,等待了 0 秒
[2025-12-24 10:00:02] INFO: 正在解锁 Login 密钥环...
[2025-12-24 10:00:02] INFO: 密钥环解锁成功
[2025-12-24 10:00:02] INFO: 等待密钥环稳定...
[2025-12-24 10:00:04] INFO: 重启 gnome-remote-desktop 服务以加载凭据...
[2025-12-24 10:00:04] INFO: gnome-remote-desktop 服务重启成功
[2025-12-24 10:00:06] INFO: gnome-remote-desktop 服务运行正常
[2025-12-24 10:00:06] INFO: 全部完成

看到”密钥环解锁成功”和”服务运行正常”就说明脚本工作正常。


步骤 12:验证远程桌面凭据

确认远程桌面服务现在能正确读取凭据了。

1
grdctl status --show-credentials

命令解释

  • grdctl:GNOME 远程桌面的命令行配置工具
  • status --show-credentials:显示当前状态,包括用户名和密码

预期输出

1
2
3
4
5
6
7
8
9
10
11
12
Overall:
Unit status: active
RDP:
Status: enabled
Port: 3389
TLS certificate: /home/cpu/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt
TLS fingerprint: xx:xx:xx:...
TLS key: /home/cpu/.local/share/gnome-remote-desktop/certificates/rdp-tls.key
View-only: no
Negotiate port: yes
Username: cpu
Password: cpu

关键确认UsernamePassword 应该是你之前在设置中配置的值,而不是随机字符串。


步骤 13:重启系统并验证

现在是最终验证的时刻。重启系统:

1
sudo reboot

重启后,系统应该:

  1. 自动登录到 GNOME 桌面
  2. 我们的解锁服务自动运行
  3. 密钥环被解锁
  4. 远程桌面服务使用正确的凭据

第五部分:完整验证清单

重启后,请按以下步骤逐一验证配置是否成功。

验证 1:检查解锁服务状态

1
systemctl --user status unlock-keyring.service

预期结果

1
2
3
● unlock-keyring.service - Unlock GNOME Keyring for auto-login
Loaded: loaded (/home/cpu/.config/systemd/user/unlock-keyring.service; enabled; preset: enabled)
Active: active (exited) since ...

关键是看到 Active: active (exited),表示服务已成功执行完毕。

验证 2:查看解锁日志

1
journalctl --user -t unlock-keyring --no-pager

预期结果:应该看到从”开始等待”到”全部完成”的完整日志,没有错误信息。

验证 3:检查远程桌面服务

1
systemctl --user status gnome-remote-desktop.service

预期结果:服务状态为 active (running),日志中有 RDP server started 且没有错误。

验证 4:确认凭据正确

1
grdctl status --show-credentials

预期结果:显示你设置的固定用户名和密码。

验证 5:从 Windows 远程连接

这是最终的实际验证:

  1. 在 Windows 上按 Win+R,输入 mstsc 并回车
  2. 在”计算机”框中输入 Ubuntu 的 IP 地址(如 192.168.5.6
  3. 点击”连接”
  4. 输入你设置的用户名和密码
  5. 成功进入 Ubuntu 桌面!

恭喜! 如果你能成功连接,说明配置完全成功。


第六部分:系统影响说明

为了便于日后维护和问题追溯,这里详细记录本方案对系统的所有影响。

新增文件清单

本方案总共创建了 3 个文件,全部位于用户目录下:

文件路径 用途 权限 内容敏感度
~/.local/share/keyring-unlock/.password 存储登录密码 600 (明文密码)
~/.local/bin/unlock-keyring.sh 解锁脚本 755
~/.config/systemd/user/unlock-keyring.service 服务配置 644

自动创建的符号链接

启用服务时,systemd 会自动创建一个符号链接:

1
2
~/.config/systemd/user/gnome-session-initialized.target.wants/unlock-keyring.service
→ ~/.config/systemd/user/unlock-keyring.service

进程影响

  • 每次开机后,脚本会调用 gnome-keyring-daemon --replace --unlock,这会启动一个新的密钥环守护进程替换原有的
  • 这是正常且预期的行为,不会影响系统稳定性

对其他软件的影响

软件 影响
Google Chrome ✅ 无影响,密码管理正常
Microsoft Edge ✅ 无影响,密码管理正常
VS Code ✅ 无影响,设置同步正常
WiFi ✅ 无影响,自动连接正常
其他使用密钥环的应用 ✅ 无影响,因为密钥环已被正确解锁

这正是选择此方案的主要原因:解锁后的系统状态与正常登录完全一致


第七部分:日常维护

修改登录密码后的操作

⚠️ 重要提醒:如果你修改了系统登录密码,必须同步更新密码文件,否则下次重启后会出现以下问题:

  • 密钥环解锁时使用错误密码不会报错,但会导致远程桌面凭据变为 (null)
  • 远程桌面连接将失败,显示”用户名或密码不正确”

由于 Linux PAM 的技术限制,无法实现密码自动同步,必须手动更新。

修改密码后,请立即执行以下命令更新密码文件:

1
echo -n "新密码" > ~/.local/share/keyring-unlock/.password

验证更新是否成功

1
2
cat ~/.local/share/keyring-unlock/.password
# 应该显示你的新密码

修改远程桌面密码

直接在「设置 → 系统 → 远程桌面」中修改即可,不需要额外操作。新密码会自动保存到密钥环中。

查看服务日志

排查问题时,可以查看详细日志:

1
2
3
4
5
# 查看解锁服务的日志
journalctl --user -t unlock-keyring --no-pager

# 查看远程桌面服务的日志
journalctl --user -u gnome-remote-desktop.service --no-pager -n 50

临时禁用服务

如果需要临时禁用自动解锁(例如调试其他问题):

1
systemctl --user disable unlock-keyring.service

重新启用:

1
systemctl --user enable unlock-keyring.service

第八部分:常见问题处理

问题 1:重启后仍无法连接

排查步骤

  1. 检查解锁服务是否执行成功:

    1
    systemctl --user status unlock-keyring.service
  2. 查看解锁日志是否有错误:

    1
    journalctl --user -t unlock-keyring --no-pager
  3. 确认密码文件内容正确:

    1
    cat ~/.local/share/keyring-unlock/.password

常见原因

症状 原因 解决方法
服务状态为 failed 密码错误或文件不存在 检查密码文件
日志显示”超时” 密钥环守护进程未启动 检查 GNOME 会话是否正常
凭据仍为随机值 远程桌面服务未重启 手动执行脚本测试

问题 2:手动测试成功但重启后失败

可能原因:服务启动时机过早,密钥环还没准备好。

解决方法:编辑脚本,增加初始等待时间:

1
nano ~/.local/bin/unlock-keyring.sh

找到 sleep 2 行(在”额外等待确保密钥环完全初始化”注释后面),将其改为 sleep 5

问题 3:忘记更新密码文件导致解锁失败

如果修改了登录密码但忘记更新密码文件,重启后解锁会失败。

解决方法

  1. 正常登录系统(此时需要手动输入密码)

  2. 更新密码文件:

    1
    echo -n "新密码" > ~/.local/share/keyring-unlock/.password
  3. 重启验证


第九部分:完全回滚

如果你不再需要这个方案,或者想恢复到原始状态,可以完全回滚。

步骤 1:禁用服务

1
systemctl --user disable unlock-keyring.service

步骤 2:删除服务文件

1
rm ~/.config/systemd/user/unlock-keyring.service

步骤 3:重新加载 systemd

1
systemctl --user daemon-reload

步骤 4:删除脚本和密码文件

1
2
rm ~/.local/bin/unlock-keyring.sh
rm -rf ~/.local/share/keyring-unlock

步骤 5:重启确认

1
sudo reboot

回滚后,系统恢复到原始状态:自动登录仍然有效,但远程桌面密码会在每次重启后随机变化。


命令速查表

为了方便日常使用,这里汇总了常用的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# === 状态检查 ===
# 查看解锁服务状态
systemctl --user status unlock-keyring.service

# 查看远程桌面服务状态
systemctl --user status gnome-remote-desktop.service

# 查看当前 RDP 凭据
grdctl status --show-credentials

# === 日志查看 ===
# 查看解锁日志
journalctl --user -t unlock-keyring --no-pager

# 查看远程桌面日志
journalctl --user -u gnome-remote-desktop.service --no-pager -n 30

# === 手动操作 ===
# 手动执行解锁脚本
~/.local/bin/unlock-keyring.sh

# 手动重启远程桌面服务
systemctl --user restart gnome-remote-desktop.service

# === 维护操作 ===
# 更新密码文件(修改登录密码后必须执行)
echo -n "新密码" > ~/.local/share/keyring-unlock/.password

# 临时禁用解锁服务
systemctl --user disable unlock-keyring.service

# 重新启用解锁服务
systemctl --user enable unlock-keyring.service

总结

通过本教程,你已经成功解决了 Ubuntu 24.04 自动登录与远程桌面密码冲突的问题。

🎉 你获得了什么

  • 开机即用:系统启动后自动登录桌面,无需干预
  • 密码固定:远程桌面使用你设置的固定密码,不再随机变化
  • 随时可连:从任何设备通过 RDP 远程访问你的 Ubuntu 桌面
  • 系统干净:方案不修改任何系统文件,完全可逆

📁 创建的文件

文件 用途
~/.local/share/keyring-unlock/.password 存储登录密码
~/.local/bin/unlock-keyring.sh 解锁脚本
~/.config/systemd/user/unlock-keyring.service 服务配置

⚠️ 请记住

  • 修改登录密码后,必须同步更新密码文件
  • 密码以明文存储,请确保机器有适当的物理安全保护

🔗 相关资源

希望这份教程对你有所帮助。如果你在配置过程中遇到任何问题,可以参考故障排查部分,或者查阅上述资源获取更多信息。

祝你远程办公愉快!🖥️