我希望能够在远程服务器上启动 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 窗口。这意味着您可以使用原生滚动、分屏和复制粘贴功能。
tmux -CC
打开 tmux控制方式。
您可以将其与 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 窗口,您可以随时关闭它,并在需要时重新连接。
辅助函数
最后,为了让生活变得更轻松,我们可以将这一切放入一个辅助函数中,您可以将其添加到您的bashrc
或zshrc
:
# 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:
首先
.ssh/config
在本地计算机和.ssh/authorized_keys
远程计算机上使用,配置无密码登录远程系统。正确配置后,只需执行以下命令即可登录ssh pi
(假设pi
是远程系统的主机名)。创建一个新的 iTerm2 配置文件,它不会登录到本地 shell,而是仅调用
ssh pi
登录到远程计算机。要配置它,请转到:Preferences / Profiles / + / Command.Command = "ssh pi"通过您的新配置文件打开远程机器的 iTerm2 窗口,方法如下:Profiles / Pi。
在 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 配置文件中的命令行来使其工作。