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

    • 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
      >>>
    • 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.
    • 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