2017-02-21 1 views
0

Ich versuche, ein Skript in bash zu schreiben, die eine Zeile automatisch hinzufügen werden/eine Zeile in /etc/rsyslog.conf ersetzen, wenn die Netzwerk-Gateway Änderungen. Dies würde die Verteilung eines rsyslog-Servers mit direkter Protokollierung in eine bestimmte Protokolldatei ermöglichen.Beziehen Gateway-IP von Bash-Skript fehlschlägt, funktioniert aber im Terminal

Ich konnte nicht feststellen, warum dies fehlschlägt und hoffe, dass jemand mit einem besseren Verständnis ansprechen kann.

Folgendes ist das Skript.

#!/bin/bash 
GETGATEWAY="route -n | grep 'UG[ \t]' | awk '{print \$2}'" 
echo "This is a test" 
echo $GETGATEWAY 
shopt -s extglob 
$GETGATEWAY 

Ergebnis folgt.

Dies ist eine Testroute -n | grep 'UG [\ t]' | awk '{print $ 2}' Verwendung: route [-nNvee] [-FC] [] Kernel-Routingtabellen auflisten route [-v] [-FFC] {hinzufügen | del | flush} ... Routing-Tabelle für AF ändern .

route {-h|--help} [<AF>]    Detailed usage syntax for specified AF. 
    route {-V|--version}     Display version/author and exit. 

    -v, --verbose   be verbose 
    -n, --numeric   don't resolve names 
    -e, --extend    display other/more information 
    -F, --fib    display Forwarding Information Base (default) 
    -C, --cache    display routing cache instead of FIB 

= '-A' oder '-' verwenden; Standard: inet Liste der möglichen Adressfamilien (die Routing unterstützen): inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25) netrom (AMPR-NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP) x25 (CCITT X.25)

Wenn Sie die Echo-Zeile kopieren, nachdem „Dies ist ein Test“ und auf dem Terminal einfügen auszuführen, es funktioniert wie erwartet. route -n | grep 'UG [\ t]' | awk '{print $ 2}'

Ich habe mehr Shell-Optionen versucht, mit und ohne shopt es extglob.

+0

Unnötig Verwendung eines zusätzlichen _pipe_ und 'grep' wenn' route -n | awk '/ UG [\ t]/{print $ 2}' 'erzeugt die gleichen Ergebnisse wie' route -n | grep 'UG [\ t]' | awk '{print $ 2}' tut es! – user3439894

Antwort

0

Ich bin nicht sicher, warum Sie die Befehlssequenz in einer Variablen speichern und dann versuchen, es durch eine Auswertung auszuführen ($var). Sie können dies tun:

eval "$GETGATEWAY" 

Ohne eval, Shell interpretiert route als Befehl und alles andere, einschließlich | usw. als Argumente zu. Und extglob Option hat damit nichts zu tun.

Sie können einen Blick auf diesen Posten zu übernehmen wollen:

Why should eval be avoided in Bash, and what should I use instead?

0

Sie Befehl Substitution Adresse für die Berechnung des IP verwenden sollte und es auf jede Variable zu speichern.

var=$(command1|command2|....) 

Beispiel:

GATEWAY=$(route -n |awk '/UG/{print $2}') 
echo $GATEWAY 
10.1.1.1 
Verwandte Themen