我经常发现自己对一组参数运行一系列命令。
例如:
$ nmap -Pn -sS 192.168.1.5
$ ssh 192.168.1.5
$ curl 192.168.1.5
$ wget -r 192.168.1.5
通过将参数放入变量中可以加快速度,
$ a=192.168.1.5
$ nmap -Pn -sS $a
$ ssh $a
$ curl $a
$ wget -r $a
并通过使用如下几个功能进一步加快速度。
$ more .zshrc
...
paa() { PERSIST_ARGS+=("$@"); }
pa() { eval "$@" "${PERSIST_ARGS[@]}"; }
...
$ paa 192.168.1.5
$ pa nmap -Pn -sS
$ pa ssh
$ pa curl
$ pa wget -r
有没有办法进一步加快速度?例如,
$ <start special mode> 192.168.1.5
$ nmap -Pn -sS
$ ssh
$ curl
$ wget -r
$ <exit special mode>
我正在寻找bash
或zsh
解决方案。该解决方案必须使用任意一组命令。
答案1
Alt-_已经插入了最后一个命令的最后一个单词。对我来说,这已经足够了,但是您可以添加另一个键绑定来插入空格、最后一个单词并接受行 ( Enter)。
与tcsh
或zsh
(对于Alt-S,S
对于same
):
bindkey -s '\es' ' \e_\r'
和bash
:
bind '"\es": " \e_\r"'
然后输入:
$ nmap -Pn -sS 192.168.1.5
$ ssh<Alt-S>
$ curl<Alt-S>
...
在zsh
并且tcsh
至少在数值论证(即当您在其前面加上Alt-<number>) 将应用于空格字符,这不是很有用(Alt-3Alt-S将插入 3 个空格,最后一个单词一次并接受该行)。让其插入以下任一内容会更有用n最后一个命令的最后一个字,或n最后一个命令,或最后一个n最后一个命令中的单词。
至少zsh
,您可以定义一个新的小部件,而不是使用宏。例如:
use-last-word() {
LBUFFER+=" "
zle insert-last-word
zle accept-line
}
zle -N use-last-word
bindkey '\es' use-last-word
Alt-3Alt-S将插入最后一个命令中的第三个最后一个单词。
要插入倒数第三个命令中的最后一个单词:
use-last-word() {
LBUFFER+=" "
local n=$NUMERIC
unset NUMERIC
repeat ${n:-1} zle insert-last-word
zle accept-line
}
要插入最后一个命令的最后 3 个单词:
use-last-word() {
for ((NUMERIC=${NUMERIC:-1}; NUMERIC; NUMERIC--)) {
LBUFFER+=" "; zle insert-last-word
}
zle accept-line
}
答案2
我觉得这样回答自己的问题很不好,但我有一个解决方案:
pst() {
[ $# = 0 ] && return 1
if [ -n $ZSH_VERSION ]; then
local read=vared
else
local read=read
fi
local cmd
local -a args
args=("$@")
while $read -p '> ' cmd ; do
test -z "$cmd" && continue
$cmd "${args[@]}"
done
}
这是这样工作的:
$ pst 192.168.1.5
> nmap -Pn -sS
> ssh
> curl
> wget -r
我将把这个问题暂时搁置一段时间,看看是否会出现任何更好的解决方案。该解决方案的一个主要缺点是它运行的命令不会被记录。
答案3
我还没有实现类似的东西,但我想知道您是否可以利用 shell 提供的 2 个设施。 $PATH 和命令完成。
当您处于“特殊模式”时,您可以提供诸如选项卡完成之类的内容,但不必重复点击它,而是输入要运行 nm(对于 nmap)的实际命令的几个字母,然后点击组合键与 tab 类似,它会询问 $PATH 寻找与您到目前为止输入的内容相匹配的可执行文件,然后向您返回一个列表,如下所示:
我输入:
$ pst 192.168.1.5
> nm <press SHIFT-TAB>
我收到了以下列表:
1* - nmap 192.168.1.5 2 - nmap2 192.168.1.5 3 - nmap3 192.168.1.5
笔记:上面的列表将与我在询问$PATH
.
从上面的列表中,我可以按 Enter 接受第一个响应 (1*),或者输入我想要使用的匹配号码:
>> 2 <press ENTER>
您还可以将该complete
工具集成到 bash 和其他 shell 中来缩小匹配范围,以便只有可以接受所提供参数类型的匹配pst <arg>
才会在匹配中被考虑。