![Bash „virtuelles“ Präfixterminal](https://rvso.com/image/1607084/Bash%20%E2%80%9Evirtuelles%E2%80%9C%20Pr%C3%A4fixterminal.png)
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-cmd
wie in Ihrem Beispiel auf.
Beachten Sie, firewall-cmd
dass 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-cmd
beim Eintippen und (nicht ) --list-all; date
ausgeführt .firewall-cmd --list-all
date
firewall-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).