Über SSH DNS-Konfiguration erfragen

S

Strusi

Jungspund
Guten Morgen :-)

Bin derzeit noch ein Anfänger was das Skripten in der Bash angeht und wollte fragen ob ihr mir nicht ein bisschen Hilfestellung geben könntet / wolltet.

Hab zu meiner Thematik zwar vereinzelt ein par Dingen gefunden aber beim zusammensetzen hapert es doch arg ;)

Szenario:
Möchte mich per ssh auf eine Liste von Servern einloggen um dort aus der /etc/resolv.conf die Daten auszulesen und diese in einer bestimmten Form (csv) in einer neuen Datei auf meinem Sprungserver zu speichern.

Beispiel-Datei (resolv.conf):
domain ***.***.de
nameserver ***.***.***.***

Beispiel-Datei (gewünschtes Ergebnis)
"Servername","domain","domain n","ip nameserver","ip nameserver n"

Problem:
Die Anzahl der Einträge ist unterschiedlich (mehrer Nameserver- und Domain-Einträge) was mir eine Ausgabe untereinander beschert hat anstelle von nebeneinander und
Die Felder sind nicht zwingend durch TABs getrennt sondern auch mal durch Leerzeichen.

Ich habe verschiedene Ansätze ausprobiert und werde diese auch mal so posten:
Code:
 for i in `grep " " /tmp/ag_hosts  | cut -f2`; do

 #string=""
 #string_domain=`ssh $i "grep domain /etc/resolv.conf | cut -f2"`
 #string_name=`ssh $i "grep nameserver /etc/resolv.conf | cut -f2"`
 #string="$string_domain,$string_name"

string=`ssh $i "grep domain /etc/resolv.conf"`
string=`sed -n -e 's/domain//g' $string`
string=`sed -n -e 's/\n/,/g' $string`
echo $string
done

Bei der jetzigen Version kommt als Fehlermeldung:
Can't open domain
Can't open ***.***.de


Hat jemand ein par gute Ansätze für mich!? Wäre echt dankbar weil ich auch ein bisschen unter Druck arbeite grade :)

Greets

Strusi
 
Hi,

ich vermute mal du hast auskommentierte Zeilen in deiner Datei. :think: Probiers mal mit
Code:
for i in `grep -v '^[[:space:]]*#' /tmp/ag_hosts  | cut -f2`; do
   echo "i='$i'" # for testing only
   ...
done
 
Ich würde die resolv.conf mittels scp auf den lokalen Rechner ziehen und dann dort bearbeiten.
Dann die Daten in ein neues File schreiben (so wie du sie haben willst) und nach Erledigung diese resolv.conf wieder löschen. Daraufhin die nächste mittels scp kopieren und das Spiel beginnt von vorn.

Das sollte das ganze etwas vereinfachen.
 
Sry, missverständlich ausgedrückt?! :P

Das Problem liegt nicht in der Schleife zu Abfrage der Hostnamen, die Funktioniert, auch das Einloggen auf die Server ist kein Problem.

Das Problem liegt halt, wenn man so will, in der Textbearbeitung der gefunden Dateien....
 
Wenn dir sed zu kompliziert ist (regex sind in man grep erklärt), dann probiers halt mal mit read (man bash).
 
Okay,

werd beide Vorschläge mal durchtesten und mich dann wieder melden.

Danke erstmal :-)
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Hi,

hab die ganze Zeit versucht zu basteln und hab auch schon einige Fortschritte gemacht. Der Quelltext sieht derzeit so aus:

Code:
#for i in `grep " " /tmp/ag_hosts  | cut -f2`; do
i=g8dy1
scp $i:/etc/resolv.conf cp_resolv.conf

sed -e '/domain/d;/search/d;s/nameserver//g;s/^[ \I]//g;s/^[ \t]*//;s/[ \t]*$//' ./cp_resolv.conf > ./dns_search

'$i;cat ./dns_search '|paste -d "," - - - |tee -a ./dns_results

#while [[ $((++i)) -le $(sed -n -e '$=' ./dns_search)]]; do
#for i in $(seq $(sed -n -e '$=' ./dns_search)); do
#  echo $i
#done

#done

Die Datei in die ich mittels sed schreib hat dann nur noch den Inhalt:
123.456.789.123
123.456.789.123
ALLERDINGS sind davor noch Tabstops (?) die ich nicht wegbekomme. Im vi den Befehl :set list abgesetzt wird vor die Adressen noch ^I geschrieben.

Tja, und Probleme hab ich noch die Dateien vernünftig in meine endgültige Datei zu bringen. Wollte eine Zählschleife, die zuerst die Anzahl der Zeilen ausliest (weil kann ja unterschiedlich sein) und das hat nicht funktioniert. Dann hab ich noch n bisschen mit paste & tee rumgewerkelt aber auch da keine brauchbaren Ergebnisse bekommen.

Hat jemand nen guten Rat für mich!? *langsam lust verlier*
 
Zuletzt bearbeitet:
Tabs werden (neben blanks) mit
Code:
[[:space:]]
gematched.
Zeilen zählt man normalerweise mit wc -l
 
Hallo

Um aus einer Mehrzeilendatei eine Zeile zu machen, gibt es viele Möglichkeitn.
Eine mit sed:
Code:
wolle@Nietzsche:/tmp
$ cat test
zeile 1
zeile 2
zeile 3
zeile 4
zeile 5
zeile 6
zeile 7
zeile 8
zeile 9
zeile 10
wolle@Nietzsche:/tmp
$ sed -ne  ':a;{$!N;$!ba;be};:e;{s/\n/ /g;p}' test
zeile 1 zeile 2 zeile 3 zeile 4 zeile 5 zeile 6 zeile 7 zeile 8 zeile 9 zeile 10

Ich hoffe das ist das was du suchst.
Gruß Wolfgang
 
Guten Morgen,

bin jetzt schon wieder n halbes Stündchen dran und leider muss ich sagen, dass beide Hilfen nicht funktionieren.

Also ich bekomme noch immer nicht die Leerzeichen/Tabs/was-auch-immer weg.

Und bei dem sed-Befehl kommt die Fehlermeldung: label too long
Irritiert mich etwas, weil kann ja eigentlich nicht sein, oder!?

Habs natürlich etwas abgewandelt, deswegen der neue Code:

Code:
i=g8dy1
scp $i:/etc/resolv.conf cp_resolv.conf


sed -e '
s/[[:space:]]//
s/^[ \t]*//
s/[ \t]*$//
s/[ \^I]//
/domain/d
/search/d
s/nameserver//' ./cp_resolv.conf > ./dns_search


#sed -n -e  ':a;{$!N;$!ba;be};:e;{s/\n/ /g;p}' ./dns_search > ./dns_result


Habt bitte ein bisschen Nachsicht mit mir falls ich einfach zu kurzsichtig bin, hab n bisschen Stress im Moment :rolleyes:
 
Hallo

Wir sollten eventuell mal klären mit welcher Shell bzw. welchem sed wir es zu tun haben.

Desweiteren werde ich mal kurz erklären, was mein sed-hack macht.
Das hilft dir ja eventuell weiter:
Code:
:a;{$!N;$!ba;be}

das 1. Label ist a (:a) alles was dahinter in {} steht wird für dieses Label ausgeführt.
$!N Solange nicht Dateiende, lade neue Zeile und hänge sie an den Patternspace an.
$!ba Ist das Dateiende nicht erreicht, führe Label a erneut aus.
Damit lade ich die gesamte Datei in den Patternspace.
Ist das Ende der Datei erreicht, springe ich zum zweiten Label e.
Das würde auch kürzer gehen, aber es sollte extra etwas klarer sein. deshalb habe ich das so gepostet.
Label :e ist also die Aktion, wenn alles eingelesen ist.
Code:
:e;{s/\n/ /g;p}
Hier ersetze ich einfach alle Newline durch Leerzeichen und gebe alles aus (p).
Das p ist nötig, da ich am Beginn die Option -n angegeben habe.

Thats all
;)
Eventuell fährst du erstmal besser, wenn du das alles in eine Skriptdatei schreibst und dann per -f in dein sed lädst.

Führede Space (Leerzeichen oder Tab ) entfernt sicher:
Code:
$ echo "  test"|sed -e 's/^[[:space:]]*//g'
test
wolle@Nietzsche:/backup/
$ echo -e "\t  test"|sed -e 's/^[[:space:]]*//g'
test

Gruß Wolfgang
PS Schick doch mal so eine echte Datei, dann ließe sich das besser testen.
 
Arbeite mit einer Bash, welche sed -> ?(

Danke für die Erklärung, die RegEx machen mir immer noch leichte Probleme :)

Allerdings gibt er trotzdem noch immer als Fehlermeldung aus:
"Label too long: :a;{$!N;$!ba;be}:e;{s/\n/ /g;p};"

Häng dir jezt mal Beispiel-Dateien dran.
 

Anhänge

  • dns_suche.zip
    411 Bytes · Aufrufe: 2
Sed -Version:

Code:
sed --version

Das hätte dir aber auch ein kurzes

Code:
man sed

gesagt.....
 
Leider nicht, da auf dem Sprungserver keine Manuals enthalten sind...

Code:
user@G8DSC> man sed
windex entry incorrect:  sed(1) not found.
No manual entry for sed.
user@G8DSC> sed --version
sed: illegal option -- -
 
Hallo
Erstmal den Hinweis:
Bitte benutze in Zukunft ein *nixoides Packtool, ich musste eben erst noch unzip installieren um deine Datei entpacken zu können.

Zweitens: Welches OS verwendest du?

Hier mein Lösungsvorschlag, der sollte mit den meisten sed-versionen klar kommen (i hope so)
Ich habe das der Übersicht wegen mal in ein Sedscriptfile geschrieben.
Du wirst sicher wissen, dass man dieses dann mit
Code:
sed  -f <SKRIPTFILE> INPUT-DATEI
aufrufen muss. ;)

Also hier die bei mir funktionierende Variante:
Code:
$ cat sedfile
:a
{$!N;$be;ba}
:e
{
s/domain[^\n]*//g
s/search[^\n]*//g
s/nameserver[[:space:]]*//g
s/\n/ /g
s/^[[:space:]]//
p
}
$ sed -n -f sedfile cp_resolv.conf
000.000.000.001 000.000.000.002

Erklärung sollte klar sein, siehe oben.
Ich habe hier nur alles in einem Skript erledigt.
Du kannst natürlich am Ende auch alle Leerzeichen durch ein Zeichen deiner Wahl ersetzen.

Gruß Wolfgang
 
Auf dem Sprungserver ist Solaris 8 installiert.

Klar weiß ich wie ich die Skriptfile einbinde ;)

Teste es gleich mal aus.

Du bist echt ne große Hilfe, Danke schön!!!!!

Meld mich wieder....


ps:Hab noch nie was von dem Begriff: "*nixoides Packtool" gehört !
 
Naja, gzip bzip2 oder solche Packer sind mehr Standard als zip auf unixoiden Systemen.

Ob das unter Solaris läuft, kann ich nicht wirklich garantieren und schon garnicht testen.

Gruß Wolfgang
 
Nope, läuft nicht mit der Fehlermeldung, dass zu viele offene {'s :think:


Code:
user@G8DSC # cat sedscript
:a
{$!N;$be;ba}
:e
{
s/domain[^\n]*//g
s/search[^\n]*//g
s/nameserver[[:space:]]*//g
s/\n/ /g
s/^[[:space:]]//
p
}
chschuld@G8DSC # sed -n -f sedscript cp_resolv.conf
Too many {'suser@G8DSC #


hab extra noch nen Kollegen dazu geholt gehabt aber auch er hat wie ich zwei offene und zwei geschlossene Klammern gesehen...

Gruß

Christian
 
Hallo
Versuche es mal mit den Klammern auf einener eigenen Zeile und Semikola hinter jedem Befehl.
Code:
:a
{
$!N;
$be;
ba;
}
:e
{
s/domain[^\n]*//g;
s/search[^\n]*//g;
s/nameserver[[:space:]]*//g;
s/\n/ /g;
s/^[[:space:]]//;
p;
}
Kann mich dunkel erinnern, darüber mal etwas im Zusammenhang mit Solaris gelesen zu haben.

Sorry, ich kann jetzt nur noch rätseln.
Gruß Wolfgang

PS Eventuell sogar Semikola hinter den schließenden Klammern.
 
Zuletzt bearbeitet:
Hab jetzt verschiedenste Versionen des sedscripts ausprobiert und nichts funzt *seufz*

Hab mir grade mal gsed runtergeladen und werds gleich mal installieren. Hoffentlich funzt das, muss das Skript halt möglichst heute fertig haben...

Also sobal ich schreibe:
Code:
:a
{$!N;$b e;b a}
:e
{
s/domain[^\n]*//g
s/search[^\n]*//g
s/nameserver[[:space:]]*//g
s/\n/ /g;s/^[[:space:]]//
p}
Kommt die Fehlermeldung:
Code:
sed: command garbled: p}

Ändere ich den Code etwas:
Code:
"sedscript" 10 lines, 118 characters
chschuld@G8DSC # cat sedscript
:a
{$!N;$b e;b a}
:e
{
s/domain[^\n]*//g
s/search[^\n]*//g
s/nameserver[[:space:]]*//g
s/\n/ /g;s/^[[:space:]]//
p
}
Kommt die Fehlermeldung:
Code:
Too many {'s

Auch ein ';' hinter dem P ändert das nicht.
Kann jemand was damit anfangen!? ^^
 
Zuletzt bearbeitet:

Ähnliche Themen

mittels if abfrage datei nach variabelnwert durchsuchen

dovecot und postfix Konfiguration Problem

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Last mit etc/passwd anzeigen lassen

[HowTo] Debian Installation mit Installer über SSH

Zurück
Oben