可以tmux窗格远程ssh连接

时间:2012-05-10 15:20:54

标签: linux tmux

我可以在本地运行tmux并通过ssh连接到远程机器..之后任何新的窗格和/或屏幕都与远程机器shell一起... 我所说的我无法在远程计算机上安装tmux,但我不希望从每个窗格进行ssh连接,只需要ssh-login一次。

这样的事情可能吗? 感谢

4 个答案:

答案 0 :(得分:5)

如果您只想登录一次,则可以使用ssh的ControlMaster功能。将this之类的配置添加到~/.ssh/config

ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r

如果您多次登录同一服务器(作为同一用户)(无论是否在一个tmux中),ssh将重用该连接,这样您就不需要连接并再次登录。

答案 1 :(得分:4)

lilydjwg解释了我以前从未真正理解过的东西。了解ControlMaster设置使得以下内容更加合理,因为它简化了多个ssh连接。您只需要进行一次身份验证,远程主机不需要为每个连接运行sshd进程。

.tmux.conf文件中:

# What host do you usually log in to?
# We'll ssh there by default each time a new window or pane is opened.
REMOTE_HOST=your.usual.host
set-option -g default-command "ssh $REMOTE_HOST"

# Simple interface to change which host is connected to when you create
# a new window or pane.
bind-key C-h command-prompt -p "Set remote host: " -I $REMOTE_HOST "set-option default-command 'ssh %%'"

# In case you really do want a new window with a local shell.
bind-key C new-window ""

答案 2 :(得分:3)

我认为tmux不能。一种解决方法是将这样的内容添加到 tmux.conf

bind-key X new-window "ssh HOST"

然后新的窗口将从远程主机开始。

答案 3 :(得分:0)

我使用的是tmux 1.8,但没有找到内置的解决方案。这些解决方法至少适合我的常见用例:

  • 捕获整个窗格内容并在其中搜索最后一个ssh命令(我使用有关提示结束的知识来或多或少地可靠地检测命令)
  • 如果此操作失败,请使用tmux shell-commandnew-window命令的split-window选项检查可能已创建窗格的命令

我的reconnect.sh脚本看起来像这样。关于它最脏的是从缓冲区获取最后一个ssh命令的方法。到目前为止,“> ssh”足以让我的情况可靠地检测到包含ssh连接请求的行,但是可以理解任何更好的解决方案。

#!/bin/bash

# @TODO: change this according to your own prompt
# This is used to find lines connect ssh command in the pane buffer
PROMPT_SEPARATOR="> "

# get current pane buffer size and dimensions
HISTORY_LIMIT=`tmux display-message -p "#{history_limit}"`
VISIBLE_LINES=`tmux display-message -p "#{pane_height}"`

# search last ssh command in pane content
LINE=`tmux capture-pane -p -J -S -$HISTORY_LIMIT -E $VISIBLE_LINES | grep "${PROMPT_SEPARATOR}ssh " | tail -1`
if [ -n "$LINE" ]; then
    echo $LINE | sed "s/.*$PROMPT_SEPARATOR//;"
else
    # fall back to the command that might have been used to create the pane
    # (not necessarily ssh but helpful anyway)
    tmux list-panes -F "#{pane_active} #{pane_start_command}" | grep "^1 " | tail -1 | cut -d ' ' -f2-
fi

我将此脚本保存在〜/ .tmux目录中,并更改了split-windownew-window.tmux.conf个快捷键的键绑定,类似于:

# try to reconnect to remote host when creating new window
bind c run-shell 'CMD=`~/.tmux/reconnect.sh`; tmux new-window "$CMD"'