zoukankan      html  css  js  c++  java
  • tmux的使用

    tmux的使用

    1: tmux的介绍
        tmux是一个优秀的终端多路复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;当然其功能远不止于此。
     
    tmux的架构图:
     
    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
     
    #######################################
     
    启动后的界面效果
    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

  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/10193514.html
Copyright © 2011-2022 走看看