在Windows Terminal通过WSL远程连接RHEL服务器时,实现剪贴板复制及tmux选中复制功能的方法
在Windows Terminal通过WSL远程连接RHEL服务器时,实现剪贴板复制及tmux选中复制功能的方法
我之前也碰到过一模一样的场景:用Windows Terminal里的WSL ssh到远程RHEL服务器,想通过xclip把内容复制到Windows剪贴板却一直报Error: Can't open display,折腾了好几种方法,这里分享两个靠谱的解决方案:
方案一:修复X11转发让xclip正常工作
xclip依赖X11环境,所以得把远程服务器的X11请求转发到WSL的X服务器,再映射到Windows:
- 先给WSL配置X服务器:
- 如果是WSL2,推荐用自带的WSLg,它默认集成了X服务器,不用额外安装。确保你的WSL2是最新版本,打开WSL后会自动设置
DISPLAY变量,无需手动配置。 - 如果用第三方X服务器(比如VcXsrv),启动时一定要勾选「Disable access control」,然后在WSL终端里执行
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0来设置DISPLAY变量。
- 如果是WSL2,推荐用自带的WSLg,它默认集成了X服务器,不用额外安装。确保你的WSL2是最新版本,打开WSL后会自动设置
- 配置ssh的X11转发:
- 编辑WSL里的
~/.ssh/config,确保有以下配置:Host your-rhel-server HostName server-ip User your-username ForwardX11 yes ForwardX11Trusted yes - 远程RHEL服务器上安装xclip:
sudo dnf install xclip
- 编辑WSL里的
- 测试:在远程服务器上执行
echo "测试内容" | xclip -sel clip,然后回到Windows粘贴,能看到内容就说明成功了。 - 最后修改远程服务器的
~/.tmux.conf,保持你原来的配置基础上补全剪贴板参数:
(这里加set-option -s set-clipboard off bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'xclip -sel clip' bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'xclip -sel clip'-sel clip是指定系统剪贴板,避免默认选primary剪贴板导致Windows识别不到)
方案二:绕开X11,通过WSL中转到Windows剪贴板
如果X11转发总是出问题,这个方法更稳定——把远程服务器复制的内容通过ssh传回WSL,再调用Windows的clip.exe放到剪贴板:
- 先建立远程到WSL的无密码ssh连接:
- 在WSL里生成密钥对:
ssh-keygen -t ed25519,一路回车默认配置就行。 - 把WSL的公钥传到远程RHEL服务器:
ssh-copy-id your-wsl-username@your-wsl-ip(WSL的IP可以在WSL终端里用hostname -I获取)。
- 在WSL里生成密钥对:
- 编写一个替代xclip的脚本(比如叫
winclip),放到远程服务器的~/bin目录:
给脚本加执行权限:#!/bin/bash ssh your-wsl-username@your-wsl-ip "clip.exe"chmod +x ~/bin/winclip,确保~/bin在你的PATH里(可以用echo $PATH查看)。 - 修改远程服务器的
~/.tmux.conf,把xclip换成我们的脚本:set-option -s set-clipboard off bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'winclip' bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'winclip' - (可选)为了提升复制速度,避免每次都新建ssh连接,可以在远程服务器的
~/.ssh/config里加连接复用配置:
然后把脚本里的Host wsl-host HostName your-wsl-ip User your-wsl-username ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h-%p ControlPersist 10mssh your-wsl-username@your-wsl-ip改成ssh wsl-host就行。
额外小技巧
如果你只是需要快速选中终端内容复制,也可以直接用Windows Terminal的自带功能:打开Windows Terminal设置,找到你的WSL配置,开启「复制所选内容到剪贴板」,这样选中内容后自动复制到Windows剪贴板,不过这个是终端层面的复制,和tmux的复制模式是分开的哦。
备注:内容来源于stack exchange,提问作者rollschild




