大家在学习sshd服务时,不知有没有注意到这样一个事情:当与远程主机的会话被关闭时,在远程主机上运行的命令也随之被中断。
如果正在使用命令来打包文件,或者正在使用脚本安装某个服务程序,中途是绝对不能关闭在本地打开的终端窗口或断开网络链接的,甚至是网速的波动都有可能导致任务中断,此时只能重新进行远程链接并重新开始任务。还有些时候,我们正在执行文件打包操作,同时又想用脚本来安装某个服务程序,这时会因为打包操作的输出信息占满用户的屏幕界面,而只能再打开一个执行远程会话的终端窗口,时间久了,难免会忘记这些打开的终端窗口是做什么用的了。
Terminal multiplexer是一款能够实现多窗口远程控制的开源服务程序,也叫终端复用器,简称Tmux。简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用Tmux服务程序同时在多个远程会话中自由切换,能够做到实现如下功能。
- 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
- 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
- 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享。
在RHEL 8系统中,默认没有安装Tmux服务程序,因此需要配置软件仓库来安装它,此步骤请见8.3.2小节。这里直接开始安装:
[root@linuxprobe ~]# dnf install tmux Updating Subscription Management repositories. Unable to read consumer identity This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. AppStream 3.1 MB/s | 3.2 kB 00:00 BaseOS 2.7 MB/s | 2.7 kB 00:00 Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: tmux x86_64 2.7-1.el8 BaseOS 317 k Transaction Summary ================================================================================ Install 1 Package Total size: 317 k Installed size: 770 k Is this ok [y/N]: y Downloading Packages: Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : tmux-2.7-1.el8.x86_64 1/1 Running scriptlet: tmux-2.7-1.el8.x86_64 1/1 Verifying : tmux-2.7-1.el8.x86_64 1/1 Installed products updated. Installed: tmux-2.7-1.el8.x86_64 Complete!
Tips
简捷起见,刘遄老师将对后面章节中出现的软件安装信息进行过滤—把重复性高及无意义的非必要信息省略。
9.3.1 管理远程会话
Tmux服务能做的事情非常多,例如创建不间断会话、恢复离线工作、界面切割窗格、会话共享功能等等,下面可以直接敲击tmux命令进入到会话窗口中,如图9-18所示。不难发现,进入到会话的终端底部出现了一个绿色的状态栏,分别显示的是会话编号、名称、主机名及系统时间。
图9-18 Tumx服务程序会话界面
退出会话的命令是exit,敲击后即可返回到正常的终端界面,如图9-19所示:
图9-19 从会话窗口退回到终端界面
会话窗口的编号是从0开始自动排序,即0、1、2、3……,数量少还没关系,数量多的时候区分起来很麻烦。接下来创建一个指定名称为backup的会话窗口吧,请各位读者留心观察,当在命令行中敲下这条命令的一瞬间,屏幕会快速闪动一下,这时就已经进入Tmux服务会话中了,在里面运行的任何操作都会被后台记录下来。
[root@linuxprobe ~]# tmux new -s backup
突然要去忙其他事情了,但是会话窗口中执行的进程还不能被中断,此时便可以用detach参数将会话隐藏到后台。虽然看起来与刚才没有不同,但实际上可以查看到当前的会话正在工作中:
[root@linuxprobe ~]# tmux detach [detached (from session backup)]
如果觉得每次都要输入detach参数很麻烦,可以直接如图9-20所示关闭中断窗口(这与进行远程连接时突然断网具有相同的效果),Tmux服务程序会自动帮我们进行保存。
图9-20 强行关闭会话窗口
这样执行过后服务和进程都会一直在后台默默运行,不会因为窗口被关闭而造成数据丢失。不放心的话可以查看下后台有哪些会话:
[root@linuxprobe ~]# tmux ls backup: 1 windows (created Thu Jan 28 15:57:40 2021) [80x23]
由于刚才关闭了会话窗口,这样的操作在传统的远程控制中一定会导致正在运行的命令也突然终止,但在不间断会话服务中则不会这样。我们只需查看一下刚刚离线的会话名称,然后尝试恢复回来就可以继续工作了,回归到刚刚backup中的方法很简单,再直接attach加会话编号或会话名称就可以的。刚刚离开时正在进行的一切工作状态都会被原原本本的被呈现出来,丝毫不影响:
[root@linuxprobe ~]# tmux attach -t backup
不需要使用这个Tmux会话了,不用费事先attach接入,再exit命令退出。其实可以直接用kill进行关闭的:
[root@linuxprobe ~]# tmux attach -t backup [exited] [root@linuxprobe ~]# tmux ls no server running on /tmp/tmux-0/default
在日常的生产环境中,其实并不是必须先创建会话,然后再开始工作。直接使用tmux命令执行要运行的命令,这样在命令中的一切操作也都会被记录下来,当命令执行结束后后台会话也会自动结束。
[root@linuxprobe ~]# tmux new "vim memo.txt"
9.3.2 管理多窗格
在实际工作中,一个Shell终端窗口总是不够用怎么办呢?Tmux服务有个多窗格的功能,能够把一个终端界面上下或左右进行切割,同时能够做几件事情,而且之间互不打扰,还能保留之前的记录,特别方便。
先创建一个会话。创建上下切割的多窗格终端界面可以用“tmux split-window”命令,如图9-21所示。创建左右切割的多窗格终端界面可以用“tmux split-window -h”命令,如图9-22所示。
图9-21 上下切割多窗格
图9-22 上下切割多窗格
创建多窗口的终端界面后,同时做几件事情都不会乱了,如果觉得两个界面还是不够,那就再执行几次吧,退出就用exit命令即可。
呀!
一不小心创建的太多了,当前正在使用的窗口变得特别小,看不到输入内容了怎么办?不要着急!可以同时按下<ctrl>+<b>+<方向键>调整窗口的尺寸。例如现在创建有些小,想向右扩大一些,则同时如下<ctrl>+<b>+<向右箭头>就行了。
如果需要切换到其他窗格进行工作,但又不能关闭当前的窗格,则使用如表9-4所示的命令进行切换:
表9-4 Tmux不间断会话多窗格切换命令
命令 | 作用 |
tmux select-pane -U | 切换至上方的窗格 |
tmux select-pane -D | 切换至下方的窗格 |
tmux select-pane -L | 切换至左方的窗格 |
tmux select-pane -R | 切换至右方的窗格 |
假如想调整窗格的位置,把上面与下面的窗格位置互换,可以用如表9-5所示的命令进行互换:
表9-4 Tmux不间断会话多窗格互换命令
命令 | 作用 |
tmux swap-pane -U | 将当前窗格与上方的窗格互换 |
tmux swap-pane -D | 将当前窗格与下方的窗格互换 |
tmux swap-pane -L | 将当前窗格与左方的窗格互换 |
tmux swap-pane -R | 将当前窗格与右方的窗格互换 |
如图9-23所示,原本执行过uptime命令的窗格在下方,只需要在该窗格中执行“tmux swap-pane -U”命令即可与上方窗格互换位置,效果如图9-24所示。
图9-23 切换窗格位置前
图9-24 切换窗格位置后
工作中切换窗格操作还要输入命令难免有些麻烦,实际上Tmux服务为用户提供了以<Ctrl>+<b>同时按下相关的一系列快捷键。记住,是先同时按下<Ctrl>+<b>按键,然后松手后再按下后续按键,不是一起按下的。会话窗格常见的快捷键如表9-5所示:
表9-5 Tmux会话窗格相关的常用快捷键
快捷键 | 作用 |
% | 划分左右两个窗格 |
" | 划分上下两个窗格 |
<方向键> | 切换到上下左右相邻的一个窗格 |
; | 切换至上一个窗格 |
o | 切换至下一个窗格 |
{ | 将当前窗格与上一个窗格位置互换 |
} | 将当前窗格与下一个窗格位置互换 |
x | 关闭窗格 |
! | 将当前窗格拆分成独立窗口 |
q | 显示窗格编号 |
请读者们一定要注意,上面快捷键需要先按下<Ctrl>+<b>按键后再敲,否则不生效。例如图9-25与图9-26所示,将两个窗口的位置互换。操作方法是先同时按下<Ctrl>+<b>按键,松手,再按出}符号,即可实现。
图9-25 窗格互换前
图9-26 窗格互换后
基本会了Tmux服务这些操作,日常管理就不成问题了,命令和快捷键不建议死记硬背,工作时可以把书放在案头,随用随查即可。
9.3.3 会话共享功能
Tmux服务不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏窗格、会话锁定等实用的功能。其中,会话共享功能是一件很酷的事情,当多个用户同时控制主机的时候,它可以把屏幕内容共享出来,也就是说每个用户都能够看到相同的内容,还能一起同时操作。会话共享功能的流程拓扑如图9-27所示。
图9-27 会话共享功能技术拓扑
要实现会话共享功能,首先使用ssh服务将客户端A远程连接到服务器。随后使用tmux服务创建一个新的会话窗口,名称为share:
[root@client A ~]# ssh 192.168.10.10 The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established. ECDSA key fingerprint is SHA256:5d52kZi1la/FJK4v4jibLBZhLqzGqbJAskZiME6ZXpQ. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts. root@192.168.10.10's password: 此处输入服务器管理员密码 Activate the web console with: systemctl enable --now cockpit.socket Last login: Fri Jul 24 06:26:58 2020 [root@client A ~]# tmux new -s share
然后,使用ssh服务将客户端B也远程连接到服务器,并执行获取远程会话的命令。接下来,两台主机就能看到相同的内容了。
[root@client B ~]# ssh 192.168.10.10 The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established. ECDSA key fingerprint is SHA256:5d52kZi1la/FJK4v4jibLBZhLqzGqbJAskZiME6ZXpQ. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts. root@192.168.10.10's password: 此处输入服务器管理员密码 Activate the web console with: systemctl enable --now cockpit.socket Last login: Fri Jul 24 06:26:58 2020 [root@client B ~]# tmux attach-session -t share
操作完成后,两台客户端的所有终端信息都会被实时同步,可以一起共享使用一个会话窗口,特别方便。为了让读者们更好的感受会话共享功能的强大之处,我们在同一台电脑上创建出两个窗口,如图9-28所示,更能清晰的看到数据被同步的过程。
图9-28 终端界面进行会话同步