Host in IP auflösen für Verwendung in Script

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Host in IP auflösen für Verwendung in Script

      Hallo,

      stehe gerade vor einem kleine Problem.
      Ich möchte von einen Host (z.B. google.de) die IP Auflösen und dann in einer if-Abfrage weiterverwenden.
      Meine Erste Idee wäre gewesen "Ping" zu verwenden. Problem an der Sache, wenn der Host auf den Ping nicht antwortet kann die if-Abfrage nicht weiterverarbeiten.
      Eine Umsetzung die funktioniert ist folgende:
      nslookup www.google.de | grep -A 1 "Name" | tail -1 | awk -F " " '{print $3}'
      Problem dabei, was mach ich wenn der Host nicht aufgelöst werden kann?

      Weis jemand wie ich die if Prüfung gestalten müsste dass wenn der Host aufgelöst werden kann (wahr), dann .... und wenn er nicht aufgelöst werden kann (Terminal ausgabe: can't resolve ....)(false) dann....?
    • Bin grad nicht an der Box, aber ping ist sicher nicht die beste Lösung dafür. Einer der folgenden Befehle sollte verfügbar sein:
      nslookup (hast du ja wohl schon probiert), host, dig.

      Wenn der Host nicht aufgelöst werden kann, sollten alle diese Befehle eigentlich einen entsprechenden exit-Status zurückliefern. Den kannst du mit $? abfragen, also:

      $ host michgibtsnicht.test
      Host michgibtsnicht.test not found: 3(NXDOMAIN)
      $ echo $?
      1

      $ nslookup michgibtsnicht.test
      Server: 172.21.40.44
      Address: 172.21.40.44#53

      ** server can't find michgibtsnicht.test: NXDOMAIN
      $ echo $?
      1

      ("dig" gibt scheinbar keinen entsprechenden exit-Status zurück)

      ALternativ bau dir ein Mini-Python-Script, welches die IP-Adresse oder eine Fehlermeldung zurückliefert:

      Python 2.7.13 (default, Jan 03 2017, 17:41:54) [GCC] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import socket
      >>> print socket.gethostbyname('www.google.de')
      216.58.213.227
      >>> print socket.gethostbyname('mich.gibts.nich')
      Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      socket.gaierror: [Errno -2] Name or service not known
      >>>
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Danke für deine Antwort!

      Dig & Host wäre mir auch in den Sinn gekommen - läuft leider nicht auf der Box.
      Mir scheint als ob nslookup für stdout und stderr den gleichen Kanal benutzt... ich glaub hier liegt das Problem....

      Von Python hab ich leider null Ahnung (beschäftige mich noch nicht so lange mit dem Scripten :-))
    • Probier mal, das folgende auf deiner Box als "/usr/local/bin/gethostbyname.py" zu speichern und ausführbar zu machen (chmod +x /usr/local/bin/gethostbyname.py):


      Python-Quellcode

      1. #!/usr/bin/python
      2. import socket
      3. import sys
      4. if len(sys.argv) < 2:
      5. print "Usage: gethostbyname.py <host>"
      6. sys.exit()
      7. host = sys.argv[1]
      8. try:
      9. ip = socket.gethostbyname(host)
      10. except:
      11. ip = "NOT FOUND"
      12. print ip
      Alles anzeigen
      Das sollte genau das machen was du möchtest und gibt "NOT FOUND" zurück, wenn der Name nicht aufgelöst werden kann.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • skapi schrieb:

      als ob nslookup für stdout und stderr den gleichen Kanal benutzt
      Nein, da verwechselst du etwas. Du hast vermutlich versucht, aus dem obigen nslookup Kommando den Retval auszulesen. Dieser geht aber nach den Pipe-Filtern verloren. Deswegen: erst den retval von nslookup zwischenspeichern, dann erst Stringmanipulation durchführen.

      Shell-Script

      1. #!/bin/sh
      2. addr=$(nslookup $1 2>/dev/null)
      3. retval=$?
      4. if [ $retval == "0" ]; then
      5. echo $addr | awk -F " " '{print $11}'
      6. else
      7. echo "error: $retval"
      8. fi
    • Hallo,

      ich stehe nun wieder vor einem neuen Problem, ich möchte das o.a. gerne in eine while Schleife einfügen die nach x erfolglosen nslookup's eine datei (nok) erstellt.
      Hat jemand eine Idee wie ich das in der Schleife unterbringe?

      Shell-Script

      1. #!/bin/sh
      2. while [ 1 ];
      3. sleep 3
      4. do
      5. if [ ! -e /tmp/nok ] ; then
      6. if [ ! -e /tmp/qux ]; then
      7. addr=$(nslookup foobar 2>/dev/null)
      8. retval=$?
      9. if [ $retval == "0" ]; then
      10. foo
      11. else
      12. true
      13. fi
      14. else
      15. true
      16. fi
      17. else
      18. true
      19. fi
      20. done
      Alles anzeigen
    • for-Schleife in der Shell; wenn's bei den drei Durchläufen bleibt, geht das wohl am schnellsten:

      Quellcode

      1. for i in 1 2 3; do
      2. test irgendeine Abbruchbedingung && break
      3. echo Durchlauf $i
      4. done
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Wichtig ist dass die schleife nach den x durchläufen nicht beendet wird sondern eben nur die nok datei erstellt.
      D.h. wenn die nok datei gelöscht wird, die scheilfe wieder anfängt zu arbeiten bzw. wenn x mal, das nslookup erfolglos war wieder die nok datei erstellt wird
    • zusammengefasst, wenn der nslookup positiv ist soll eine datei entschlüsselt werden. wenn der nslookup negativ ist soll der nslookup x mal versucht werden.
      nach den x versuchen soll die schleife aber nicht beendet werden sondern einfach kein nslookup mehr gemacht werden.

      ich hab mal einen zähler beim script hinzugefügt.
      Problem jetzt: nach 3 erfolglosen nslookups ist $n=3; wie bekomm ich beim u.a. script nach den 3 fehlversuchen die $n wieder auf den wert 1?
      wenn jemand auch einen tipp hat wie das script verschlankt werden kann bin ich natürlich auch dankbar :)

      Shell-Script

      1. #!/bin/bash
      2. versuche=3
      3. n=1
      4. while [ 1 ];
      5. sleep 3
      6. do
      7. if [ ! -e /tmp/nok ] ; then
      8. if [ ! -e /tmp/qux ]; then
      9. if [ $n -gt $versuche ] ; then
      10. touch /tmp/nok
      11. else
      12. addr=$(nslookup foo 2>/dev/null)
      13. retval=$?
      14. if [ $retval == "0" ]; then
      15. [ ! -e /tmp/nslookup.ok ] && touch /tmp/nslookup.ok
      16. else
      17. n=$(( n + 1 ))
      18. fi
      19. fi
      20. else
      21. true
      22. fi
      23. else
      24. true
      25. fi
      26. done
      Alles anzeigen
    • skapi schrieb:

      zusammengefasst, wenn der nslookup positiv ist soll eine datei entschlüsselt werden.
      Meinst Du damit die Entschlüsselung einer verschlüsselten Aufnahme? Wie willst Du das denn per Shell-Script anstoßen?


      skapi schrieb:

      nach den x versuchen soll die schleife aber nicht beendet werden sondern einfach kein nslookup mehr gemacht werden.
      Was soll die Schleife denn dann stattdessen machen?

      Ich verstehe immer noch nicht, was Du erreichen möchtest...
    • Es soll eine Datei mittels openssl entschlüsselt werden....

      Die Endlosschleife soll wenn Variable n=3 die Datei /tmp/nok anlegen - funzt.
      Die Schleife prüft eh nur weiter wenn die datei /tmp/nok NICHT vorhanden ist - funzt auch.

      Es funktioniert grundsätzlich eh so wie sie soll, das einzige Problem ist, dass hier

      Quellcode

      1. if [ $n -gt $versuche ] ; then
      2. touch /tmp/nok
      die Variable n wieder den Ursprungswert (also 1) bekommen soll.
      unset $n wäre mir noch in den Sinn gekommen um den Wert zurück zusetzten (hab ich aber noch nicht probiert da ich noch keine Zeit zum herumspielen gefunden hab).

      Warum die Schleife am leben erhalten werden soll erklärt folgendes beispiel
      - /tmp/nok ist vorhanden.
      - ich lösche jetzt die /tmp/nok datei -> die Schleife soll ihre drei durchgeänge machen (bei neg. nslookup) und dann wieder die /tmp/nok Datei erstellen
    • Die Variable auf den Wert 1 zu setzen hast Du im Script ja schon gemacht... das geht mit n=1

      Eine Frage noch... was möchtest Du mit dem Test-Aufruf von nslookup eigentlich erreichen?
      Das macht eine Anfrage an einen DNS-Server. Welchen DNS-Server hast Du eingestellt?
      Wenn es dein lokaler DNS-Server, z.B. Im Router ist, sagt das Ergebnis nicht viel. Der DNS-Server hält Informationen im Cache. Wenn die Adresse einmal aufgelöst werden konnte, wird sie bei einem späteren Aufruf aus dem Cache genommen.

      Wenn es gedacht ist, um zu Testen, ob ein Internet-Anschluss vorhanden ist, wäre vermutlich ein Ping ein besserer Test...
    • Quellcode

      1. n=1
      Generell: Der Code lässt sich nicht sonderlich gut lesen

      - Was soll das mit den zwei lock-Dateien (nok und qux)? Ein guter Kommentar schadet hier nicht, dann weist du auch nach Wochen/Monaten noch, was du da geschraubt hast.
      - Die else true Konstrukte können ersatzlos weg
      - seltsame while Schleife (while -> sleep -> do ???)

      Quellcode

      1. while [ 1 ]; do
      2. sleep 3
      3. ...
      -
    • RickX schrieb:

      Die Variable auf den Wert 1 zu setzen hast Du im Script ja schon gemacht... das geht mit n=1
      Das Stimmt so nicht, da ja die Variable n bei neg. nslookup hochgezählt wird und danach 3 ist.

      Wenn du die Schleife so wie sie ist nimmst bekommst die /tmp/nok datei.
      Danach lösche die /tmp/nok datei - dann sollten mindestens 6 Sekunden vergehen bis die /tmp/nok datei wieder angelegt ist.
      Angelegt wird die datei aber spätestens nach 3 skeunden -> da Variabel n nicht auf den ursprungswert gesetzt wurde

      nslookup ist deswegen die Lösung da die gegenseite nicht auf icmp request antwortet. es geht nur darum dns kann aufgelöst werden oder nicht.
    • skapi schrieb:

      RickX schrieb:

      Die Variable auf den Wert 1 zu setzen hast Du im Script ja schon gemacht... das geht mit n=1
      Das Stimmt so nicht, da ja die Variable n bei neg. nslookup hochgezählt wird und danach 3 ist.
      Quatsch... auch wenn die Variable durch das Hochzälen den Wert 3 hat, kann ich sie mit n=1 wieder auf 1 setzen. Das darf ich im Script so oft machen, wie ich möchte...

      DNS kann übrigens auch aufgelöst werden, wenn die Gegebseite nicht da ist. Mit nslookup testest Du nur, ob der DNS-Dienst funktioniert, der hat aber mit der Gegenseite nichts zu tun.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von RickX ()

    • Bbzgl. foo, bar , qux -> Metasyntaktische Variable

      @RickX "DNS kann übrigens auch aufgelöst werden, wenn die Gegebseite nichts da ist" -> das ist korrekt, wenns die dns nicht mehr gibt kannst auch nix auflösen ;)

      Dann werde ich den Code einfach so abändern...

      Quellcode

      1. if [ $n -gt $versuche ] ; then
      2. touch /tmp/nok
      3. n=1
      @Banana Joe Danke auch für deinen input.
      würde nichte wenn ich das "else true" Konsruckt weglassen würde, bei einer nicht zutreffenden Bedingung ein false ausgelöst werden was die schleife dann beenden würde (kanns leider momentan nicht probieren...)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von skapi ()

    • Halte ich auch für fragwürdig... die DNS-Informationen wird über die Root-Server verbreitet. Die Einträge im DNS stellt man nicht einfach so mal ab.

      Ein Server kann andererseits monatelang abgeschaltet und nicht erreichbar sein, obwohl sein Name und seine IP-Adresse immer noch im DNS eingetragen sind.

      Zum Else: Der Else-Teil in IF THEN ELSE FI ist optional. Wenn es keinen ELSE-Fall gibt, kann der ELSE-Teil weggelassen werden.