AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1739803
Accepted
Sikander Lhote
Sikander Lhote
Asked: 2022-08-31 04:46:46 +0800 CST2022-08-31 04:46:46 +0800 CST 2022-08-31 04:46:46 +0800 CST

是否可以在 tmux 中创建具有相同连接的新窗格?

  • 772

我的设置:本地 Tmux,与不同窗格中的不同服务器有许多连接

我想要做什么:按一个窗格中的快捷方式,打开一个已设置相同连接的新窗格。

为什么:工作流程。很多时候,当我在我的服务器上工作时,我需要打开一个新窗格来做一些事情,而其他事情正在运行。如果我可以打开一个已设置所有内容的新窗格,我将节省大量时间和精力。

我愿意接受其他方式来实现我想做的事情。我可以在远程机器上设置 tmux,但我更喜欢在本地运行 tmux。

编辑:
我遇到了 ssh 多路复用,它解决了我的问题的一部分(每台服务器只需登录一次)。我已将此添加到我的~/.ssh/config文件中:

### Multiplexing ###
Host *
    ControlMaster auto
    ControlPath ~/.ssh/sessions/%C
    ControlPersist 1h

现在我必须弄清楚如何在 tmux 中设置快捷方式以连接到新窗格中的同一主机。

terminal tmux
  • 1 1 个回答
  • 54 Views

1 个回答

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2022-08-31T09:17:33+08:002022-08-31T09:17:33+08:00

    解决方案

    将以下脚本保存_tmux_duplicate_pane在您的目录中PATH:

    #!/bin/bash
    set -e
    
    pid="$(tmux display-message -p '#{pane_pid}')"
    pid="$(ps -o tpgid:1= -p "$pid")"
    dir="$(readlink -f "/proc/$pid/cwd")"
    cd -- "${dir:?}"
    exe="$(readlink -f "/proc/$pid/exe")"
    readarray -d '' args <"/proc/$pid/cmdline"
    name="${args[0]}"
    args=("${args[@]:1}")
    
    tmux split-window "$@" -c "$dir" bash -c "exec -a ${name@Q} ${exe@Q} ${args[*]@Q}"
    

    使脚本可执行 ( chmod +x _tmux_duplicate_pane)。最后将其绑定到tmux. 例子:

    tmux bind-key -T prefix u run-shell _tmux_duplicate_pane
    

    该命令旨在在 shell 中调用。在~/.tmux.conf(永久设置)中,命令应该是bind-key ….

    现在prefixu应该按您的意愿工作。


    解释

    该脚本通过查找与当前窗格关联的进程的控制终端的前台进程组 ID 来工作tmux。它假定前台进程组 ID 的领导者是您要复制的命令。它从中检索信息/proc并相应地调用tmux split-window。


    注意事项和注意事项

    • 不要_tmux_duplicate_pane在窗格中作为命令运行。如果你这样做,那么脚本将在一个新的窗格中复制自己,它将成为一个以线性方式产生的分叉炸弹。如图所示绑定到一个键并以这种方式使用它。

    • 该脚本假定您要执行的命令是活动窗格中前台进程组的领导者。如果出现以下情况,它将无法按您的预期工作:

      • 窗格中的(本地)shell 不会在单独的进程组中运行命令(例如,shell 是禁用作业控制的 Bash);
      • 或者您要执行的命令在管道中;例如交互式 Bash(启用作业控制)在一个进程组中运行整个管道,并且领导者是该行中的第一个命令;我们的脚本试图复制领导者,但在管道的情况下,领导者可能不再存在,它可能已经提前退出;复制整个管道是一项不平凡的任务,依赖于 shell,脚本甚至不会尝试;
      • 或者您所追求的命令不是前台进程组的领导者,无论出于何种原因。

      该脚本应该成功地复制在当前窗格的交互式现代 shell(如 Bash 或 Zsh)中运行的简单命令。

    • 来自的条目/proc/$pid/cmdline不足以复制命令。第 0 个条目是任意的(例如,参见help execBash 中的注释-a)。另一方面/proc/$pid/exe,剩下的参数 from/proc/$pid/cmdline也是不够的,同一个可执行文件可能会有不同的行为,这取决于第 0 个参数。该脚本使用exec -aBash 并构建一个保留可执行文件和第 0 个参数的 shell 命令。

    • 在某些情况下/proc/$pid/cmdline,/proc/$pid/exe对于我们的目的可能是错误的。示例场景:

      • 复制过程可能已更改其cmdline. 原始参数数组可能会丢失。
      • 您调用并希望复制的进程可能已经exec编辑到另一个带有另一个参数数组的可执行文件。您也许可以复制后者,但如果需要前者来为后者进行设置,那么复制的实例可能会失败。

      在这种情况下不应该发生这种情况ssh。

    • 该脚本将尝试复制任何命令,而不仅仅是ssh. 您可以添加一些逻辑、测试$exe和/或${args[0]},使脚本成为无操作,除非命令是ssh ….

    • 当重复命令退出时,其窗格中将没有 shell。除非该remain-on-exit选项位于on中,否则该窗格将终止tmux。一个简单的解决方法是在命令之后强制使用交互式 shell 。例如,而不是tmux split-window … "…"你做tmux split-window … "…; bash"。

    • 在复制命令时,脚本会尝试在原始进程的当前工作目录中执行此操作。在某些情况下,这是错误的,尤其是当进程将相对路径作为参数然后更改其工作目录时。脚本无法知道调用命令时哪个目录是当前目录;它知道现在的当前目录可能相同也可能不同。

    • 该脚本不会尝试复制原始进程的整个环境。如果您SSH_ASKPASS=… ssh …在窗格中运行并尝试复制它,那么新ssh命令将不知道该变量。我猜,解析/proc/$pid/environment是可能的;脚本没有这样做。

    • 该脚本在不同的时刻检索不同的信息。这意味着它容易出现竞争条件。

    • in 脚本的目的cd是让脚本在遇到麻烦时尽早失败。

    • 您提供给脚本本身的参数将传递给tmux split-window. 这意味着您可以绑定tmux bind-key … '_tmux_duplicate_pane -h'并享受水平拆分。

    • 0

相关问题

  • 在 macOS 10.13 中恢复 .bash_profile

  • 如何将 VSC 的终端更改为系统默认值

  • 在 macOS High Sierra 的终端中设置环境变量时遇到问题

  • weechat, tig, htop, ranger等没有颜色

  • 如何在 macOS 的终端中切换切换(连续性)?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve