tmux的使用
1: tmux的介绍
tmux是一个优秀的终端多路复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;当然其功能远不止于此。
tmux的架构图:
![](file:///F:/WizNote/My%20Knowledge/temp/703b46ff-0b24-40c5-ba4f-a867a6cdbc12_128_files/56b7d64a-6787-4d1f-857c-7c89daf2c355.png)
![](https://img2018.cnblogs.com/blog/825468/201812/825468-20181229002528547-298409683.png)
tmux使用C/S模型构建,主要包括以下单元模块:
一个tmux命令执行后启动一个tmux服务
一个tmux服务可以拥有多个session,一个session可以看作是tmux管理下的伪终端的一个集合
一个session可能会有多个window与之关联,每个window都是一个伪终端,会占据整个屏幕
一个window可以被分割成多个pane
kill-window可以关闭当前窗口,kill-session可以结束当前会话,kill-server可以停止服务器.
$ tmux # 运行 tmux -2 以256终端运行
$ C-b d # 返回主 shell , tmux 依旧在后台运行,里面的命令也保持运行状态
$ tmux ls # 显示已有tmux会话(C-b s)
$ tmux attach-session -t 数字 # 选择tmux
$ tmux new-session -s session-name #建立会话
$ tmux new -s session -d #在后台建立会话
$ tmux kill-session -t session-name # 结束会话
一键启动远程主机上的 tmux
$ ssh -t username@server.com tmux
如果你之前在远程主机上已经开启了 tmux 的话,用以下命令。
$ ssh -t username@server.com tmux att
$ ssh -t username@server.com tmux attach-session -t 数字
除此之外,你可以结合第二条命令来绑定快捷键,这样我们只需一键就可以快速登录并开启 tmux 了。
为什么使用tmux:
tmux比screen有更多的功能,能够保持你的工作环境连续性。例如tmux解决如下的问题:
1)下班后,你需要断开ssh或关闭电脑,你的ssh连接将丢失;
2)在公司打开的ssh,在家里也需要访问;
2. tmux的安装
可以使用Ports安装tmux,位置在/usr/ports/sysutils/tmux/;tmux仅有一个依赖包libevent,位于/usr/ports/devel/libevent/。
安装完成后输入命令tmux即可打开软件,界面十分简单,类似一个下方带有状态栏的终端控制台;但根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板,虽然其使用方法与终端控制台完全相同。
tmux使用C/S模型构建,主要包括以下单元模块:
server 服务器。输入tmux命令时就开启了一个服务器。
session 会话。一个服务器可以包含多个会话。
window 窗口。一个会话可以包含多个窗口。
pane 面板。一个窗口可以包含多个面板。
ubuntu系统下的安装
$ sudo aptitude install tmux
3. tmux的配置
tmux完全使用键盘控制窗口,实现窗口的切换,像是Chrome的方式管理shell,使用起来很方便。
tmux命令都具有一个前缀命令(PREFIX),默认的是CTRL+b,可以自己修改,改为CTRL+a。
tmux的系统级配置文件为/etc/tmux.conf,用户级配置文件为~/.tmux.conf。配置文件实际上就是tmux的命令集合,也就是说每行配置均可在进入命令行模式后输入生效。
下面是一个~/.tmux.conf的示例,其中包括了一些常用的配置:
lsgx@lsgx-ubuntu:work$ cat ~/.tmux.conf
########################################
#
# author : lsgx <lsgxthink@gmail.com>
# modified : 2014-11-12
#
#-- base settings --#
set -g default-terminal "screen-256color" # 设置终端缺省的支持颜色为256色
set -g display-time 3000 # 提示信息的持续时间;设置足够的时间以避免看不清提示,单位为毫秒
set -g escape-time 0 # 等待时间的持续时间;设置越小越好
set -g history-limit 65535 # 历史记录条数的最大限制值
#set -g base-index 1 # 窗口的初始序号;默认为0,这里设置为1
#set -g pane-base-index 1 # 面板的初始序号;默认为0,这里设置为1
#set -sg repeat-time 600 # 控制台激活后的持续时间;设置合适的时间以避免每次操作都要先激活控制台,单位为毫秒
#set -s quiet on
#setw -g xterm-keys on
#-- bindkeys --#
# prefix key (Ctrl+a) # 将激活控制台的快捷键由Ctrl+b修改为Ctrl+a
set -g prefix ^a
unbind ^b
bind a send-prefix
# split window # 窗口分割
unbind '"'
bind - splitw -v # vertical split (prefix -) # 上下分割窗口
unbind %
bind | splitw -h # horizontal split (prefix |) # 左右分割窗口
# select pane # 选择面板
bind k selectp -U # above (prefix k) # 选择上面板
bind j selectp -D # below (prefix j) # 选择下面板
bind h selectp -L # left (prefix h) # 选择左面板
bind l selectp -R # right (prefix l) # 选择右面板
# resize pane
bind -r ^k resizep -U 2 # upward (prefix Ctrl+k) # 当前面板上移2
bind -r ^j resizep -D 2 # downward (prefix Ctrl+j) # 当前面板下移2
bind -r ^h resizep -L 2 # to the left (prefix Ctrl+h) # 当前面板左移2
bind -r ^l resizep -R 2 # to the right (prefix Ctrl+l) # 当前面板右移2
# swap pane
bind ^u swapp -U # swap with the previous pane (prefix Ctrl+u) # 与上面板交换
bind ^d swapp -D # swap with the next pane (prefix Ctrl+d) # 与下面板交换
# create new session
bind C-c new-session # 创建一个新的会话
# control sessions
bind z kill-session # 结束一个会话
# find session
bind C-f command-prompt -p find-session 'switch-client -t %%' # 查找会话
# clear both screen and history
#bind -n C-l send-keys C-l ; run 'tmux clear-history' # 清空屏幕内容和历史记录
# reload config (prefix r)
bind r source ~/.tmux.conf ; display "Configuration reloaded!" # 重新加载配置文件
# misc
bind e lastp # select the last pane (prefix e) # 选择最后一个面板
bind ^e last # select the last window (prefix Ctrl+e) # 选择最后一个窗口
bind q killp # kill pane (prefix q) # 关闭当前面板
bind ^q killw # kill window (prefix Ctrl+q) # 关闭当前窗口
# app
bind ! splitw htop # htop (prefix !)
bind m command-prompt "splitw 'exec man %%'" # man (prefix m)
bind @ command-prompt "splitw 'exec perldoc -t -f %%'" # perl func (prefix @)
bind * command-prompt "splitw 'exec perldoc -t -v %%'" # perl var (prefix *)
bind % command-prompt "splitw 'exec perldoc -t %%'" # perl doc (prefix %)
bind / command-prompt "splitw 'exec ri %%'" # ruby doc (prefix /)
#-- statusbar --#
set -g status-utf8 on # 开启状态栏的UTF-8支持
set -g status-interval 1 # 状态栏的分辨时间间隔
set -g status-keys vi # 操作状态栏时的默认键盘布局;可以设置为vi或emacs
set -g visual-activity on # 开启窗口操作的可视
set -g set-clipboard on # 开启剪切板
set -g display-panes-time 800 # slightly longer pane indicators display time # 稍长的窗格中显示的时间指标
set -g display-time 1000 # slightly longer status messages display time # 稍长的状态消息的显示时间
set -g renumber-windows on # renumber windows when a window is closed # 关闭窗口后重新编号
setw -g automatic-rename on # rename window to reflect current program # 重命名窗口,以反映当前的程序
setw -g utf8 on # 开启窗口的UTF-8支持
setw -g monitor-activity on # 开启窗口活动监视
setw -g mode-keys vi # 复制模式中的默认键盘布局;可以设置为vi或emacs
setw -g clock-mode-style 24 # 24 hour clock # 24小时显示方式
#setw -g mode-mouse on # 开启鼠标模式
# copy mode
bind Enter copy-mode # enter copy mode # 按Enter进入复制模式
bind b list-buffers # list paster buffers # 复制缓冲区列表
bind p paste-buffer # paste from the top pate buffer # 粘贴最后复制的缓冲区内容
bind P choose-buffer # choose which buffer to paste from # 选择粘贴缓冲区
# the following vi-copy bindings match my vim settings
# see https://github.com/gpakosz/.vim.git
bind -t vi-copy v begin-selection # 复制模式下开始选取
bind -t vi-copy C-v rectangle-toggle # 复制模式下矩形选取
bind -t vi-copy y copy-selection # 复制模式下复制选取的内容
bind -t vi-copy Escape cancel # 复制模式下退出复制模式
bind -t vi-copy H start-of-line # 复制模式下开始行选取
bind -t vi-copy L end-of-line # 复制模式下结束行选取
# mouse resize selcet
#setw -g mouse-resize-pane on # 鼠标调整面板大小
#setw -g mouse-select-pane on # 鼠标选择面板
#setw -g mouse-select-window on # 鼠标选择窗口
# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer "$(xclip -o -sel clipbaord)"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux show-buffer | xclip -i -sel clipbaord"
#-- colorscheme --#
# see also: https://github.com/daethorian/conf-tmux/blob/master/colors/zenburn.conf
# modes
setw -g clock-mode-colour colour223
setw -g mode-attr bold
setw -g mode-fg colour223
setw -g mode-bg colour235
# panes
set -g pane-border-bg colour234
set -g pane-border-fg colour234
set -g pane-active-border-bg colour232
set -g pane-active-border-fg colour232
# statusbar
set -g status-justify centre
set -g status-bg colour235
set -g status-fg colour248
set -g status-attr dim
set -g status-left "#[fg=green,bright]Session: #S #[fg=yellow,bright]Window: #I #[fg=cyan,bright]Pane: #P"
set -g status-left-attr bright
set -g status-left-length 30
set -g status-right "#[fg=yellow,bright][ #[fg=cyan,bright]#W #[fg=yellow,bright]]#[default] #[fg=yellow,bright]- %Y.%m.%d #[fg=green,bright]%H:%M #[default]"
set -g status-right-attr bright
set-option -g status-right-length 30
setw -g window-status-current-fg colour223
setw -g window-status-current-bg colour237
setw -g window-status-current-attr bold
#setw -g window-status-current-format "#I:#W#F"
#setw -g window-status-alert-attr bold
#setw -g window-status-alert-fg colour255
#setw -g window-status-alert-bg colour160
# messages
set -g message-attr bold
set -g message-fg colour223
set -g message-bg colour235
#######################################
启动后的界面效果
![](file:///F:/WizNote/My%20Knowledge/temp/703b46ff-0b24-40c5-ba4f-a867a6cdbc12_128_files/4e646356-f7c4-4a3b-a685-616e6630ad8f.png)
![](https://img2018.cnblogs.com/blog/825468/201812/825468-20181229002552685-1220704973.png)
4. tmux的使用
基本操作使用
$ tmux #运行tmux -2 以256色终端运行
$ C-a d # 返回主shell,tmux依旧在后台运行,里面的命令也保持运行状态
$ tmux new -s session-name # 建立名字为session-name的会话
$ tmux new -s session-name -d # 在后台建立名字为session-name的会话
$ tmux ls # 显示已有的tmux会话(C-a s)
$ tmux attach-session -t session-name # 连接已经存在的名为session-name的会话
$ tmux kill-session -t session-name # 结束已经存在的名为session-name的会话
*** 控制台-操作说明 ***
$ Ctrl+a // 激活控制台
$
$ ** 系统操作
$ ? // 列出所有快捷键;按q返回
$ d // 脱离当前会话;
$ D // 选择要脱离的会话;在同时开启了多个会话时使用
$ Ctrl+z // 挂起当前会话
$ z // 结束当前会话
$ r // 重新加载配置文件
$ s // 选择并切换会话;在同时开启了多个会话时使用
$ : // 进入命令行模式;
$ :new-session // 创建新会话
$ Enter // 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出 (必须先进入复制模式才可以滚屏)
$ ~ // 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息
$
$ ** 会话操作
$ ( preview session
$ ) next session
$ s list session
$ $ rename seesion
$ Ctrl+c // 创建一个会话
$ c // 创建一个窗口
$ z // 结束一个会话
$ Ctrl+z // 挂起一个会话
$ Ctrl+f // 查找一个会话
$ f // 查找一个窗口
$ [0~9] // 跳到指定的窗口
$ e // 最后一个面板
$ Ctrl+e // 最后一个窗口
$ q // 关闭当前面板
$ Ctrl+q // 关闭窗口
$
$
$ ** 窗口操作
$ c // 创建新窗口
$ & // 关闭当前窗口
$ [0-9] // 切换至指定窗口
$ w // 通过窗口列表切换窗口
$ , // 重命名当前窗口;这样便于识别
$ . // 修改当前窗口编号;相当于窗口重新排序
$ i // 显示tmux当前信息
$
$ ** 面板操作
$ - // 将当前面板平分为上下两块|横向切割 --> 分割成面板
$ | // 将当前面板平分为左右两块|竖向切割 --> 分割成面板
$ k // 选择上面板
$ j // 选择下面板
$ h // 选择左面板
$ l // 选择右面板
$ Ctrl+k // 当前面板上移2
$ Ctrl+j // 当前面板下移2
$ Ctrl+h // 当前面板左移2
$ Ctrl+l // 当前面板右移2
$ x // 关闭当前面板
$ ; // 切换到最后的pane
$ Space // 在预置的面板布局中循环切换;依次包括:
$ even-horizontal、
$ even-vertical、
$ main-horizontal、
$ main-vertical、
$ tiled
$ o // 在当前窗口中选择下一面板
$ { // 向前置换当前面板
$ } // 向后置换当前面板
$ Ctrl+u) // 与上面板交换
$ Ctrl+d) // 与下面板交换
$ 方向键 // 移动光标以选择面板
$ Alt+o // 逆时针旋转当前窗口的面板
$ Ctrl+o // 顺时针旋转当前窗口的面板
$
使用命令提示:
1 为 man 手册创建 pdf 版本
man -t manpage | ps2pdf - filename.pdf
比如制作 ls 命令的 man 手册 pdf 文件
man -t ls | ps2pdf - ls.pdf
2 为命令绑定快捷键
bind -x '"C-l":ls -l'
这样直接按 CTRL+L 就列出目录了,你可以把这条命令加入到 ~/.bashrc 中,这样不必每次重复设定。
3 一键启动远程主机上的 tmux
tmux 是一个 GNU Screen 的替代品,一个可以在终端里开启多窗口的工具,可以说是很好用的远程服务维护工具,通过以下命令就可以在终端中一条命令直接开启远程服务器上的 tmux 。
ssh -t username@server.com tmux
如果你之前在远程主机上已经开启了 tmux 的话,用以下命令。
ssh -t username@server.com tmux att
除此之外,你可以结合第二条命令来绑定快捷键,这样我们只需一键就可以快速登录并开启 tmux 了。
4 用 file 命令查看设备信息
file -s /dev/sd*
5 用 md5 值对比两个文件是否一致
cmp file1 file2
一致的话不会出现提示,不一致的话就会有提示信息
6 一条命令把 CD/DVD 作成 ISO 文件
dd if=/dev/cdrom of=file.iso
7 通过 ssh 复制整个硬盘到远程目录(带压缩)
dd if=/dev/sda | gzip -c | ssh user@ip 'dd of=/mnt/backups/sda.dd'
8 不浪费磁盘的情况下测试网络速度
dd if=/dev/zero bs=4096 count=1048576 | ssh user@ip 'cat > /dev/null'
以上命令通过 ssh 发送 4 GB 数据到远程主机,但不会占用任何磁盘空间。
静态编译 Tmux
最近开始使用 Tmux 之后,感觉还是在服务器上才能发挥出 Tmux 的价值。可惜的是公司的服务器上没有安装 Tmux,跳板机上我也只有普通用户权限,没法安装软件,于是我琢磨着从源码编译一个。
Tmux 唯一的依赖是 libevent,所以我需要先把它编译出来。之前我编译软件之后都是直接使用 root 权限,如今没有了 root 权限,安装软件都成了让我拙计的事情。
先从最近声名狼藉的 sourceforge 把 libevent 的源码包抓下来,然后从 Github 把 tmux 的源码包也抓下来。
wget -c https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
wget -c https://github.com/tmux/tmux/releases/download/2.0/tmux-2.0.tar.gz
解压之后开始配置编译过程。当我们没有 root 权限的时候,编译之前就要设置软件的安装目录了。
./configure --prefix=~/libevent
make
make install
不同的软件编译配置不尽相同,但是作为一个约定, configire -h
总是能给出当前命令的帮助文档。
安装 libevent 到指定目录之后,可以开始编译 tmux。因为要让 tmux 的 configure 脚本找到 libevent,tmux 的安装命令稍显复杂。
./configure --prefix=~/tmux --enable-static CFLAGS=-I~/libevent/include LDFLAGS=-L~/libevent/lib
make
make install
CFLAGS 是 C 编译器参数,-I 后面带着需要引用的头文件的路径。LDFLAGS 是链接器的参数,-L后面带着库文件的路径。
与 libevent 的默认开启静态链接不同,配置 tmux 编译过程时需要显示开启静态链接,否则以后运行 tmux 的时候都需要在动态库目录中包含 libevent 的动态库。当然,静态链接之后的二进制文件会相应的大一些。
=================== End