Bash «виртуальный» префиксный терминал

Bash «виртуальный» префиксный терминал

Я настраиваю брандмауэр с помощью firewall-cmd, но даже простое набирание firewall-cmd каждый раз занимает много времени.

Можно ли создать временную «виртуальную» оболочку или что-то в этом роде, что будет добавлять firewall-cmd к каждому последующему вводу?

Пример :

$ coolcommand firewall-cmd
> --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
[.....]
> --add-service https
> ^C
$

Спасибо

решение1

Цикл с eval, например такой:

coolcommand () { while IFS= read -rep "> $1 " line; do eval "$1 $line"; done; }

Затем вызовите coolcommand firewall-cmd, как в вашем примере.

Примечание firewall-cmd"приклеивается" к началу каждой набираемой вами строки, но именно оболочка по-прежнему оценивает полученную строку. Поэтому $, *, ;, #, кавычки и т. п. по-прежнему являются специальными. В частности, после coolcommand firewall-cmd, ввод --list-all; dateбудет выполняться firewall-cmd --list-allи date(не firewall-cmd date).


Улучшения для лучшего опыта:

  • Также можно передать команду с аргументом(ами). Пример:

      coolcommand 'printf "foo %s\n"'
    
  • То же самое, что и скрипт. Добавлена ​​поддержка истории:

      #!/bin/bash
    
      unset HISTFILE
      HISTCONTROL=ignoreboth
    
      while IFS= read -rep "> $1 " line; do
         history -s "$line"
         eval "$1 $line"
      done
    

История не сохраняется, когда скрипт собирается завершить работу, однако при однократном вызове она должна работать ( / как обычно в Bash).

Связанный контент