【THM】REmux The Tmux-Learn
【THM】REmux The Tmux-Learn
hihopkcTask 2 Starting tmux “Sessions” and default tmux “prefix”
要启动新的 tmux 会话,只需运行不带参数的 tmux 命令即可。第一个会话创建的名称为“0”。默认情况下,tmux 状态栏将为绿色。会话名称位于左侧。窗口在中间,窗口名称在中间。主机名、时间和日期位于底部绿色栏的右侧。
Tmux 不允许在 tmux 中创建嵌套的 tmux,除非您强制这样做。再次运行 tmux 命令时。
我们可以尝试将当前的tmux会话名称从“0”更改为“box-dev”。在此之前,我们可以首先了解tmux是如何被调用的,tmux会话中的所有命令都以tmux前缀开头,而默认情况下,tmux的前缀组合键为“Ctrl b”。
在tmux组合键前缀之后,我们可以再添加按键“shift $”来改变当前tmux会话的名称,所以完整的键盘输入为:ctrl b shift $
如果需要在当前会话中创建另一个 tmux 会话。将 -d 参数与 tmux 命令一起使用。在不附加到它的情况下生成新的 tmux 会话。在下面的示例图像中。-s 参数用于指定新会话的会话名称。键入为“tmux new -s tryhackme -d”。
1 | tmux new -s <new-session-name> -d |
退出 tmux 会话而不关闭它可以使用前缀来完成。
1 | ctrl b d |
使用 tmux ls 命令再次检查。两个会话中都缺少“(attached)”。这意味着会话处于活动状态,但我们是分离的,无法与任何一个会话交互。
重新连接到活动的 tmux 会话。使用 attach 选项和 -t 运行 tmux,后跟所需的会话名称。
1 | tmux attach -t tryhackme |
按会话名称删除单个会话。使用 tmux 的 kill-session 选项完成。
1 | tmux kill-session -t box-dev |
在下面的示例中,有许多会话处于打开状态。交换会话的另一种方法,而无需分离并重新附加到另一个会话。是使用前缀。后跟 s 键以列出所有打开的会话。使用向上或向下箭头键导航到所需的 tmux 会话。然后回车以选择新会话。
如果我们需要杀死除了一个指定会话外的所有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”
将上面更新的起始目录或基本目录作为 /dev/shm 完成。在 /dev/shm 目录中开始创建一个新窗格。
尽管在开始时 tmux 不允许在 tmux 中嵌套 tmux。通过 ssh 连接在另一台计算机上附加或启动新的 tmux 会话。可以制作嵌套的 tmux。没问题。只需更改以下命令之前使用的前缀数量即可。可以确定哪个会话获取命令。
prefix、prefix 和 command。这将在 ssh ubuntu 机器的第二个嵌套 tmux 会话上运行。
前缀和命令。这将在第一个 tmux 会话上运行。在当前计算机的 localhost 上运行的会话。
Task 3 Manage tmux “Panes”
在当前 tmux 会话窗口中。Tmux 窗格用于将当前会话划分为多个大小的终端。这允许多个命令在同一会话窗口中运行。
ctrl b shift “
水平拆分当前选定的窗格。Do the prefix. This followed by a shift “
ctrl b shift %
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 }
ctrl b shift {
ctrl b esc 4
管理窗格位置的另一种方法是使用tmux的五个内置布局,这可以通过在前缀组合键后附加转义或esc键以及从1到5中的某个数字来完成:ctrl b esc 4
请注意,布局结果取决于当前打开的窗格数量。
我们还可以使用前缀组合键加上空格键(ctrl b spacebar)来一次一个地循环浏览当前tmux窗口内置的窗格布局,当只有两个窗格在当前的tmux窗口中打开时,我们也可以使用顺时针或逆时针选项切换窗格来作为ctrl b spacebar的替代方案。
最后,在管理窗格方面。可能需要在两个窗格之间交换位置。循环窗格时,不会创建所需的窗格布局。
在进行窗格交换之前,我们可以使用ctrl b q组合键来标识窗格号,这将帮助我们查看窗格的编号以及窗格的大小。
为了实现窗格位置交换,我们首先要进入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>
Task 4 Manage tmux “Windows”
ctrl b c
Tmux窗口就像一个新的终端选项卡,你可以轻松地切换这些窗口。我们可以在tmux会话中使用组合键ctrl b c
来创建一个新的tmux空窗口,在新窗口中会自动显示该窗口的编号和名称,并且在窗口名称末尾会用*或通配符星号来标记我们当前所选中的tmux窗口。
ctrl b ,
如果我们想更改当前的tmux窗口名称,我们可以先使用组合键ctrl b ,
,然后再重新输入新窗口名称并按回车键保存更改即可。
ctrl b shift !
当我们在某个tmux窗口中使用了nmap命令之后,由于界面原因我们无法很好地查看nmap的输出结果,此时我们就可以使用组合键ctrl b shift !
来将当前的tmux窗格中的nmap输出结果发送到一个新的tmux窗口中以方便我们进行查看。
如上图所示,我们可以看到nmap命令的输出结果被发送到了一个名为”bash”的新tmux窗口中。
如果想在多个tmux窗口之间进行切换,我们可以使用ctrl b n
来切换到下一个tmux窗口,或者使用ctrl b p
切换到前一个tmux窗口;此外,我们还可以选择使用组合键ctrl b w
来切换到我们所需的tmux窗口,此组合键需要我们结合方向键和Enter键来选择我们具体想要切换到的tmux窗口(见下图)。
移回侦察窗口。显示 Nmap 窗格已移动,并且有更多工作空间。
ctrl b shift &
如果一个tmux窗口已经失效并且需要被快速终止,那么我们就需要关闭该tmux窗口。在关闭tmux窗口时还将关闭当前所选择的tmux窗口中已经打开的任何tmux窗格。如果我们要杀死或者关闭一个tmux窗口,那么我们首先需要使用组合键ctrl b shift &
,然后再加上y键来确认关闭当前的tmux窗口,或者继续输入n键来保持当前的tmux窗口为打开状态。
命令后提示。
关闭侦察窗口。名称 recon 将从下面的状态栏中删除。
ctrl b shift :
在此任务的前面部分,演示了如何将窗格分解到其自己的窗口中。但是,有时需要将两个窗口融合在一起作为单个窗口。
我们需要先输入组合键ctrl b shift :
,然后在tmux提示符中输入join-pane -t <window-name>
或者join-pane -s <window-name>
,其中-s表示源窗口名称,-t表示目标窗口名称。
按下回车键来运行连接窗格命令即可:
Task 5 Tmux “copy” mode
tmux复制模式可用于上下滚动以查看页面内容,如果tmux会话中的文本内容大于tmux窗格的长度或者tmux窗口的大小,那么我们就需要启动复制模式。
我们可以输入组合键ctrl b [
来进入tmux复制模式,然后就可以上下滚动以查看页面,此时我们还可以使用q键来退出复制模式。
在tmux复制模式下,我们可以键入ctrl r
和我们要搜索的字符串或关键词来向上查找页面内容,然后按住ctrl键并再次按r键就可以让我们跳转到下一个字符串位置,并且按下回车键还可以让我们恢复到页面滚动状态,此时鼠标光标将停止在我们所搜索的字符串位置。
在tmux复制模式下,我们还可以使用ctrl s
并附加字符串来向下搜索页面,按住ctrl键并再次按s键可以让我们跳转到下一个字符串位置,并且按下回车键可以让我们恢复到页面滚动状态,此时鼠标光标将停止在我们所搜索的字符串位置。
在tmux复制模式下执行复制和粘贴操作需要5个步骤。
注意:这个方法只适用于tmux剪贴板。
1.按下组合键ctrl b [
来进入复制模式;
2.滚动到要复制的文本块的开头
3.使用ctrl+空格键启用高亮显示,然后使用方向键向上选择所有文本,如果我们从顶部开始,就使用向下的方向键。
4.使用alt w
键来复制所有高亮显示的文本到tmux剪贴板中;
5.创建一个新文件,然后再用ctrl b ]
组合键来粘贴最终的文本内容。
如果我们想检查当前复制到tmux剪贴板中的文本,那么我们可以使用组合键ctrl b shift #
来完成。
请注意:即使文本内容可能看起来被破坏了,也不要担心它的粘贴情况,因为它是在终端文件编辑器中复制的,我们按q键退出复制模式,然后回到终端界面创建文件并粘贴我们所复制的文本内容即可。
Task 6 Oh My Tmux and beyond
在默认情况下,Tmux并没有默认的配置文件,但是我们也可以创建一个自定义的tmux配置文件。
在为tmux制作自定义配置文件之前,可以先显示tmux默认值的所有选项,我们使用tmux show -g
命令即可显示tmux的全局参数。
我们所需要创建的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窗口。
通过设置历史限制还允许我们让tmux复制模式具有更高级别的最大字符限制,这对于复制超出默认tmux历史限制的输出内容非常有用。
set -g history-limit 9001
配置文件内容中这一行允许我们设置历史限制,以便修改在tmux复制模式下的最大字符限制
针对tmux状态栏的左侧,我们可以使用set或set-option中的status-left来进行自定义设置。在下面的例子中:第一行内容中的status-left-length被设置为15,该设置的作用是定义可以在tmux状态栏左侧显示的字符总数;第二行内容则是用Linux命令echo来显示“Try harder”字符串。
然后我们可以用以下方法来重新加载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状态栏内容将发生变化):
当我们将Linux命令的输出通过写入配置文件来添加到tmux状态栏时,有时候配置文件中的Linux命令将不会正常工作。为了解决这个问题,我们可以将所需要执行的一行Linux代码或脚本放入一个单独文件中,然后再使用chmod使其变得可执行,最后再将其写入到tmux配置文件中。
我们将包含Linux命令的脚本的相关路径写入到tmux配置文件中,然后重新加载.tmux.conf文件即可。
除了能够调用脚本之外,tmux配置文件.tmux.conf还可以调用一些自定义插件,例如以下来自于Github的插件:
- https://github.com/tmux-plugins/tmux-resurrect.git :保存tmux会话以便在系统重启后恢复。
- https://github.com/tmux-plugins/tmux-logging.git :该插件用于创建命令历史记录以供以后查看。
- https://github.com/tmux-plugins/tmux-yank.git :该插件用于从tmux剪贴板外部复制文本以便文本内容与其他程序一起使用。
如以下示例所示,我们将加载一个插件:tmux-logging(这是一个可以获取tmux窗格截图、每个tmux窗格的历史以及tmux的完整历史记录的插件)。
重新加载tmux配置文件,如果我们要为当前所选定的tmux窗格记录命令历史,可以使用ctrl b shift P组合键,这将在当前系统用户的主目录中启动一个日志文件。
当我们重新加载了tmux配置文件之后,又出现了一个新的问题:之前我们所添加的script.sh脚本(包含whoami命令)会在tmux状态栏中打印一个重复的字符串。
这是因为我们之前在添加脚本时对set status-right选项使用了-a或append参数,这样当我们重新加载tmux配置文件.tmux.conf时就会重复打印内容,而这个问题可以通过在配置文件内容中使用-g或global参数来解决。
现在重新加载.tmux.conf文件,可以看到仅使用全局参数-g能够让我们从tmux状态栏右侧删除主机名、时间和日期并且不会重复打印字符串。
但是,如果我们想获得与使用-ga参数相同格式的状态栏输出而仅去除重复打印字符串的缺陷,那么我们可以在配置文件内容中使用以下参数:
#H
:表示主机名的占位符。%H
:表示是时钟中的小时和分钟。%d-%b-%y
:表示日、月、年。
然后我们再重新加载配置文件,我们可以看到tmux状态栏的显示一切正常,并且在我们以后尝试重新加载配置文件时也不会再因为script.sh而重复打印字符串。
如果我们不喜欢tmux复制模式的快捷键(在默认情况下,它们被设置为emacs),我们可以通过向配置文件添加set -g mode-keys vi
参数内容来进行更改。
完成内容添加之后我们再保存.tmux.conf脚本并重新加载脚本即可,我们将基于配置文件的设置并按照以下步骤来进行tmux内容复制。
- 按下**ctrl b [**组合键进入tmux复制模式;
- 使用方向箭头键来选中我们想要复制的内容;
- 按下spacebar空格键并后跟方向箭头键来突出显示所有被选中要进行复制的文本;
- 按下enter键复制高亮显示部分的文本内容到tmux剪贴板中;
- 按下**ctrl b ]**组合键粘贴tmux剪贴板中的内容。
为了让tmux复制模式变得更像是在vi文件编辑器中进行文本块复制操作,我们可以继续向配置文件添加如下几行内容:
以上设置将允许我们打开鼠标模式,这能让我们使用鼠标来调整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。
然后我们再使用git clone命令来安装上述的tmuxconfig存储库,并将该存储库中隐藏的.tmux.conf文件复制到/home/username/主目录下:
注意:下图所使用的命令是在我们使用了git clone命令($ git clone https://github.com/chaosma/tmuxconfig
)之后再执行的。
最后,我们可以运行一个新的tmux会话或者重新加载tmux配置文件.tmux.conf以便查看tmux窗口的更改情况。
如果我们要将配置脚本更改回来,那就需要再次替换主目录中的.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会话的状态
Task 7 Oreo’s open-source .tmux.conf file
我们可以使用以下命令来加载与本文实验示例相关的开源.tmux.conf文件:
1 | #!/bin/bash |