x0vnc/x11vnc通过ssh与osc52共享剪切板

7cmb a nobody

前言

没想到这次写文又又又又是因为剪贴板的事情。这次的场景是在x0vncserver下共享服务端剪贴板给客户端主机。archwiki 没有写解决方案,在该项目的issue 中,这位老哥@mathewng表示有一种workaround。具体是多开一个带参数的无画面x11vnc会话捕抓键盘和剪贴板x11vnc -nofb -clip 4x4+0+0

这意味着将开启两个本地x11的vnc会话,一个是一切正常除了不能把服务端主机剪贴板发送给客户端主机的x0vncserver -rfbauth ~/.vnc/passwd;另一个是啥都没有仅剩下捕抓键盘和剪贴板x11vnc -nofb -clip 4x4+0+0(BTW,这里为了前者的正常体验可以加上-repeat参数,就是有亿点点小问题)

两个残疾人取长补短看起来很滑稽,但是确实很好地解决了两者的不足。但是最大的缺点是无法将中文复制出来

PS:x0vnc服务器中的rdp远程windows主机中文却能正确复制出来,甚至还能和跨了两台机器的windows共享图片剪切板…….鄙人由于不懂编码,觉得煞是奇怪

无法复制中文对于以汉语为主要语言的人实在是鸡肋。想起之前的x11转发和osc52,顿时心生一计——能把两者结合在一起,再将命令写进bash脚本,最后做成快捷键或者desktop_entry,以一种比较诡异的办法共享双方剪贴板

思路

通过ssh上的x11转发功能再配置好xauth和xhost就能获得指定x11会话。在这个基础上就可以做到通过ssh控制x11会话。例如像这样通过ssh在x11本地会话下打开xclock:

而剪贴板是由x11提供的,那么说在ssh中提取或者操作剪贴板内容也不在话下了。很明显,xclip可以通过命令行胜任这个工作:

1
2
3
4
5
6
7
➜  ~ pacman -Ss xclip
extra/xclip 0.13-5 [installed]
Command line interface to the X11 clipboard
# example:
➜ ~ echo '我要被复制了' | xclip -i -r -selection clipboard # 复制到clipboard
➜ ~ xclip -o -selection clipboard # 输出clipboard内容
我要被复制了

直到这里也仅限于将指定x11会话的内容在ssh中输出出来,或者将ssh中输入的内容通过echo\管道\重定向等方法复制到指定x11会话的剪贴板中,不能单纯通过命令行真正做到双向粘贴

但是,osc52和终端软件配合就能真正做到只通过bash的命令行分享x0vnc服务器的剪贴板到ssh客户端机器,并且只通过bash命令更改x0vnc剪贴板内容

能通过命令行的事情自然能写脚本替代手打,脚本能通过快捷键以及各种方法快速执行。所以笔者将以一个简单的脚本实现标题目的

这里的复制仅仅只代表x11的clipboard剪贴板,x有三种剪贴板,详见以下链接:

https://superuser.com/questions/90257/what-is-the-difference-between-the-x-clipboards

https://unix.stackexchange.com/questions/139191/whats-the-difference-between-primary-selection-and-clipboard-buffer

先决条件

  • ssh使用的终端与x0vncserver服务主机使用的终端支持osc52转义序列
  • ssh服务器开启X11Forwarding,ssh客户端开启ForwardX11ForwardX11Trusted(两个选项可以用open-ssh命令行参数-Y替代)

实践

1-脚本目录结构

文件一览:

1
2
3
4
5
6
7
8
➜  remote_clip ls -hl
total 24K
-rw-r--r-- 1 baka baka 37 May 29 01:08 clipboard
-rwxr-xr-x 1 baka baka 131 May 28 15:12 evnc.sh
-rwxr-xr-x 1 baka baka 131 May 28 00:51 sc.sh
-rwxr-xr-x 1 baka baka 131 May 27 23:16 vc.sh
-rwxr-xr-x 1 baka baka 142 May 27 23:31 wvnc.sh
-rw-r--r-- 1 baka baka 668 May 28 22:44 yank_head
  • clipboard提供写入x0vncserver会话剪贴板的内容
  • evnc.sh提供使用默认文件编辑器打开clipboard文件的方法
  • sc.sh将x0vncserver会话的剪贴板的内容复制到ssh客户端机器(蹩脚英文ssh copy)
  • vc.shclipboard内容复制到x0vncserver会话剪贴板(蹩脚英文vnc copy)
  • wvnc.sh将传入的第一个参数写入到clipboard
  • yank_head上述脚本的具体实现方法

2-脚本内容

yank_head上述脚本的实现方法:

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
#!/usr/bin/bash

# OSC52YANK WORKAROUND FOR X0VNCSERVER VIA SSH
# YANK TO SSH CLIENT HOST FROM X CLIPBOARD

# X11Forwarding INITE
export DISPLAY=:0
xauth add $(xauth list $DISPLAY)

yank_to_client()
{
echo -ne "\033]52;c;$(xclip -o -selection | base64 )\a"
echo "YANKED"
}

# YANK TO VNC SERVER HOST FROM "$yk_path/clipboard"
yank_to_server()
{
echo -ne "\033]52;c;$(cat "$yk_path/clipboard" | base64 )\a"
notify-send "VNC SERVER REV CLIPBOARD"
}

# WRITE SOMETHING TO "$yk_path/clipboard"
open_clipboard()
{
echo $input
echo "$input" > "$yk_path/clipboard"
echo "WRITTEN"
}

# EDIT "$yk_path/clipboard"
edit_clipboard()
{
# TO WRITE SOMETHING VIA EDITOR
$EDITOR "$yk_path/clipboard"
}

evnc.sh提供使用默认文件编辑器打开clipboard文件的方法:

1
2
3
4
5
6
7
8
#!/usr/bin/bash

# PATH TO SCRIPT DIR
yk_path=$(dirname $(realpath "${BASH_SOURCE[0]}"))
cd $yk_path

. ./yank_head
edit_clipboard

sc.sh将x0vncserver会话的剪贴板的内容复制到ssh客户端机器(蹩脚英文ssh copy):

1
2
3
4
5
6
7
8
#!/usr/bin/bash

# PATH TO SCRIPT DIR
yk_path=$(dirname $(realpath "${BASH_SOURCE[0]}"))
cd $yk_path

. ./yank_head
yank_to_client

vc.shclipboard内容复制到x0vncserver会话剪贴板(蹩脚英文vnc copy):

1
2
3
4
5
6
7
8
#!/usr/bin/bash

# PATH TO SCRIPT DIR
yk_path=$(dirname $(realpath "${BASH_SOURCE[0]}"))
cd $yk_path

. ./yank_head
yank_to_server

wvnc.sh将传入的第一个参数写入到clipboard:

1
2
3
4
5
6
7
8
9
#!/usr/bin/bash

# PATH TO SCRIPT DIR
yk_path=$(dirname $(realpath "${BASH_SOURCE[0]}"))
cd $yk_path

. ./yank_head
input="$1"
open_clipboard

3-食用方法

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
- 文件名:evnc.sh
- 执行环境:在ssh客户端中
- 执行方法:直接执行evnc.sh
- 效果:使用默认文本编辑器打开文件clipboard
- end

- 文件名:wvnc.sh
- 执行环境:在ssh客户端中
- 执行方法:执行wvnc.sh '要复制的内容' \
example:
wvnc.sh 'string'
- 效果:将'要复制的内容'写入文件clipboard \
写入内容不包含单引号且内容不能含有单引号
- end

- 文件名:sc.sh
- 执行环境:在ssh客户端中
- 执行方法:直接执行sc.sh
- 效果:将x0vncserver服务器中剪贴板的内容 \
复制到ssh客户端的主机
- end

- 文件名:vc.sh
- 执行环境:在x0vncserver中的终端
- 执行方法:直接执行vc.sh
- 效果:将文件clipboard中的内容复制到 \
x0vncserver服务器中
- end

如果要将vc.sh放到图形界面的快捷键中,请务必通过支持osc52转义序列的终端执行此命令

  • 标题: x0vnc/x11vnc通过ssh与osc52共享剪切板
  • 作者: 7cmb
  • 创建于 : 2024-05-28 22:46:13
  • 更新于 : 2024-10-12 23:07:35
  • 链接: https://7cmb.com/x0vnc-x11vnc通过ssh与osc52共享剪切板/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
x0vnc/x11vnc通过ssh与osc52共享剪切板