使用 PuTTY 和 tmux 复制命令

使用 PuTTY 和 tmux 复制命令

我使用 Windows 10 中的 PuTTY 通过 SSH 访问各种 Linux 系统。在这些系统中,我经常使用 Tmux 来简化我在 Linux 环境中的生活。在 Tmux 会话中,我通常有一个或多个窗口,这些窗口被细分为多个窗格。

我经常使用鼠标在 PuTTY 中选择/复制文本,然后右键单击将其粘贴到其中。通常,当换行时,这在 Tmux 之外工作得很好,但在 tmux 会话内,我无法执行多行操作特定窗格内的选择。

我怎样才能做到这一点?

答案1

如果您要复制某些内容并将其粘贴到 tmux 中,则可以使用其内置的复制/粘贴功能。如果您启用了 vi 键绑定并使用默认设置,则将<prefix> [进入复制模式、导航到文本、space开始突出显示并enter完成。然后你就可以prefix ]在 tmux 中粘贴了。请注意,这会将复制的文本保留在 tmux 自己的缓冲区中,并且不会进入本地计算机的剪贴板。

如果需要在 PuTTY 外部粘贴,可以按住 Alt 键并用鼠标进行选择,以在窗格中进行块选择。

答案2

通过一些技巧,可以通过 PuTTY 将 tmux 缓冲区取回并返回到客户端。我使用“AUX”端口(串行打印机)的 ANSI 转义码来完成此操作。

以下只是该传输方法的一种实现:

1)在服务器端tmux.conf添加:

# Send the tmux copy buffer to a file.  The file is read for ANSI printing by "t" alias in .bashrc
bind -t vi-copy y copy-pipe 'cat > ~/.tmux-buffer' 

2)在服务器端.bashrc添加:

t() {
  # Configure a PuTTY profile to send "t" as the "Remote command".  This
  # function will automatically reattach to an existing tmux session if one
  # exists, or start a new one.  This function also repeatedly sends our
  # homemade tmux clipboard back to the PuTTY client in the form of an ANSI
  # printer escape sequence.  The contents of the homemade clipboard are
  # populated by `bind -t vi-copy y copy-pipe 'cat > ~/.tmux-buffer'` in
  # tmux.conf.  It is expected that the PuTTY client will be configured to
  # print to a "Microsoft XPS Document Writer" which saves the printer output
  # to a file.  The file is subsequently read by an AutoHotkey macro, and the
  # contents are made available for paste.
  [[ "$TERM" == "xterm" ]] || return 0 # This prevents recursive runs, in case t() is called after tmux is started.
  { while :; do tput mc5; cat ~/.tmux-buffer; tput mc4; sleep 5; done } &
  tmux attach || tmux
}

3) 在客户端 (Microsoft Windows),创建新打印机:

  • 添加打印机
  • 创建新端口 > 本地端口
  • 输入端口名称>“ PuTTY_Printer_File
  • 驱动程序 > Microsoft XPS 文档编写器
  • 打印机名称 > “ PuTTY Printer
  • 可选:打印测试页并确保它显示在文件@“ %USERPROFILE%\Documents\PuTTY_Printer_File”的内容中

4)在客户端PuTTY配置中:

  • 将“终端”>“打印机将 ANSI 打印机输出发送到:”设置为新创建的名为“ PuTTY Printer”的打印机
  • 将“连接”>“SSH”>“远程命令:”设置为“ t”(参考上面的.bashrc函数)

此时,您可以通过在 tmux 复制模式下突出显示某些文本并按 ,将 tmux 缓冲区的内容发送到 PuTTY 客户端y。选定的文本将返回%USERPROFILE%\Documents\PuTTY_Printer_File到客户端。如果您想更进一步并模拟从此文件中“粘贴”,您可以使用热键序列来读取文件的内容并将其插入。下面是一个利用 AutoHotKey 的示例,但如果您愿意,也可以在 PowerShell 中实现相同的结果。


5)客户端AutoHotKey宏:

;### Get contents of PuTTY ANSI printer device output and paste it
#v:: ;Winkey + v
FileRead, PuTTYPrinter, %USERPROFILE%\Documents\PuTTY_Printer_File
SendInput %PuTTYPrinter%
PuTTYPrinter = ; Free up memory
return

6)完整的使用流程:

  • 使用 PuTTY 连接到服务器并通过 t() 函数将其放入 tmux。
  • 当准备好选择文本进行复制时,使用 tmux 热键进行复制模式 ( Ctrl + b, [)
  • 用箭头键移动光标
  • 开始选择spacebar
  • 结束选择并复制它y
  • 返回客户端运行 PuTTY,WindowsKey + v将粘贴选择

由于图片相当于 1,000 字,以下是所发生情况的概述:

链接:
我在 Stack Overflow 上的回答 -https://stackoverflow.com/a/41560941/3163993
视频演示/解释 -https://www.youtube.com/watch?v=kEIpE2XpDdY

答案3

解决该问题的方法是首先最大化窗格,然后使用鼠标复制文本。使用前缀-Z 最大化当前窗格。

答案4

当有多个垂直窗格时,要从一个窗格复制文本,您可以按<Alt>然后开始拖动鼠标来复制文本块。适用于连接到远程 CentOS 服务器的 Windows 10。

相关内容