在玩靶场的过程中,经常遇到输入一些常见指令的情况,比如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。
有更好方法的欢迎留言指教。