有没有办法像在 Cygwin 中那样创建 /dev/clipboard?

有没有办法像在 Cygwin 中那样创建 /dev/clipboard?

这个答案表示 Cygwin 具有一个/dev/clipboard与默认 Windows 剪贴板同步的设备。

有没有办法在 Linux 中为主剪贴板提供同样的功能?也许有人编写了 FUSE 驱动程序或类似的东西?

更具体地说,我正在寻找 Linux 上的类似文件的设备,它允许以下操作:

$ echo Foo > /dev/clipboard
# clipboard content: "Foo", usable via Ctrl-V
# set clipboard via Ctrl-C to "Bar"
$ cat /dev/clipboard > test.txt
# test.txt content: "Bar"

答案1

让 FUSE 守护进程与 X11 对话当然是可能的。但还存在一些其他问题:

挑剔:“主剪贴板”自相矛盾。X11 有CtrlC常用的“选择”;当您选择并单击鼠标中键时使用名为“PRIMARY”的选择,而当您按下或时使用名为“CLIPBOARD”的选择CtrlV

Cygwin/dev/clipboard是在 cygwin1 运行时中实现的,因此其代码运行与访问程序本身处于相同的上下文中。如果两个用户尝试读取它,他们都会看到自己的剪贴板内容,因为他们自己直接访问它。

与此同时,Linux 文件系统挂载全球的所有读取请求都经过单个 FUSE 服务器进程(对于该 FUSE 安装);这意味着它不确定应该读取哪个 X 服务器的剪贴板。

(请记住,可以有多个用户登录,并且可以同时运行多个 X 服务器。)

多用户问题有三种可能的解决方案:

  • 在 处安装单个系统范围的 FUSE /dev/clipboard。每次 FUSE 守护进程收到打开请求时,它都需要获取请求程序的 PID、访问/proc/<pid>/environ、从中提取 DISPLAY= & XAUTHORITY=,使用该信息连接到正确的 X 服务器,并读取剪贴板。

  • 不要将特殊文件放在 /dev 中,而是放在用户的主目录中,例如~/clipboard。每个用户都运行守护进程的单独副本。GNOME 的 Gvfs 使用此方法/run/user/*/gvfs(早期~/.gvfs)。它将每个用户限制为一个图形会话,但这没问题——还有许多其他东西每个用户只能运行一次。

  • 设置新的挂载命名空间登录时,例如使用pam_namespace,这样每个会话都可以单独查看挂载位置(从根命名空间继承,但能够挂载 /dev/clipboard 等,而外部看不到)。然后由 X 会话管理器启动 FUSE 守护程序,与上一种方法相同,但不限于每个用户一个会话。

相关内容