【THM】REmux The Tmux(Tmux使用进阶)-学习

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/tmuxremux

本文相关内容:如何使用tmux默认设置或自定义设置终端工作流。

image

实验环境部署

image

Tmux被称为终端多路复用器,它允许我们在需要的时候构建一个单独的终端界面。

如果在我们的本地机器上没有安装tmux,那么我们可以选择使用Tryhackme所提供的实验环境来完成与本文相关的练习,相关的实验环境将为我们提供实验所需的所有代码和插件。

我们可以在与本文相关的Tryhackme实验房间页面中一键完成环境部署,然后使用以下ssh凭据来访问实验虚拟机:

  • 用户名:tux
  • 密码:tmuxwithremux

启动tmux会话并了解其前缀组合键

要启动一个新的tmux会话,只需要运行不带参数的tmux命令即可。我们所创建的第一个tmux会话的默认名称为“0”。在默认情况下,tmux会话的状态栏为绿色,并且会话名称会显示在左侧,终端窗口在会话界面中间,并且窗口名称也在界面中间,而主机名、时间和日期则在会话界面底部绿色条的右边。

image

Tmux不允许在一个Tmux会话中创建一个嵌套的Tmux会话,除非你在第二次运行tmux命令时强制它这样做。

image

我们可以尝试将当前的tmux会话名称从“0”更改为“box-dev”。在此之前,我们可以首先了解tmux是如何被调用的,tmux会话中的所有命令都以tmux前缀开头,而默认情况下,tmux的前缀组合键为“Ctrl b”。

在tmux组合键前缀之后,我们可以再添加按键“shift $”来改变当前tmux会话的名称,所以完整的键盘输入为:ctrl b shift $

然后我们就能重新键入新的会话名称,并且按下Enter键来保存新会话名称。

image

如果想要使用当前的tmux会话来创建另一个tmux会话(非嵌套关系),那么我们首先要在tmux命令中使用-d参数,然后再添加其他参数来生成一个新的tmux会话。在下面的示例图像中,参数-s用于指定新会话的会话名称,完整的命令输入为:

tmux new -s <new-session-name> -d

image

接下来我们将尝试列出所有的活动tmux会话,我们可以使用list-sessions参数来运行tmux命令,或者将list-sessions简写为ls。如下例所示,运行tmux ls命令还可以显示当前正在使用的tmux会话,对应的标记为"(attached)"。

image

我们还可以使用前缀组合键来退出当前的tmux会话而不关闭它,这只需要在tmux前缀组合键后面添加键d即可:ctrl b d

在我们退出当前tmux会话之后,我们可以再次使用tmux ls命令来检查会话状态。我们可以看到两个会话中都缺失了"(attached)"标记,这意味着我们虽然有两个活动的tmux会话,但是我们当前并没有使用任何tmux会话,也就无法与任何一个tmux会话直接发生交互。

image

如果我们想重新连接到活动的tmux会话,那么我们需要运行带有attach参数选项的tmux命令,并且还要在-t参数后面加上指定的会话名称。

tmux attach -t <sessions-name>或者tmux a -t <sessions-name>

image

现在我们在tmux会话中使用tmux ls进行检查,可以确认“tryhackme”会话名被标记为"(attached)",即当前正在使用该tmux会话。

image

我们可以通过tmux会话名称来删除单个会话,这需要我们使用tmux命令的kill-session参数并附加-t和<target-session-name-to-delete>

tmux kill-session -t <target-session-name-to-delete>

image

完成上述删除操作之后,我们继续在当前tmux会话中使用tmux ls命令来列出tmux会话状态,我们可以看到名为box-dev的会话已经被删除。

注意:如果在执行tmux kill-session命令之前没有保存要被删除的会话的内容,那么在会话删除之后该会话中所打开的任何内容都将丢失。

image

在下面的示例中,有许多tmux会话。另一种无需先分离再重新连接到另一个会话就可以实现会话切换的方法就是使用前缀组合键,我们只需要在组合键后面加上s键就可以列出所有tmux会话(ctrl+b s),然后我们再使用向上或者向下方向键就可以导航到我们所想要切换到的tmux会话,接着按下Enter键选择新的会话即可。

image

如下图所示,我们可以将tmux会话从“0”切换到“tmux_remux”,而不必先离开当前的tmux会话。

image

如果我们需要杀死除了一个指定会话外的所有tmux会话,那么我们可以在使用tmux kill-session命令时附加-a参数来关闭除了-t参数所指定的会话之外的所有会话。如下例所示,除了一个名为“is-0day-0k?”的会话之外,我们将关闭所有tmux会话,最终结果可以通过tmux list-sessions命令来进行检查。

tmux kill-session -t <sessions-name> -a

image

当我们将tmux会话划分为不同大小的窗格时,新窗格的起始目录将对应为当前tmux会话首次启动时的目录。

image

如果我们要更改生成新窗格时的基本起始目录,那么我们必须先了解tmux提示符或命令模式。tmux提示符允许tmux会话运行不带tmux二进制名称的tmux命令,这在终端已经被其他文本填充时非常有用,为了更改生成新窗格时的起始目录,我们需要执行如下操作:

进入tmux提示符ctrl b shift :

输入attach -c /path/to/new/starting/directory或者a -c /path/to/new/starting/directory

image

然后我们就可以基于/dev/shm起始目录来创建一个新的窗格。

image

虽然在启动tmux时不允许在tmux内再嵌套tmux,但是我们可以通过ssh连接在另一台计算机上附加或启动一个新的tmux会话,从而创建一个嵌套的tmux会话;然后我们只需更改tmux命令之前所使用的前缀组合键数目,就可以确定由哪个会话执行tmux命令。

前缀+前缀+命令:这表示我们将在通过ssh所连接的ubuntu机器上的(嵌套)tmux会话上运行命令。

前缀+命令:这表示我们将在第一个tmux会话上运行命令,该会话指的是在当前计算机的本地主机上所运行的tmux会话。

image

答题

ctrl和b键是否需要一直按住,如此每个tmux命令才能工作?是/否(yea/nay)。

image

如何启动名称为“thm”的tmux会话?

tmux new -s thm

image

如何修改当前tmux会话的名称?

ctrl b shift $

image

如何在不关闭会话的情况下退出tmux会话?以便稍后我们再连接回去。

ctrl b d

image

如何列出所有的tmux会话?

tmux ls

image

如何重新连接到名称为“thm”的被分离的tmux会话?

tmux a -t thm

image

如何使用当前的tmux会话来创建一个名为kali的新tmux会话?

tmux new -s kali -d

image

如何在不先脱离当前tmux会话的情况下在两个或多个tmux会话之间进行切换?

ctrl b s

image

如果新的终端窗口或者tmux会话没有响应,我们应该如何强制终止名为“thm”的tmux会话?

tmux kill-session -t thm

image

针对嵌套的tmux会话,我们应该如何修改第二个(内部)tmux会话的会话名称?

ctrl b ctrl b shift $

image

如何进入tmux提示符以便运行/输入tmux命令?

ctrl b shift :

image

退出tmux提示符的方法不止一种吗?是/否(yea/nay)

image

tmux是区分大小写的,那么按下大写锁定再输入命令会破坏tmux命令的运行吗?是/否(yea/nay)

image

在tmux提示符或命令模式下,如何更改tmux的初始启动目录?在我们完成修改之后,新的tmux窗口或窗格将会以/opt作为初始目录。

注意:我们需要先进入tmux命令模式,再指定初始目录。

a -c /opt

image

如何杀死除了名为"notes"之外的所有tmux会话?

tmux kill-session -t notes -a

image

管理tmux窗格

在当前的tmux会话窗口内,Tmux窗格(panes)被用于将tmux会话划分为多个大小各异的终端界面,这将允许我们在同一tmux会话窗口内运行多个命令。

我们可以使用以下几个键来将当前的会话窗口进行水平划分:ctrl b shift "

image

我们也可以选择将当前的会话窗口进行垂直划分:ctrl b shift %

image

当我们在某个窗格中使用exit命令时,可以关闭当前所选定的窗格。

image

如果我们想要移动到同一窗口内的另一个窗格,我们可以使用前缀组合键并附加方向键来完成(ctrl b <arrow key>);此外,我们也可以在前缀组合键后面加上o键来代替方向键(ctrl b o),这样我们就可以循环遍历所有的tmux窗格,而且这样做的额外好处是行光标不会转义到另一个窗格。

如果我们打开了两个以上的tmux窗格,则为了在最常用的tmux窗格之间进行切换,使用“ctrl b ;”是更好的选择;但是如果只有两个tmux窗格被打开时,我们使用“ctrl b o”来切换窗格更加合适。

如下图所示:我们可以使用tmux前缀组合键ctrl b并附加方向键或者o键来将终端光标从左侧移动到右侧。

image

如果tmux窗格没有响应并且ctrl-c也不能解决这个问题,那么我们还可以强制关闭或杀死当前所选择的tmux窗格:ctrl b x y

image

image

我们还可以在不退出窗格或者创建新窗格的前提下更改布局以管理窗格的位置。

例如,如果我们想要顺时针移动当前所选定的窗格,那么可以按下以下几个键:ctrl b shift }

注意:当我们执行ctrl b shift }时,其他窗格将会随着当前所选定的窗格进行顺时针移动。

image

image

如果我们想要逆时针移动当前所选定的窗格,那么可以按下以下几个键:ctrl b shift {

image

管理窗格位置的另一种方法是使用tmux的五个内置布局,这可以通过在前缀组合键后附加转义或esc键以及从1到5中的某个数字来完成:ctrl b esc 4

注意:窗格的布局结果取决于当前所打开的窗格数目。

image

我们还可以使用前缀组合键加上空格键(ctrl b spacebar)来一次一个地循环浏览当前tmux窗口内置的窗格布局,当只有两个窗格在当前的tmux窗口中打开时,我们也可以使用顺时针或逆时针选项切换窗格来作为ctrl b spacebar的替代方案。

image

接下来我们将了解如何简单管理窗格位置,我们可能需要在两个窗格之间进行位置交换。

image

在进行窗格交换之前,我们可以使用ctrl b q组合键来标识窗格号,这将帮助我们查看窗格的编号以及窗格的大小。

image

为了实现窗格位置交换,我们首先要进入tmux提示符或者命令模式,这可以通过组合键ctrl b shift :来完成;成功进入tmux命令模式之后,我们可以使用以下命令来进行窗格交换:swap-pane -s <source pane final swap location> -t <currently selected destination pane>

image

针对上图示例使用窗格交换命令之后,带有鹦鹉图像的窗格将被移动到窗口的右下角,并且我们的鼠标光标也将移动到该窗格,我们可以直接在带有鹦鹉图像的窗格中进行输入,而不必再切换光标位置。

image

我们还可以在命令模式下使用以下命令来进行窗格交换:swap-pane -t <pane to swap with> -s <currently selected pane>

image

image

如下图所示,窗格0将与窗格3的位置进行交换,并且鼠标光标将被继续放置窗口的右下角。

image

答题

image

image

tips:在命令模式下使用swap-pane -s 3 -t 1时,鼠标光标将跟随被交换的窗格进行移动;在命令模式下使用swap-pane -t 0 -s 4时,鼠标光标将保留在之前所选择的窗格中。

image

管理tmux窗口

Tmux窗口就像一个新的终端选项卡,你可以轻松地切换这些窗口。我们可以在tmux会话中使用组合键ctrl b c来创建一个新的tmux空窗口,在新窗口中会自动显示该窗口的编号和名称,并且在窗口名称末尾会用*或通配符星号来标记我们当前所选中的tmux窗口。

image

如果我们想更改当前的tmux窗口名称,我们可以先使用组合键ctrl b ,,然后再重新输入新窗口名称并按回车键保存更改即可。

image

当我们在某个tmux窗口中使用了nmap命令之后,由于界面原因我们无法很好地查看nmap的输出结果,此时我们就可以使用组合键ctrl b shift !来将当前的tmux窗格中的nmap输出结果发送到一个新的tmux窗口中以方便我们进行查看。

image

如上图所示,我们可以看到nmap命令的输出结果被发送到了一个名为"bash"的新tmux窗口中。

注意:此时原先的tmux窗口recon中的nmap输出内容将被移除(见下图)。

image

如果想在多个tmux窗口之间进行切换,我们可以使用ctrl b n来切换到下一个tmux窗口,或者使用ctrl b p切换到前一个tmux窗口;此外,我们还可以选择使用组合键ctrl b w来切换到我们所需的tmux窗口,此组合键需要我们结合方向键和Enter键来选择我们具体想要切换到的tmux窗口(见下图)。

image

如果一个tmux窗口已经失效并且需要被快速终止,那么我们就需要关闭该tmux窗口。在关闭tmux窗口时还将关闭当前所选择的tmux窗口中已经打开的任何tmux窗格。如果我们要杀死或者关闭一个tmux窗口,那么我们首先需要使用组合键ctrl b shift &,然后再加上y键来确认关闭当前的tmux窗口,或者继续输入n键来保持当前的tmux窗口为打开状态。

image

当我们确认关闭名为recon的tmux窗口时,我们将看到recon窗口名称将在tmux的状态栏中被删除(见下图)。

image

有时我们可能需要将两个tmux窗口合并为一个。

将两个不同的tmux窗口/窗格合并为一个,可以通过窗口名称或者编号来完成,相关的命令将在tmux提示符或者命令模式下运行。

我们需要先输入组合键ctrl b shift :,然后在tmux提示符中输入join-pane -t <window-name>或者join-pane -s <window-name>,其中-s表示源窗口名称,-t表示目标窗口名称。

image

image

按下回车键来运行连接窗格命令即可:

image

对于连接窗格命令,我们可以在命令末尾添加-v来将两个窗格水平地融合在一起,或者也可以在join-pane命令的末尾添加-h来将两个窗格垂直地融合在一起。

image

答题

image

image

image

tmux复制模式

tmux复制模式可用于上下滚动以查看页面内容,如果tmux会话中的文本内容大于tmux窗格的长度或者tmux窗口的大小,那么我们就需要启动复制模式。

我们可以输入组合键ctrl b [来进入tmux复制模式,然后就可以上下滚动以查看页面,此时我们还可以使用q键来退出复制模式。

image

image

在tmux复制模式下,我们可以键入ctrl r和我们要搜索的字符串或关键词来向上查找页面内容,然后按住ctrl键并再次按r键就可以让我们跳转到下一个字符串位置,并且按下回车键还可以让我们恢复到页面滚动状态,此时鼠标光标将停止在我们所搜索的字符串位置。

image

在tmux复制模式下,我们还可以使用ctrl s并附加字符串来向下搜索页面,按住ctrl键并再次按s键可以让我们跳转到下一个字符串位置,并且按下回车键可以让我们恢复到页面滚动状态,此时鼠标光标将停止在我们所搜索的字符串位置。

image

在tmux复制模式下执行复制和粘贴操作需要5个步骤。

注意:这个方法只适用于tmux剪贴板。

1.按下组合键ctrl b [来进入复制模式;

2.滚动到要复制的文本块的开头;

image

3.使用ctrl+空格键启用高亮显示,然后使用方向键向上选择所有文本,如果我们从顶部开始,就使用向下的方向键。

image

4.使用alt w键来复制所有高亮显示的文本到tmux剪贴板中;

5.创建一个新文件,然后再用ctrl b ]组合键来粘贴最终的文本内容。

image

如果我们想检查当前复制到tmux剪贴板中的文本,那么我们可以使用组合键ctrl b shift #来完成。

image

请注意:即使文本内容可能看起来被破坏了,也不要担心它的粘贴情况,因为它是在终端文件编辑器中复制的,我们按q键退出复制模式,然后回到终端界面创建文件并粘贴我们所复制的文本内容即可。

image

答题

image

image

自定义配置tmux

在默认情况下,Tmux并没有默认的配置文件,但是我们也可以创建一个自定义的tmux配置文件。

在为tmux制作自定义配置文件之前,可以先显示tmux默认值的所有选项,我们使用tmux show -g命令即可显示tmux的全局参数。

image

我们所需要创建的tmux配置脚本的文件名为.tmux.conf,它的保存路径为/home/username/.tmux.conf

image

我们现在分析一下上图中的配置文件内容:

set -g status-style bg='#44475a',fg='#8be9fd'

配置文件内容中的这一行用来修改tmux状态栏的颜色。

setw -g window-status-current-style fg=black,bg=white

配置文件内容中的这一行将为当前所选定的tmux窗口名称添加白色高亮显示效果。

set -g prefix C-a

配置文件内容中的这一行可将前缀组合键从默认的ctrl b更改为ctrl a,如果需要也可以使用alt键而不是ctrl键,例如将前缀组合键设置为M-a,这将使得前缀组合键从默认的ctrl b更改为alt a。

重要提示

配置文件内容中的bind或bind -key选项允许我们添加额外的热键选项,并且可以不覆盖默认热键;当然也可以通过设置选项覆盖默认的tmux热键,只要把更新后的热键写入.tmux.conf文件即可。

使用bind-key与|和-可以添加额外的方法来实现tmux窗口分割和创建一个新的tmux窗格,并且以“#{pane_current_path}”结尾的-c参数能够允许不同目录中的任何新窗格都能保留其初始目录路径,即使该路径不是tmux会话开始时的目录。

  • ctrl b shift | split-windows -h 设置热键用于水平分割tmux窗口;
  • ctrl b - split-windows -v 设置热键用于垂直分割tmux窗口。

image

通过设置历史限制还允许我们让tmux复制模式具有更高级别的最大字符限制,这对于复制超出默认tmux历史限制的输出内容非常有用。

set -g history-limit 9001

配置文件内容中这一行允许我们设置历史限制,以便修改在tmux复制模式下的最大字符限制。

image

针对tmux状态栏的左侧,我们可以使用set或set-option中的status-left来进行自定义设置。在下面的例子中:第一行内容中的status-left-length被设置为15,该设置的作用是定义可以在tmux状态栏左侧显示的字符总数;第二行内容则是用Linux命令echo来显示“Try harder”字符串。

image

然后我们可以用以下方法来重新加载tmux配置文件:在tmux会话中按下ctrl b shift:然后输入source-file /home/username/.tmux.conf或者source-file ~/.tmux.conf即可。

配置文件.tmux.conf也可以通过关闭并重新启动一个新的tmux会话来进行重新加载,或者我们也可以使用以下tmux命令来重新加载配置文件:

tmux source /home/username/.tmux.conf

最后我们实现的效果如下所示(tmux状态栏内容将发生变化):

image

当我们将Linux命令的输出通过写入配置文件来添加到tmux状态栏时,有时候配置文件中的Linux命令将不会正常工作。为了解决这个问题,我们可以将所需要执行的一行Linux代码或脚本放入一个单独文件中,然后再使用chmod使其变得可执行,最后再将其写入到tmux配置文件中。

image

我们将包含Linux命令的脚本的相关路径写入到tmux配置文件中,然后重新加载.tmux.conf文件即可。

image

除了能够调用脚本之外,tmux配置文件.tmux.conf还可以调用一些自定义插件,例如以下来自于Github的插件:

如以下示例所示,我们将加载一个插件:tmux-logging(这是一个可以获取tmux窗格截图、每个tmux窗格的历史以及tmux的完整历史记录的插件)。

image

重新加载tmux配置文件,如果我们要为当前所选定的tmux窗格记录命令历史,可以使用ctrl b shift P组合键,这将在当前系统用户的主目录中启动一个日志文件。

image

当我们重新加载了tmux配置文件之后,又出现了一个新的问题:之前我们所添加的script.sh脚本(包含whoami命令)会在tmux状态栏中打印一个重复的字符串。

image

这是因为我们之前在添加脚本时对set status-right选项使用了-a或append参数,这样当我们重新加载tmux配置文件.tmux.conf时就会重复打印内容,而这个问题可以通过在配置文件内容中使用-g或global参数来解决。

image

现在重新加载.tmux.conf文件,可以看到仅使用全局参数-g能够让我们从tmux状态栏右侧删除主机名、时间和日期并且不会重复打印字符串。

image

但是,如果我们想获得与使用-ga参数相同格式的状态栏输出而仅去除重复打印字符串的缺陷,那么我们可以在配置文件内容中使用以下参数:

  • #H:表示主机名的占位符。
  • %H:表示是时钟中的小时和分钟。
  • %d-%b-%y:表示日、月、年。

image

然后我们再重新加载配置文件,我们可以看到tmux状态栏的显示一切正常,并且在我们以后尝试重新加载配置文件时也不会再因为script.sh而重复打印字符串。

image

如果我们不喜欢tmux复制模式的快捷键(在默认情况下,它们被设置为emacs),我们可以通过向配置文件添加set -g mode-keys vi参数内容来进行更改。

image

完成内容添加之后我们再保存.tmux.conf脚本并重新加载脚本即可,我们将基于配置文件的设置并按照以下步骤来进行tmux内容复制。

  1. 按下ctrl b [组合键进入tmux复制模式;
  2. 使用方向箭头键来选中我们想要复制的内容;
  3. 按下spacebar空格键并后跟方向箭头键来突出显示所有被选中要进行复制的文本;
  4. 按下enter键复制高亮显示部分的文本内容到tmux剪贴板中;
  5. 按下ctrl b ]组合键粘贴tmux剪贴板中的内容。

为了让tmux复制模式变得更像是在vi文件编辑器中进行文本块复制操作,我们可以继续向配置文件添加如下几行内容:

image

以上设置将允许我们打开鼠标模式,这能让我们使用鼠标来调整tmux窗格的大小或者滚动tmux中的内容,而无需先使用快捷键进入tmux复制模式。

上图内容中的最后几行参数还将允许我们使用vi y来保存Linux辅助组合键,辅助组合键是ctrl c ctrl v,这意味着我们在复制文本时将从ctrl v缓冲区处进行粘贴,而不是将需要被复制的文本局限在tmux中。

构建自定义.tmux.conf配置脚本的替代方法是使用开源的.tmux.conf脚本,例如使用github中的tmuxconfig存储库:

https://github.com/chaosma/tmuxconfig.git

tips:我们也可以使用谷歌搜索引擎搜索Oh My Tmux来找到一些开源的.tmux.conf脚本。

在访问上述Github存储库之前,我们首先需要修改现存的自定义配置文件的名称以便完成备份操作,我们可以将现存的自定义配置文件备份为custom-tmux.bak。

image

然后我们再使用git clone命令来安装上述的tmuxconfig存储库,并将该存储库中隐藏的.tmux.conf文件复制到/home/username/主目录下:

注意:下图所使用的命令是在我们使用了git clone命令($ git clone https://github.com/chaosma/tmuxconfig)之后再执行的。

image

最后,我们可以运行一个新的tmux会话或者重新加载tmux配置文件.tmux.conf以便查看tmux窗口的更改情况。

image

如果我们要将配置脚本更改回来,那就需要再次替换主目录中的.tmux.conf配置文件,或者在启动新的tmux会话时使用-f参数来调用我们所需要的.tmux.conf文件:

tmux -f /home/username/custom-tmux.bak

注意:无论自定义的.tmux.conf文件是否已被删除或替换,我们都可以通过终止tmux服务(tmux kill-server)来将tmux重置为默认配置,但是在我们开始尝试执行kill-server命令之前,请在每个已经打开的tmux会话、窗口和窗格中备份并保存所有内容,因为kill-server命令将终止所有tmux会话的状态。

答题

image

image

开源.tmux.conf文件

我们可以使用以下命令来加载与本文实验示例相关的开源.tmux.conf文件:

#!/bin/bash
cd ~/
git clone https://github.com/OreoByte/another_omt.git
chmod +x ~/another_omt/thm_vpn
chmod +x ~/another_omt/curl_thm_vpn
cp ~/another_omt/simple_tmux.conf ~/.tmux.conf
posted @ 2023-09-03 00:51  Hekeatsll  阅读(485)  评论(0编辑  收藏  举报