Bash „virtuelles“ Präfixterminal

Bash „virtuelles“ Präfixterminal

Ich richte die Firewall mithilfe von „Firewall-cmd“ ein, aber es kostet sehr viel Zeit, jedes Mal einfach „Firewall-cmd“ einzugeben.

Ist es möglich, eine temporäre „virtuelle“ Shell oder etwas zu erstellen, das an jede folgende Eingabe einen Firewall-Befehl anhängt?

Beispiel :

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

Danke

Antwort1

Eine Schleife mit eval, wie folgt:

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

Rufen Sie es dann coolcommand firewall-cmdwie in Ihrem Beispiel auf.

Beachten Sie, firewall-cmddass an den Anfang jeder eingegebenen Zeile „geklebt“ wird, aber es ist immer noch die Shell, die den resultierenden String auswertet. Daher sind $, *, ;, #, Anführungszeichen oder ähnliches immer noch etwas Besonderes. Insbesondere nach wird coolcommand firewall-cmdbeim Eintippen und (nicht ) --list-all; dateausgeführt .firewall-cmd --list-alldatefirewall-cmd date


Verbesserungen für ein besseres Erlebnis:

  • Es ist auch möglich, einen Befehl mit Argument(en) zu übergeben. Beispiel:

      coolcommand 'printf "foo %s\n"'
    
  • Dasselbe wie ein Skript. Unterstützung für Verlauf hinzugefügt:

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

Der Verlauf wird nicht gespeichert, wenn das Skript beendet wird; dennoch sollte es während eines einzelnen Aufrufs funktionieren ( / wie normalerweise in Bash).

verwandte Informationen