[INFO] Convert a HOSTNAME to an IP address

sf3978

IPPF-Promi
Mitglied seit
2 Dez 2007
Beiträge
8,014
Punkte für Reaktionen
28
Punkte
48
Wer auf der FritzBox eine URL in eine IP-Adresse umwandeln will, und statt:
Code:
[B]nslookup[/B] <url> | sed -e "/Address 1: /!d" | sed -e "s/Address 1: \([0-9.]*\\).*/\1/" | sed -e "\$!d"
ein kleines binary (uci) benutzen will, kann es mit dem Patch aus dem Anhang, in Freetz compilieren.
Code:
/var/mod/root # ldd /usr/bin/uci
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2aabe000)
        libc.so.0 => /lib/libc.so.0 (0x2aadc000)
        ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2aaa8000)
Code:
[COLOR="Red"]/var/mod/root # uci www.freetz.org
81.169.182.73[/COLOR]
Code:
/var/mod/root # uci
The url is missing!
Code:
/var/mod/root # uci www.freetz.
nslookup: can't resolve 'www.freetz.'
<dns server>
Quelltext:
Code:
#include <stdio.h>
int main(int argc, char *argv[])
{
  char buffer [160];
  if (argv[1] != NULL) {
    /* variable in system() with sprintf */
    sprintf(buffer, "nslookup %s | sed -e \"/Address 1: /!d\" | sed -e \"s/Address 1: \\([0-9.]*\\).*/\\1/\" | sed -e \"\\$!d\"", argv[1]);
    system (buffer);
  }
  else if (argv[1] == NULL) {
    fprintf (stdout, "The url is missing!\n");
  }
  return 0;
}
 

Anhänge

  • uci.patch.txt
    3.3 KB · Aufrufe: 0
Zuletzt bearbeitet:
Wo ist der Sinn dieses Binaries? Ist es nicht sogar schneller, wenn man den Befehl in ein Skript schreibt?

MfG Oliver
 
Für mich ist der Sinn des binary, in der Übersichtlichkeit der Skripte. Als ein Beispiel:
Code:
$ipt -I INPUT 3 -s "$(uci <dyndns-adresse>)" -j REJECT
Die Schnelligkeit ist noch ausreichend.;)
 
Da aber in dem C-Programm eigentlich auch nichts anderes gemacht wird, als das sed-Skript aufzurufen, wäre es doch sinnvoller, es entweder in ein normales sh-Skript zu packen oder die Operation mithilfe von C-Funktionen (nicht system() ) durchzuführen. Letzteres ist ein bisschen Overkill.
 
Ja, was das sed-Skript macht, kann/könnte man auch mit Hilfe von C-Funktionen auswerten. system() wird dann nur noch oder doch noch, für das "nslookup" auf der Box, benötigt.
 
Man könnte ja in den Quelltext von nslookup schaun, und das direkt in uci integrieren.
Edit: Oder man erweitert nslookup um einen Parameter, z.B. nslookup -ip freetz.org
 
OK, mit etwas Inspiration aus den Jagdgründen des Internets;), geht es auch ohne nslookup. Hier mit der Funktion "gethostbyname()":
Code:
/* by sf3978 */
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <arpa/inet.h>

int main(int argc, char* argv[])
{
  
  struct hostent *hptr;
  struct in_addr addr;
  char *dnsname; 
  dnsname = argv[1];
  
  if (dnsname != NULL) {
    hptr = gethostbyname (dnsname);
    addr.s_addr = *((long*)hptr->h_addr_list[0]);
    printf ("%s\n", inet_ntoa(addr));
  }
  else if (dnsname == NULL) {
    fprintf (stdout, "The url is missing!\n");
  }
  
  return 0;
}
Code:
:~> ./uci localhost
127.0.0.1
Code:
:~> ./uci www.freetz.org
81.169.182.73
 
Wer auf der FritzBox eine URL in eine IP-Adresse umwandeln will
Am Rande: Das "u" im Programmnamen könnte in die Irre führen. Das, was du da in eine IP-Adresse umwandelst, ist keine URL, nur ein Hostname.

Viele Grüße,

Andreas
 
Das "u" im Programmnamen könnte in die Irre führen. [...]
Danke für den Hinweis, ... werde ich dann ändern, aus "uci" in "hci".

EDIT:
Geändert in "hci". Quelltext mit Ausgang bei unbekanntem hostname:
Code:
/* by sf3978 */
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <arpa/inet.h>

int main(int argc, char* argv[])
{
  struct hostent *hptr;
  struct in_addr addr;
  char *dnsname = NULL; 
  dnsname = argv[1];
  
 if (dnsname == NULL) {
    fprintf (stdout, "%s: hostname is missing!\n", argv[0]);
    exit (1);
  }
  
  hptr = gethostbyname (dnsname);
      
  if (hptr) {
    addr.s_addr = *((long*)hptr->h_addr_list[0]);
    printf ("%s\n", inet_ntoa(addr));
  }
  else if (!hptr) {
    fprintf (stdout, "%s: unknown hostname: %s\n", argv[0], argv[1]);
    exit (1);
  }
  
  return 0;
}

Code:
/var/mod/root # ldd /usr/bin/hci
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2aabe000)
        libc.so.0 => /lib/libc.so.0 (0x2aadc000)
        ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2aaa8000)

/var/mod/root # hci
hci: hostname is missing!

/var/mod/root # hci geg
hci: unknown hostname: geg

/var/mod/root # [COLOR="Red"]hci www.freetz.org
81.169.182.73[/COLOR]

EDIT 2:
Code:
/* by sf3978 */
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>

int main(int argc, char* argv[])
{

struct in_addr addr;
struct hostent *host;
char *address = NULL; 
address = argv[1];

if (address == NULL) {
    fprintf (stdout, "%s: ip address is missing!\n", argv[0]);
    exit (1);
  }

addr.s_addr = inet_addr(address);
host = gethostbyaddr((char*)&addr, sizeof(addr), AF_INET);

if (host) {
    printf ("%s\n", host->h_name);
  }
  else if (!host) {
    fprintf (stdout, "%s: unknown ip address: %s\n", argv[0], argv[1]);
    exit (1);
  }

return 0;
}
 

Anhänge

  • hci.patch.txt
    3.4 KB · Aufrufe: 1
Zuletzt bearbeitet:
Schön! Gefällt mir viel besser als dein Erstprogramm ;)
 
Ich dachte ja, ich sehe nicht richtig, daß da ein C-Programm geschrieben wird, nur um system aufzurufen. Genau genommen habe ich mir zuerst das Programm gar nicht so genau angeschaut und gedacht, ein C Programm, das gethostbyname aufruft.

Eine andere Möglichkeit ist auch, das Skript zu vereinfachen:
Code:
# nslookup www.freetz.org | sed -nre '$s/Address 1: *([^ ]*).*$/\1/p'
81.169.182.73
 
In Beitrag #9 schon. Es war das, was ich in Beitrag #1 vermutet hatte, weil ich nicht so genau geschaut hatte, was das Programm tut. Erst nach dem Lesen von #2 und #4 habe ich es mir genauer angeschaut und gesehen, wie es funktioniert.

Generell bin ich der gleichen Meinung wie linuxkasten in #4, daß ein Shell-Skript sinnvoller ist als die erste Version des Programms.

Die Version aus #9 sieht schon besser aus, allerdings halte ich den Nutzen des Programms in Bezug auf den benötigten Platz trotzdem für gering.
 
Damit meine ich den Platz, den man im Flash der Box dafür braucht.
Wenn jemand das Programm für sich nutzen will, spricht nichts dagegen. Aber wenn wir das Programm in den Standard Freetz Skripts verwenden würden, müßten wir das Programm zwangsweise in jede Box bringen, und da man das Gleiche mit einer Zeile Shell-Skript erreichen kann, wäre der zusätzliche Platzverbrauch unnötig.
 
OK, ... verstanden. Es war ja auch nicht meine Absicht, etwas für die Standard Freetz Skripte zu machen. Es geht ja nur um die Verwendung im modifizierten trunk (M), durch den geneigten user. Mit ca. 4 kB ist das binary nicht so groß und es kann ja auch externalisiert werden, wenn erforderlich.
 
Mir ist klar, daß das Programm nicht übermäßig groß ist. Aber auf einer kleinen Box können 4kB auch schon mal wichtig sein, und wenn man das gleiche Ergebnis mit ca. 50 Zeichen Shell Text bekommt, dann ist der restliche Platzbedarf eben unnötig. Und gerade die kleinen Boxen haben auch keinen USB-Anschluß.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.