作为 Linux 用户,FreeRDP(xfreerdp)是连接 Windows 远程桌面的常用工具,但默认行为常让人困扰:每次启动都会在当前工作区抢占焦点,打断正在进行的任务。尤其在多任务开发场景下,远程桌面窗口与本地工作窗口混杂,会严重影响效率。
核心需求:让远程桌面在独立工作区启动,实现「本地开发」与「远程操作」的视觉隔离。
FreeRDP 本身不提供指定工作区启动的参数,需要借助外部工具完成。常用的有两类:
注意:xdotool 和 wmctrl 都只支持 X11。Ubuntu 22.04 及以上默认使用 Wayland 会话,请先确认当前会话类型(
echo $XDG_SESSION_TYPE),Wayland 下请改用 Xorg 会话(登录界面选择 “Ubuntu on Xorg”)。
xdotool 自带工作区(desktop)管理命令,不需要模拟键盘快捷键,比按键模拟更可靠。
sudo apt install xdotool wmctrl
xdotool --version
| 命令 | 说明 |
|---|---|
xdotool get_num_desktops |
获取工作区总数 |
xdotool get_desktop |
获取当前工作区编号(从 0 开始) |
xdotool set_desktop N |
切换到第 N 个工作区 |
xdotool set_desktop_for_window WID N |
将窗口移动到第 N 个工作区 |
#!/bin/bash
# 文件名:freerdp_workspace.sh
# 功能:在独立工作区启动 FreeRDP 远程桌面
RDP_HOST="192.168.3.234" # 远程主机 IP
RDP_USER="sj" # 登录用户名
RDP_PASS="${REMOTE_PASSWORD}" # 推荐从环境变量读取,避免明文出现在命令行
# 1. 切换到一个独立工作区(这里固定用最后一个)
LAST=$(($(xdotool get_num_desktops) - 1))
xdotool set_desktop "$LAST"
# 2. 启动 FreeRDP,后台运行以免阻塞脚本
xfreerdp /v:"$RDP_HOST" /u:"$RDP_USER" /p:"$RDP_PASS" \
/f /sound +clipboard /cert-ignore /log-level:INFO +home-drive &
# 3. 等待窗口出现后固定到当前工作区(保险措施,防竞态)
sleep 3
WIN_ID=$(wmctrl -l | grep -i freerdp | awk '{print $1}' | head -1)
[ -n "$WIN_ID" ] && wmctrl -i -r "$WIN_ID" -t "$LAST"
由于第 1 步已经切到目标工作区,新窗口默认就开在那里,第 3 步只是兜底:万一窗口启动慢,确保它不会被切到别的区。
如果你不想预先切换工作区,也可以先启动 FreeRDP,再把窗口移动到指定工作区:
xfreerdp ... &
sleep 3
WIN_ID=$(wmctrl -l | grep -i freerdp | awk '{print $1}')
wmctrl -i -r "$WIN_ID" -t 3 # 移动到第 3 个工作区(编号从 0 开始)
wmctrl -d 可以列出全部工作区及其编号,方便确认目标编号。
| 参数 | 说明 | 安全建议 |
|---|---|---|
/v:HOST |
远程主机地址 | - |
/u:USER / /p:PASS |
登录账号/密码 | 明文密码会出现在 ps 输出中,建议省略 /p 让 xfreerdp 交互式提示输入 |
/f |
全屏模式 | - |
/sound |
音频重定向,本地可听到远程声音 | - |
+clipboard |
剪贴板共享 | - |
/cert-ignore |
跳过证书校验 | 有中间人攻击风险,生产环境应改用可信证书(如 /cert:./ca.pem) |
/log-level:DEBUG |
调试日志 | 可能打印敏感信息,正式环境用 /log-level:INFO |
+home-drive |
映射本地主目录到远程 | 敏感目录建议只映射指定路径 |
/scale:180 |
缩放比例,适配高分屏 | 3.x 用百分比(如 180),2.x 用小数(如 1.8),以 xfreerdp /help 为准 |
密码不要硬编码。最稳妥的方式是省略 /p,xfreerdp 会交互式提示输入,密码不出现在命令行和 shell 历史中;次选是从环境变量读取:
export REMOTE_PASSWORD="your_password" # 写入 ~/.bashrc 或使用密码管理器
注意:RDP 协议不支持类似 SSH 的密钥认证,安全性依赖 NLA 和证书。没有有效证书时至少保证密码强度,并尽量在受信网络中使用。
脚本权限与桌面快捷方式:
chmod +x freerdp_workspace.sh
cat > ~/.local/share/applications/FreeRDP.desktop << EOF
[Desktop Entry]
Name=FreeRDP Workspace
Exec=/path/to/freerdp_workspace.sh
Type=Application
Icon=remote-desktop
EOF
chmod +x ~/.local/share/applications/FreeRDP.desktop
xdotool: command not found:先安装 xdotool。若在 Wayland 会话下运行,命令无效,需改用 Xorg 会话。wmctrl -l 里窗口标题可能不含 “FreeRDP”,先手动执行 wmctrl -l 看实际标题,再调整 grep 关键字;也可以加大 sleep 时间。$WIN_ID 是否为空(为空说明 grep 没匹配上)。xdotool key 模拟快捷键(如切换工作区),在部分窗口管理器或 Wayland 下不生效;优先使用 set_desktop 直接切换,而非模拟按键。通过 xdotool 与 FreeRDP 的结合,我们实现了远程桌面的「空间隔离」,本质上是让工具适配人类的工作习惯,而非被迫改变工作流。类似的思路可以延伸:用脚本自动化重复性操作、通过工具组合弥补功能短板。当窗口在独立工作区优雅打开,不仅是效率的提升,更是对「计算环境控制权」的夺回。