似乎有很多相关的问题,但我想看到一个具体的解决方法。
因此,我曾经是 iTerm2 的狂热用户(无关紧要),后来我开始远程使用 tmux,因为我想避免 SSH 超时,即我的主要的担心的是,如果核灾难摧毁了我的笔记本电脑,我可以从远程服务器上继续我上次中断的地方。
现在我也在本地使用它。有没有办法干净地混合这两种东西?我只看到两个选项。
- 本地的 tmux和在远程机器上(这是我当前的机器)。会话是完全独立的,如果本地机器崩溃,远程机器将继续运行,等等;不幸的是,无法进行交互,所以我不得不忘记保留复制粘贴历史记录(如果我错了请纠正我)和类似的事情。
- 从本地 tmux ssh 并连接到远程 tmux。这样,我就可以在本地 tmux 窗口内拥有一个远程 tmux 会话,这在日常使用中似乎非常麻烦。
所以主要的问题是我想要鱼与熊掌兼得。我想将我的工作保留在 ssh 连接上(并在其处于活动状态时在其中执行多任务),但我还想在所有 tmux 窗格之间共享我的工作,而不管它们是本地的还是远程的。这可能吗?
答案1
我的建议:
用于
mosh
连接远程服务器,会话启动后,启动tmux
莫什是在 3G 出现之前,为通过蜂窝数据链路进行远程会话连接这种常见但不那么可怕的情况而构建的。
从mosh
手册页中:
mosh(移动外壳)是一个远程终端应用程序,支持间歇性连接,允许漫游,并提供推测本地回显和用户击键的行编辑。
与 ssh 相比,mosh 更加强大(其连接在客户端 IP 地址休眠和变化时仍能保持),并且响应速度更快,因为该协议可以容忍数据包丢失并且客户端可以立即回显大多数击键,而无需等待网络往返。
mosh 使用 ssh 建立与远程主机的连接,并使用现有方法(例如公钥认证或密码)进行身份验证。mosh 在服务器上执行非特权的 mosh-server 帮助程序,然后关闭 SSH 连接并启动 mosh-client,后者通过 UDP 建立长寿命数据报连接。
在那个年代,如果你用笔记本电脑登录 ssh 服务器,比如在通勤列车上,使用 CDMA“电脑卡“您的调制解调器快得令人眼花缭乱 康柏舰队(我的天啊,奔腾!),或者使用串行电缆连接它棕榈树七号这是一种具有某种数据服务的东西;每次你从一个无线电单元切换到另一个无线电单元时,你的会话就会断开,在通勤列车上,这种情况可能每 3 到 5 分钟发生一次。
从连接的角度来看,这相当于旧苏联沿着火车轨道降落钚的情景……
所以mosh
来救援吧。它使用 ssh 进行身份验证,但会话的其余部分由 mosh 隧道处理,该隧道是专门为不稳定链接上的会话弹性而设计的。
从用户的角度来看,现在它是不可察觉的。我仍然用它来 ssh,呃……莫什termux
即使 4G 上的链接不再有此问题,也可以从我的 Android 设备上使用。
另一个常见的用例是通过 POTS 上不稳定的调制解调器链接进行 ssh 连接,如果你的妹妹决定给她的男朋友打电话,并接起另一只手,会话就会断开。固定的在家里打电话,尽管你警告过她,你会从一个可疑的 WaReZ 网站下载 MP3 格式的 U2 新专辑。
因此,如果你想使用这个功能,请使用你的发行版的包管理器安装 mosh服务器和客户端(无需 root 权限,如果无法获取 root 权限,它将进行用户空间安装,这对于 Android 设备来说很方便)然后执行以下操作:
terminus:~>> mosh trantor.mydoman.tld tmux
Last login: Wed Apr 4 21:27:38 2018 from XX.XXX.XXX.XXX
trantor:~>>
享受吧!=)
答案2
共享窗口有帮助吗?
tmux new-session -s shared "tmux new-window -n CoolName"
tmux link-window -s <src-window> -t <dst-window>
tmux link-window -s shared:CoolName -t $index# (target is optional)
答案3
有一些想法https://medium.freecodecamp.org/tmux-in-practice-local-and-nested-remote-tmux-sessions-4f7ba5db8795如何在 tmux 中执行此操作。基本上使用一个键来切换对内部 tmux 的访问。
对我有用的配置是http://stahlke.org/dan/tmux-nested/:
unbind C-b
set -g prefix C-a
set -g status-bg colour40
setw -g window-status-current-bg colour40
bind -n C-t new-window -a
bind -n S-left prev
bind -n S-right next
bind -n S-C-left swap-window -t -1
bind -n S-C-right swap-window -t +1
bind -n M-F11 set -qg status-bg colour25
bind -n M-F12 set -qg status-bg colour40
bind -n S-up \
send-keys M-F12 \; \
set -qg status-bg colour25 \; \
unbind -n S-left \; \
unbind -n S-right \; \
unbind -n S-C-left \; \
unbind -n S-C-right \; \
unbind -n C-t \; \
set -qg prefix C-b
bind -n S-down \
send-keys M-F11 \; \
set -qg status-bg colour40 \; \
bind -n S-left prev \; \
bind -n S-right next \; \
bind -n S-C-left swap-window -t -1 \; \
bind -n S-C-right swap-window -t +1 \; \
bind -n C-t new-window -a -c "#{pane_current_path}" \; \
set -qg prefix C-a