ausgabe von befehlen weiterverwenden

azereus

Rear Admiral
Registriert
Okt. 2007
Beiträge
5.547
hi

wie kann ich z.b. bei einer dig-abfrage die ausgabe weiterverwenden?
ziel ist es per funktion/script nur 1 befehl für mehrere anfragen zu nutzen
bin programmiertechnisch leider noch nicht soweit

beispiel:
d ist in meinem fall bereits ein alias der dig abkürzt
Code:
alias d='dig +nocomments +nostats +nocmd @8.8.8.8'

Code:
d mx computerbase.de
;computerbase.de.		IN	MX
computerbase.de.	59402	IN	MX	10 mxext1.mailbox.org.
computerbase.de.	59402	IN	MX	10 mxext2.mailbox.org.
computerbase.de.	59402	IN	MX	20 mxext3.mailbox.org.

es soll die ausgabe vom MX weiterverwendet werden
Code:
d a mxext1.mailbox.org
;mxext1.mailbox.org.		IN	A
mxext1.mailbox.org.	899	IN	A	80.241.60.212

und dann
Code:
d -x 80.241.60.212
;212.60.241.80.in-addr.arpa.	IN	PTR
212.60.241.80.in-addr.arpa. 299	IN	PTR	mx1.mailbox.org.

bräuchte nen denkanstoss wie ich das anstelle.

danke und lg
 
Arrays wären eine Sache...

Was genau willst Du erreichen?

Formuliere es in etwa so: Von Befehl x nimm Zeile y, Wert z für Befehl n.
 
Zuletzt bearbeitet:
werd ich mich mal einlesen in diese arrays

möchte erreichen das
Code:
 neuer-befehl domainname.tld

als ergebnis
Code:
computerbase.de.	59402	IN	MX	10 mxext1.mailbox.org.
mxext1.mailbox.org.	899	IN	A	80.241.60.212
212.60.241.80.in-addr.arpa. 299	IN	PTR	mx1.mailbox.org.
ausgibt
 
Also möchtest Du mehrere Ausgaben miteinander so verknüpfen, daß nur jeweils ein Wert einer bestimmten Zeile als Parameter für den nächsten Befehl ausgegeben wird.

Um zum Beispiel den sechsten Wert der Zeile 2 Deines Beispieles (Block 2, Post 1) auszugeben, wäre

Code:
echo $(dig +nocomments +nostats +nocmd @8.8.8.8 mx computerbase.de | tail -n -2 | head -n 1 | awk '{ print $6 }')

eine Möglichkeit, wobei hier das "echo" für einen weiteren Befehl stehen könnte, der diese Ausgabe weiter nutzen könnte. Für die alleine Ausgabe ist das Echo nicht erforderlich.

Einzelne Auflösung:

| tail -n -2: Ab der zweiten Zeile anzeigen
| head -n 1: nur die erste Zeile anzeigen
| awk '{ print $6 }': sechsten Wert ausgeben.

Zweite Möglichkeit:
Verwendung einer Variablen für Ausgabe und Weiterverarbeitung.
Code:
#!/bin/bash
declare -a AUSGABE=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx computerbase.de | tail -n -2 | head -n 1)
echo ${AUSGABE
[*]}
echo ${AUSGABE[5]}
exit 0

Zeile 3 liefert Dir die komplette Ausgabe der zweiten Zeile des Befehles,
Zeile 4 liefert Dir den sechsten Wert (Zählung von 0) des in Zeile 2 definierten Arrays.
 
Zuletzt bearbeitet:
so in etwa hab ich mir das vorgestellt. werd damit mal ein wenig experimentieren

/edit: nach deinem edit:

d.h. mit
Code:
#!/bin/bash
declare -a AUSGABE=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx computerbase.de | tail -n -2 | head -n 1)
echo ${AUSGABE[*]}
echo ${AUSGABE[6]}
exit 0
könnte ich das auch kombinieren

bsp:
Code:
#!/bin/bash
declare -a MX=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx computerbase.de | tail -n -2 | head -n 1)
echo ${MX[*]}
echo ${MX[6]}

declare -a ADNS=$(dig +nocomments +nostats +nocmd @8.8.8.8 a ${MX[6]} { | tail -n -2 | head -n 1)
echo ${ADNS[*]}
echo ${ADNS[6]}

declare -a PTR=$(dig +nocomments +nostats +nocmd @8.8.8.8 -x ${ADNS[6]} { | tail -n -2 | head -n 1)
echo ${PTR[*]}
echo ${PTR[6]}

exit 0

hab ich das so einigermassen richtig verstanden?
oder sind die 2 declare für ADNS+PTR zu viel?
 
Zuletzt bearbeitet:
mit "declare -a" erstellst Du jedes Mal ein Array. Das ist nur dann sinnvoll, wenn Du es auch wirklich als Array nutzen willst. Zweitens: Achte auf Deine geschweiften Klammern. In Zeile 6 und 10 ist die letzte geschweifte Klammer zu löschen.

Wenn Du den letzten Wert eines Arrays haben willst, brauchst Du:
Code:
# vorher falsch: i=$( echo "${#AUSGABE[@]} + 1" | bc )
i=$( echo "${#AUSGABE[@]} - 1" | bc )]
echo ${AUSGABE[$i]}

Wobei hier die zweite dritte Zeile nur als Überprüfung für Dich dient. Den Befehl "echo" kennst Du ja. Notwendig ist das Ganze, da die Anzahl der Elemente klar ab dem ersten vorhandenen Element von 1 an gezählt wird, die Adressierung der Elemente aber von 0 an. Ergo muß man +1 auf die Anzahl der Elemente aufrechnen, hier mit "bc" geschehen.Bull, man muß eins abziehen. Ich brauch 'n Kaffee.

Das Ganze kannst Du auch in einer einzelnen Zeile schachteln (wenn wir schon dabei sind):

Code:
#!/bin/bash
declare -a AUSGABE=(12 34 56 78 90)
echo ${AUSGABE[$(echo "${#AUSGABE[@]} - 1" |bc)]}
exit 0
 
Zuletzt bearbeitet:
da dürft ich mich vertippt haben in zeile 6+10 seh schon was du meinst
Code:
declare -a ADNS=$(dig +nocomments +nostats +nocmd @8.8.8.8 a ${MX[6]} | tail -n -2 | head -n 1)

ok also brauch ich das declare um eben meine variablen "MX, ADNS, PTR" zu definieren. check.

zusammengefasst müsste es dann mit
Code:
#!/bin/bash
declare -a MX=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx $TLD | tail -n -2 | head -n 1)
declare -a ADNS=$(dig +nocomments +nostats +nocmd @8.8.8.8 a ${MX[6]} | tail -n -2 | head -n 1)
declare -a PTR=$(dig +nocomments +nostats +nocmd @8.8.8.8 -x ${ADNS[6]} | tail -n -2 | head -n 1)
echo ${MX[*]}
echo ${ADNS[*]}
echo ${PTR[*]}
funktionieren

und meinen alias erstell ich dann
Code:
alias domaincheck='bash /scriptpfad.sh $TLD'

hab ich das so richtig verstanden?
 
Zuletzt bearbeitet:
Du brauchst, wenn Du das "execute" bit mit "chmod +xX ${script}" setzt, auch nicht mehr ein "bash" davorzusetzen beim alias.

Probier's doch einfach aus. Mit "bash +x ${script}" kannst Du übrigens das Script auch mit schrittweisen Rückmeldungen ausführen lassen zum debuggen.

Abkürzungen kannst Du auch innerhalb des scriptes verwenden. Also:

Code:
d(){
dig +nocomments +nostats +nocmd @8.8.8.8 mx $1 | tail -n -2 | head -n 1
}
declare -a MX=$(d ${TLD})
 
Zuletzt bearbeitet:
ich mach mal :D
https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfänger/ bin ich auch grad am lesen wegen dem "bash"
bist n schatz fürs helfen und erklären
meld mich dann nochmal

/edit: habs jetzt etwas anders gelöst weil ichs mit dem declare nicht hinbekomme
Code:
MX=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx $TLD | tail -n -1 | head -n 1 | awk '{ print $6}')
MX1=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx $TLD | tail -n -1 | head -n 1 | awk '{ print}')
echo $MX1
ADNS=$(dig +nocomments +nostats +nocmd @8.8.8.8 a $MX | tail -n -1 | head -n 1 | awk '{ print $5}')
ADNS1=$(dig +nocomments +nostats +nocmd @8.8.8.8 a $MX | tail -n -1 | head -n 1 | awk '{ print}')
echo $ADNS1
PTR=$(dig +nocomments +nostats +nocmd @8.8.8.8 -x $ADNS | tail -n -1 | head -n 1 | awk '{ print $5}')
PTR1=$(dig +nocomments +nostats +nocmd @8.8.8.8 -x $ADNS | tail -n -1 | head -n 1 | awk '{ print}')
echo $PTR1

ausgabe
Code:
computerbase.de. 45776 IN MX 20 mxext3.mailbox.org.
mxext3.mailbox.org. 899 IN A 80.241.60.216
216.60.241.80.in-addr.arpa. 299 IN PTR mx3.mailbox.org.
 
Zuletzt bearbeitet:
Du kannst es auch anders:
Code:
MX=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx $TLD | tail -n -1 | head -n 1)
liefert Dir Zeile 1 der zweiten Box.
Mit
Code:
ADNS=$(dig +nocomments +nostats +nocmd @8.8.8.8 a $(echo ${MX} |  awk '{ print $6}') | tail -n -1 | head -n 1)
bist Du in der zweiten Zeile der zweiten Box.
mit
Code:
PTR=$(dig +nocomments +nostats +nocmd @8.8.8.8 -x $(echo ${ADNS} | awk '{ print $5}') | tail -n -1 | head -n 1 )
hast Du auch Zeile 3, Box 2. Mit Echo ausgeben, fertig.
 
Zuletzt bearbeitet:
aha so verknüpfen geht auch. na da erspar ich mir ein paar zeilen und zusätzliche variablen :D
und beim echo auch noch 2 zeilen gespart
Code:
MX=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx $TLD | tail -n -1 | head -n 1)
ADNS=$(dig +nocomments +nostats +nocmd @8.8.8.8 a $(echo ${MX} |  awk '{ print $6}') | tail -n -1 | head -n 1)
PTR=$(dig +nocomments +nostats +nocmd @8.8.8.8 -x $(echo ${ADNS} | awk '{ print $5}') | tail -n -1 | head -n 1 )
echo -e $MX\\n$ADNS\\n$PTR

/edit: noch ein anliegen.
wenn die abfrage mehr als 1 zeile ausgibt wie erweitere ich meine prüfung?

bsp:
Code:
computerbase.de.	84573	IN	MX	10 mxext1.mailbox.org.
computerbase.de.	84573	IN	MX	10 mxext2.mailbox.org.
computerbase.de.	84573	IN	MX	20 mxext3.mailbox.org.

mxext1.mailbox.org.	209	IN	A	80.241.60.212
mxext2.mailbox.org.	136	IN	A	80.241.60.215
mxext3.mailbox.org.	603	IN	A	80.241.60.216

der MX soll prüfen ob n zeilen
wenn n zeilen soll er diese auch abarbeiten

d.h. ich müsste irgendwo ein if einbauen
kannst mir da nochmal nen denkanstoss geben?
 
Zuletzt bearbeitet:
FOR-Schleifen:

Code:
for ZEILE in $(${Befehl}); do
${Befehl2}
done

Für jedes Element ZEILE in Menge ${BEFEHL} führe aus: ${Befehl2}. Fertig.

Solltest allerdings beachten, daß die Variable ${ZEILE} nur Werte enthält, die dann tatsächlich auch mit dem Bezeichner an die folgenden Befehle weitergegeben werden können.
Für Box 1, Zeile 1-3 muß ${Befehl} also so gestrickt sein, daß Du als Ausgabe die Menge (mxext1.mailbox.org mxext2.mailbox.org mxext3.mailbox.org) erhältst. Nur so kannst Du sie dann auch mit ${ZEILE} an folgende Befehle innerhalb der Schleife Element für Element weitergeben. Jede Iteration ist dann ein Element der Menge.

edit: Beispiel:
Code:
#!/bin/bash
TLD=$1 #Parameter aus der CLI übernehmen
SAVEIFS=${IFS} #alten Feldtrenner sichern
IFS=$(echo -en "\n\b") #Feldtrenner auf NL/CR setzen
MX=$(dig +nocomments +nostats +nocmd @8.8.8.8 mx $TLD | tail -n +2 ) #erstes Array
for i in ${MX}; do #erste Schleife, die nur dazu dient, ${MX} zeilenweise auszugeben (Notbehelf)
    echo $i
done # Ende der ersten Schleife
for HOST in $(echo "${MX}" |awk '{print $6}'); do #Zweite Schleife: Menge ${HOST} mit den 6. Werten jeder Zeile aus ${MX} füllen
    ADNS=$(dig +nocomments +nostats +nocmd @8.8.8.8 a ${HOST} | tail -n 1 |head -n 1 ) #Variable zur Weiterverarbeitung in dritter Schleife
    echo ${ADNS} # Ausgabe der Werte
    for HOST2 in $(echo "${ADNS}" |awk '{print $5}'); do #Beginn dritter Schleife: Menge ${HOST2} mit Elementen füllen
        dig +nocomments +nostats +nocmd @8.8.8.8 -x ${HOST2} | tail -n -1 | head -n 1  # Letzter Befehl, direktausgabe.
    done #ende dritte Schleife
done # ende zweite Schleife
IFS=${SAVEIFS} # Feldtrenner wiederherstellen
exit 0 # ENDE

Ausgabe:
Code:
computerbase.de.        78552   IN      MX      10 mxext1.mailbox.org.
computerbase.de.        78552   IN      MX      10 mxext2.mailbox.org.
computerbase.de.        78552   IN      MX      20 mxext3.mailbox.org.
mxext1.mailbox.org.     456     IN      A       80.241.60.212
212.60.241.80.in-addr.arpa. 224 IN      PTR     mx1.mailbox.org.
mxext2.mailbox.org.     802     IN      A       80.241.60.215
215.60.241.80.in-addr.arpa. 299 IN      PTR     mx2.mailbox.org.
mxext3.mailbox.org.     850     IN      A       80.241.60.216
216.60.241.80.in-addr.arpa. 299 IN      PTR     mx3.mailbox.org.
 
Zuletzt bearbeitet:
welche bedeutung haben die anführungszeichen?
zeile 9+12 in der schleife
und warum muss das in zeile 6 bei der ersten schleife nicht gemacht werden?
Code:
for HOST in $(echo "${MX}"
ohne wird nur 1 abfrage ausgegeben
mit wird die entsprechende anzahl ausgegeben

den rest hab ich so ziemlich verstanden und bin immer noch sprachlos wie einfach das bei dir scheint
 
Anstatt dig würde ich host nehmen. Mit "host -t MX" lässt sich z.B. gezielt der MX Record abfragen. Dann muss man nicht mühsam alles aus der dig Ausgabe rausfischen.
 
In Zeile 6 brauche ich das Array nicht weiter zu verarbeiten, ich will ja nur jeweils das Element ausgeben. Das Array ist also direkt die Menge. In Zeilen 9+12 muß ich aber aus den gegebenen Elementen (hier definiert als String) auch noch Werte herausnehmen. Gleichzeitig aber muß die Schleife auch mehrere Elemente erkennen, und das bedeutet, daß ein Feldtrenner zwischen den Elementen kommen muß. Lasse ich die Anführungszeichen in Zeilen 9+12 weg, werden die Elemente in einer Zeile aneinander gereiht, es fehlt LF/CR als Feldtrenner (definiert in Zeile 4). Ergo besteht die Menge nur noch aus einem element, und die Schleife muß auch nur einmal durchlaufen.

Einfache überprüfung: Der Unterschied zwischen echo $(ls) und echo "$(ls)".

Jetzt bleibt normalerweise, Fehlerbedingungen noch einzupflegen. Wenn z.B. schon beim ersten Befehl keine verwertbaren Daten herauskommen, sollte das Script abbrechen. Wenn kein Parameter beim Aufruf übergeben wurde, sollte das Script ebenfalls abbrechen oder eine Hilfeseite anzeigen. Ersteres ist schwierig, da die Ausgabe Alphanumerisch sein wird. Zweiteres jedoch lässt sich recht leicht bewerkstelligen, indem man eine Wenn-Dann-Schleife einbaut:
Code:
#!/bin/bash
if [ "$1" = "" ]; then 
   echo "Syntax: $Scriptname FQDN"
else
   TLD=$1
   ...
fi
exit 0

Man kann dann noch überprüfen, ob der FQDN gültig wäre, ob er existiert, etc... Wirklich sinnvoll ist es aber auch nur dann, wenn man "größere Dinge" mit dem Script vorhätte, wie etwa, es in einer produktivumgebung einzusetzen und es der breiten Öffentlichkeit zu überlassen. Noch ist es klein und kann kaum Schaden anrichten.

azereus schrieb:
bin immer noch sprachlos wie einfach das bei dir scheint
Es scheint auch nur so. Tatsächlich hatte ich auch noch eine CLI offen, auf der ich die einzelnen Ausgaben angeschaut und umgeformt habe, daß sie auch passen. Auch habe ich schamlos getrickst, wie z.B. Zeile 4 zeigt. Natürlich hilft es, wenn man die kleinen Helferlein wie grep, sed, awk, head, tail, etc. kennt und was sie bewirken, für alles andere gibt es google und die manpages. Auch habe ich genug Codeschnipsel und scripte hier, wo ich das ein oder andere schon mal gemacht habe, und kann auch da nachschlagen.
 
Kleine Anmerkung: dig kennt den Parameter +short, der die Ausgabe deutlich verkürzt:
Code:
$ dig +short mx computerbase.de
10 mxext1.mailbox.org.
10 mxext2.mailbox.org.
20 mxext3.mailbox.org.
Nur den Hostnamen erhältst du dann mit:
Code:
dig +short mx computerbase.de | awk '{print $2}'
 
@Twostone: nochmal danke fürs erklären. habs jetzt ohne nochmal zu fragen selbst um einen SPF-check erweitert :p läuft langsam
@Evil E-Lex: mit +short kann ich leider nicht arbeiten. grund ist das ich den ganzen record als ausgabe brauche
@fax668: danke schau ich mir mal an. kommt mir fast einfacher vor. und einen zu fragenden dns kann ich auch angeben. hmm... fast eine überlegung wert.
 
Zurück
Oben