使用dmenu或fzf实现快捷键在tmux当前面板中输入自定义常用指令

在玩靶场的过程中,经常遇到输入一些常见指令的情况,比如nc监听、python切换交互终端等。每次复制粘贴比较繁琐,zsh虽然有历史命令功能,但有时需要配合Ctrl+R进行查找。今天找到了一种更简单的方法,使用dmenu或fzf实现在当前激活的tmux分屏面板中快捷执行保存的常用指令。

一、使用dmenu

安装dmenu后,建立一个自定义脚本,内容如下:

  1 pane_id=$(tmux display-message -p '#{pane_index}')                                                                                                                         
  2 commands=$(cat /opt/dmenu_commands.txt)
  3 choice=$(echo "$commands" | dmenu -i -l 10 -p "Choose a command" )
  4 if [ -n "$choice" ]; then
  5         tmux send-keys -t "$pane_id" "$choice" Enter
  6 fi

其中,/opt/dmenu_commands.txt中保存自己常用的指令。然后给该脚本增加快捷键,在Setting->Keyboard->Application Shortcuts中设置。

运行效果如下,按Super(也就是win)+R,弹出常用指令选择面板,回车后在激活的tmux面板中就执行所选指令了。

二、使用fzf

fzf可以在光标当前位置弹出窗口进行快捷选择和操作,感觉界面比dmenu更加友好,如图。

只需要建立自定义脚本,其中选择tmux面板的部分和前述一样。

└─$ cat /opt/rfzf.sh               
pane_id=$(tmux display-message -p '#{pane_index}')
#commands="cat /opt/dmenu_commands.txt|fzf -e --bind \"enter:execute(echo \$ {};eval {})+abort\""
commands="print -z \$(history |sed -re 's/ *[0-9]* *//'|fzf --tac --no-sort)"
tmux send-keys -t "$pane_id" "$commands"  Enter

第一个commands中:-e表示精确搜索,--bind后面表示回车后就运行所选命令(否则只输出不运行),abort表示运行后退出fzf(否则会保持在fzf界面而在后台执行)。
第二个commands,是实现历史命令只上屏,不运行,也非常方便。
然后同样步骤建立系统快捷键即可。

顺便寻一段fzf的操作录像作演示。

三、结论

最后我选择使用哪种方法呢?由于fzf无法在反弹shell里使用,还是dmenu适应范围更广,但历史命令搜索必须用fzf。
有更好方法的欢迎留言指教。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注