持久 shell 参数

持久 shell 参数

我经常发现自己对一组参数运行一系列命令。

例如:

$ 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>

我正在寻找bashzsh解决方案。该解决方案必须使用任意一组命令。

答案1

Alt-_已经插入了最后一个命令的最后一个单词。对我来说,这已经足够了,但是您可以添加另一个键绑定来插入空格、最后一个单词并接受行 ( Enter)。

tcshzsh(对于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>才会在匹配中被考虑。

相关内容