远程服务器、iTerm2 和 tmux 集成

远程服务器、iTerm2 和 tmux 集成

我希望能够在远程服务器上启动 tmux 会话,然后在本地机器上使用 iTerm2 的本机窗口和分屏。

例如,假设我的远程服务器正在运行一个 tmux 会话,该会话有一个包含两个窗格的窗口。在本地计算机上的 iTerm2 中,我希望有两个原生 iTerm2 窗格,每个窗格包含不同的 tmux 窗格。

这可能吗?

(我知道反过来也是可能的——例如,我可以在本地机器上运行 tmux 会话,另一台机器将把我的 iTerm2 选项卡视为窗口。但这似乎有点没用。)

答案1

是的,这是可能的,但请确保:

  • 远程安装最新版本的 tmux
  • 在本地安装了最新版本的 iterm2

通过登录ssh login@hostname -t 'tmux -CC',然后瞧——这应该会在登录到远程箱的本地箱上打开 iTerm2 窗口。

答案2

结论

ssh <hostname> -t 'tmux -CC new -A -s tmssh'

解释

在现有的 ssh 会话中(假设您使用的是 iTerm2),您只需运行tmux -CC,即可打开一个带有 tmux 集成的原生 iTerm2 窗口。这意味着您可以使用原生滚动、分屏和复制粘贴功能。

您可以将其与 ssh 命令结合使用以立即打开原生 tmux 窗口:

ssh login@hostname -t 'tmux -CC'
  • -t强制伪 tty 分配(允许 SSH 内的控制字符)

这种方法的缺点是您每次都会获得一个新的 tmux 会话,因此您将无法重新连接以查看长时间运行的进程(除非您记得运行tmux -CC attach)。

我们可以稍微扩展一下该命令,创建一个命名的 tmux 会话,如果会话不存在则创建该会话,如果会话已存在则重新连接:

ssh <hostname> -t 'tmux -CC new -A -s tmssh'
  • new创建新会话
  • -A使其new-session行为像attach-session会话名称已存在一样
  • -s tmssh创建一个名为的会话tmssh

现在您有一个原生的 iTerm2 tmux 窗口,您可以随时关闭它,并在需要时重新连接。

辅助函数

最后,为了让生活变得更轻松,我们可以将这一切放入一个辅助函数中,您可以将其添加到您的bashrczshrc

# tmux+ssh helper function with iterm integration
function tmssh () {
  if [[ -z "$1" ]]; then
    me="${FUNCNAME[0]}${funcstack[1]}"
    echo "usage: $me [ssh-args] hostname"
    return 1
  fi

  ssh "$@" -t 'tmux -CC new -A -s tmssh'
}

答案3

以下是对我有用的方法,截至 2015-12-16 的稳定发布版本,即 OS X 10.11.2 上的 iTerm 2.1.4 和 Raspbian Linux 上的 tmux 1.9:

  1. 首先.ssh/config在本地计算机和.ssh/authorized_keys远程计算机上使用,配置无密码登录远程系统。正确配置后,只需执行以下命令即可登录ssh pi(假设pi是远程系统的主机名)。

  2. 创建一个新的 iTerm2 配置文件,它不会登录到本地 shell,而是仅调用ssh pi登录到远程计算机。要配置它,请转到:Preferences / Profiles / + / Command.Command = "ssh pi"

  3. 通过您的新配置文件打开远程机器的 iTerm2 窗口,方法如下:Profiles / Pi。

  4. 在 iTerm2 远程登录窗口中,在命令行中执行:tmux -CC。此后,您的 iTerm2 窗口将显示 tmux 命令模式,tmux 创建一个新会话,iTerm2 立即为该 tmux 会话创建一个新的 iTerm2 窗口。在该新 iTerm2 窗口中,初始 iTerm2 选项卡代表单个tmux 窗口该会话。如果您按 CMD-T,这将创建一个新的 iTerm2 选项卡,代表一个新的 tmux 窗口。

您如何使用它?

  • 此时您可以执行“Shell / tmux / Dashboard”以观察 iTerm2 对现有 tmux 会话和窗口的理解。

  • 如果关闭代表 tmux 会话的 iTerm2 窗口,它会终止底层会话及其所有 tmux 窗口。

  • 如果您关闭显示 tmux 命令模式的 iTerm2 窗口,那么它似乎只是杀死连接到该会话的 tmux 客户端实例,因此您的两个 iTerm2 窗口都会消失,但 tmux 会话仍然存在并且您可以重新连接到它。

  • 如果您想要更有序地从 tmux 分离,那么只需ESC在 tmux 命令模式窗口内执行即可。

  • 如果您最初想要的是附加到现有会话而不是创建新的 tmux 会话,那么您可以使用 来实现tmux -CC attach

理论上,我认为应该有一种方法可以配置 iTerm2 或 tmux,以便当您连接到远程系统时,您会自动连接到任何现有的 tmux 会话,但我无法通过修改 iTerm2 配置文件中的命令行来使其工作。

相关内容