【THM】REmux The Tmux-Learn

Task 2 Starting tmux “Sessions” and default tmux “prefix”

要启动新的 tmux 会话,只需运行不带参数的 tmux 命令即可。第一个会话创建的名称为“0”。默认情况下,tmux 状态栏将为绿色。会话名称位于左侧。窗口在中间,窗口名称在中间。主机名、时间和日期位于底部绿色栏的右侧。

image-20240118180618737

Tmux 不允许在 tmux 中创建嵌套的 tmux,除非您强制这样做。再次运行 tmux 命令时。

image-20240118181847706

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

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

image-20240118181926635

如果需要在当前会话中创建另一个 tmux 会话。将 -d 参数与 tmux 命令一起使用。在不附加到它的情况下生成新的 tmux 会话。在下面的示例图像中。-s 参数用于指定新会话的会话名称。键入为“tmux new -s tryhackme -d”。

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

image-20240118192454276

退出 tmux 会话而不关闭它可以使用前缀来完成。

1
ctrl b d

image-20240118192555083

使用 tmux ls 命令再次检查。两个会话中都缺少“(attached)”。这意味着会话处于活动状态,但我们是分离的,无法与任何一个会话交互。

重新连接到活动的 tmux 会话。使用 attach 选项和 -t 运行 tmux,后跟所需的会话名称。

1
tmux attach -t tryhackme 

image-20240118192641304

按会话名称删除单个会话。使用 tmux 的 kill-session 选项完成。

1
tmux kill-session -t box-dev

image-20240118192751783

在下面的示例中,有许多会话处于打开状态。交换会话的另一种方法,而无需分离并重新附加到另一个会话。是使用前缀。后跟 s 键以列出所有打开的会话。使用向上或向下箭头键导航到所需的 tmux 会话。然后回车以选择新会话。

image-20240118192915499

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

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

ctrl b shift :

后跟“attach -c /path/to/new/starting/directory”

image-20240118193449862

将上面更新的起始目录或基本目录作为 /dev/shm 完成。在 /dev/shm 目录中开始创建一个新窗格。

image-20240118194859885

尽管在开始时 tmux 不允许在 tmux 中嵌套 tmux。通过 ssh 连接在另一台计算机上附加或启动新的 tmux 会话。可以制作嵌套的 tmux。没问题。只需更改以下命令之前使用的前缀数量即可。可以确定哪个会话获取命令。

prefix、prefix 和 command。这将在 ssh ubuntu 机器的第二个嵌套 tmux 会话上运行。

前缀和命令。这将在第一个 tmux 会话上运行。在当前计算机的 localhost 上运行的会话。

image-20240118194424695

image-20240118194130936

image-20240118194147983image-20240118194153349

Task 3 Manage tmux “Panes”

在当前 tmux 会话窗口中。Tmux 窗格用于将当前会话划分为多个大小的终端。这允许多个命令在同一会话窗口中运行。

ctrl b shift “

水平拆分当前选定的窗格。Do the prefix. This followed by a shift “

image-20240118195049738

ctrl b shift %

image-20240118195108671

exit 命令可用于关闭当前选定的窗格。

ctrl b <arrow key>

可以使用前缀移动到同一窗口中的另一个窗格。后跟箭头键。

ctrl b o

在打开两个以上的窗格时,在最常用的 tmux 窗格之间切换。“Ctrl B ;” 是更好的选择。“Ctrl B O”在仅打开两个窗格时效果更好。

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

ctrl b shift }

image-20240118195457553

ctrl b shift {

image-20240118200206161

ctrl b esc 4

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

请注意,布局结果取决于当前打开的窗格数量。

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

最后,在管理窗格方面。可能需要在两个窗格之间交换位置。循环窗格时,不会创建所需的窗格布局。

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

image-20240118200615686

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

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

image-20240118234337927

image-20240118234348075

Task 4 Manage tmux “Windows”

ctrl b c

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

image-20240118234724412

ctrl b ,

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

ctrl b shift !

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

image-20240118234950496

image-20240118234957813

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

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

image-20240118235445541

移回侦察窗口。显示 Nmap 窗格已移动,并且有更多工作空间。

image-20240118235511336

ctrl b shift &

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

image-20240118235615800

命令后提示。

image-20240118235649152

关闭侦察窗口。名称 recon 将从下面的状态栏中删除。

image-20240118235803506

ctrl b shift :

在此任务的前面部分,演示了如何将窗格分解到其自己的窗口中。但是,有时需要将两个窗口融合在一起作为单个窗口。

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

image-20240119000937761

image-20240119001301705

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

image-20240119001527884

image-20240119001525831

image-20240119001730550

image-20240119001739131

Task 5 Tmux “copy” mode

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

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

image-20240119102013240

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

image-20240119102123705

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

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

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

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

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

image-20240119102307039

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

image-20240119102319555

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

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

image-20240119102338239

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

image-20240119102412879

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

image-20240119102442240

image-20240119102747188

image-20240119102756787

Task 6 Oh My Tmux and beyond

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

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

image-20240119103042447

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

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

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-20240119103852736

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

set -g history-limit 9001

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

image-20240119103913309

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

image-20240119110926890

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

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

1
tmux source /home/username/.tmux.conf

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

image-20240119110948974

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

image-20240119111003061

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

image-20240119111025871

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

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

image-20240119111056487

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

image-20240119111111045

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

image-20240119111133847

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

image-20240119111309654

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

image-20240119111318185

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

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

image-20240119111330846

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

image-20240119111337708

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

image-20240119111347623

image-20240119111356047

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

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

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

image-20240119111437889

以上设置将允许我们打开鼠标模式,这能让我们使用鼠标来调整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-20240119111450627

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

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

image-20240119111503726

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

image-20240119111514076

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

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

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

image-20240119111717168

image-20240119111723365

Task 7 Oreo’s open-source .tmux.conf file

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

1
2
3
4
5
6
#!/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