LINUX.ORG.RU

[bash]получить ip по доменному имени

 


0

0

надо получить ip адреса по доменному имени. единственное что приходит в голову это

coper@debian:~/tmp$ host -t A yandex.ru|cut -f 4 -d" "
93.158.134.11
213.180.204.11
77.88.21.11
87.250.251.11
Если dns недоступны по получаю следующее
coper@debian:~/tmp$ host -t A yandex.ru
;; connection timed out; no servers could be reached
coper@debian:~/tmp$ host -t A yandex.ru|cut -f 4 -d" "
out;

Как получить пустую строку в случае недоступности dns?


ip="$(host -t A yandex.ru|cut -f 4 -d' ' )"
[ "$ip" = "out;" ] && ip=""

Так попробуй

Hetor
()
$ host ya.ru 2>/dev/null | grep -oP '\d+\.\d+\.\d+\.\d+'
77.88.21.8
93.158.134.8
213.180.204.8
$ host ya1234.ru 2>/dev/null | grep -oP '\d+\.\d+\.\d+\.\d+'
$
arsi ★★★★★
()

раз тема в development, то вот вам решение на C



#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
extern int h_errno;
struct hostent * he;
struct in_addr addr;

int main (int ac, char **av) {
if (ac == 2) { /* есть аргумент */
he = gethostbyname (av[1]);
if (he) { /* resolved */
memcpy(&addr, he->h_addr, sizeof addr);
fprintf(stdout, "%s\n", inet_ntoa(addr));
        }
}}
Sylvia ★★★★★
()
if name=`dig +short yandex.ru`; then echo $name; else echo not found; fi
anonymous
()
Ответ на: комментарий от mv

ещё и gethostbyname устарела и не рекомендуется к использованию. IPv6, однако.

anonymous
()
Ответ на: комментарий от Sylvia

> вот вам решение на C

а вот вам решение на … кхм ;)

(base64 -d <<BLOB | bzcat | tee /dev/stderr | moc) 2>&1 | g++ `pkg-config --libs --cflags QtCore QtGui QtNetwork` -x c++ -o qresolve -
QlpoOTFBWSZTWWQ+d/IAAD/fgAAwWXdwHz717Iq//9/qQAHbuTo2glRE9NQAZHpD0mgAAAGgNNBp
pCZJ6p6Mamp+oNQGhkNGgNA0aAxJQ0Gg0AaNAAAAAABKEQKe1BDT0ZTATQDQZo0jTE0IhIhIlFEI
IB77AkYGbCiGRDkf1VnmQc4W4at/BBwE9ms28MUdaobyZjbH+Of1KTyOliiIIslVoImSRthQnyai
MIPxLe/BZ9v8LxONyuLllXY73VA0kkWlTpro36dWiEaQsgkA8uexhVYtLxjH0rkanHc+3JOBNSx2
4oBIsBRVRMrNGlVryTYYN1mjXjSKxbQqrYYZnKn0MV1jjRElhyk4eJEUai65jvV7MMKqhYOBH3hF
hVRo9u3CGQH20zo89XnEmrP8ZrUkWl8lRkGQrHGm2wbOmfCYSYI1HNUkyZltDw8BIdBIGWil8r3i
3lGRSCbHc+Y8+dPGp0qYAZjJlhuTBOU62lOwFM09+hzDs5foAyS8wxcTuR8M964JMm0upIt2XGt5
Hv5Bqua9M/YjLsajghatR0dSMUZimUeIWgEau88Mdc0i91UX2lRHNghKjSJ0YjYqMdLL8yZ99QMg
W0gdiGuOGVScNNCQSeQC+CqXNKKnawZIuamxgMZi0Lz7MVdnndKWJMyWDknHAMtPprFrJLJ9SClg
F7gf8XckU4UJBkPnfyA=
BLOB
arsi ★★★★★
()
Ответ на: комментарий от Sylvia

Ради Вас пришлось грузить убунту :) cat 2.c

#include <stdio.h> 
#include <stdlib.h> 
#include <netdb.h> 
#include <unistd.h> 
#include <string.h> 
#include <time.h> 
#include <sys/time.h> 
extern int h_errno; 
struct hostent * he; 
struct in_addr addr; 
 
int main (int ac, char **av) { 
if (ac == 2) { /* есть аргумент */ 
he = gethostbyname (av[1]); 
if (he) { /* resolved */ 
memcpy(&addr, he->h_addr, sizeof addr); 
fprintf(stdout, "%s\n", inet_ntoa(addr)); 
        } 
}}
./a.out linux.org.ru
Segmentation fault

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

sylvia@allure:~/Documents$ cat resol.c
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
extern int h_errno;
struct hostent * he;
struct in_addr addr;

int main (int ac, char **av) {
if (ac == 2) { /* есть аргумент */
he = gethostbyname (av[1]);
if (he) { /* resolved */
memcpy(&addr, he->h_addr, sizeof addr);
fprintf(stdout, «%s\n», inet_ntoa(addr));
}
}}
sylvia@allure:~/Documents$ cc -O2 -o resol resol.c
sylvia@allure:~/Documents$ ./resol linux.org.ry
sylvia@allure:~/Documents$ ./resol linux.org.ru
217.76.32.61
sylvia@allure:~/Documents$

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

в любом случае это концепция кода, дальше уже пусть автор темы , если ему это надо , допиливает под свои надобности

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

в 64 бит падает кстати, причем по backtrace
Program terminated with signal 11, Segmentation fault.
[New process 11107]
#0 0x00007fc20ae74ef0 in vfprintf () from /lib64/libc.so.6
(gdb) bt
#0 0x00007fc20ae74ef0 in vfprintf () from /lib64/libc.so.6
#1 0x00000000006025d8 in ?? ()
#2 0x00007fff049e9eb0 in ?? ()
#3 0x0000000000602bf0 in ?? ()
#4 0x000000000b3c25f8 in ?? ()
#5 0x0000000097037ef8 in ?? ()
#6 0x00007fc20aa1a807 in ?? () from /lib64/libnss_dns.so.2
#7 0x00007fff049ea3b0 in ?? ()
#8 0x00007fc20000000e in ?? ()
#9 0x00007fff049ea458 in ?? ()
#10 0x00007fff049ea438 in ?? ()
#11 0x000000000040074c in _IO_stdin_used ()
#12 0x00007fff049ea41c in ?? ()
#13 0x00007fc20ae43d2c in ?? () from /lib64/libc.so.6
#14 0x0000000000000000 in ?? ()

Sylvia ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Я просто уже наступал на такие грабли, при чём они наблюдались только в убунту, точнее в ядре, функция vsprintf

Ядерная vsprintf к юзерспейсу никакого отношения не имеет.

mv ★★★★★
()

В общем-то, Silvy и не виновата. inet_ntoa печатает в thread-local буфер и возвращает его адрес, но адрес возвращается кривой.

mv ★★★★★
()
Ответ на: комментарий от mv

Ядерная vsprintf к юзерспейсу никакого отношения не имеет.

я за ядро и говорил, дело в том что видно в обновлениях ядра за 17.03 они это пофиксили. Смотри /linux-source-*/net/tipc/dbg.c

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Смотри /linux-source-*/net/tipc/dbg.c

Если объяснишь, как эта программа добирается до ядерного vsprintf, то посмотрю.

mv ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

падает )
по хорошему еще надо добавить
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


но с (unsigned char *) начинает врать

./restest microsoft.com

0.0.0.0

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

простите , с 0.0.0.0 это я уже испортить успела

У меня решает.


у меня вообщем-то тоже

Добавь только #include <arpa/inet.h>


от лишних #include хуже не будет, все равно два раза не включатся

Sylvia ★★★★★
()
Ответ на: комментарий от mv

Если объяснишь, как эта программа добирается до ядерного vsprintf, то посмотрю.

OK. Если найду предшествующее ядро.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

пробывал?!

char* на unsigned char* менять бессмыслено. Из-за неподключенного хидера (implicit declaration of function ‘inet_ntoa’) компилятор генерил код, как будто inet_ntoa имеет тип int (32 бита). На ia32 возвращаемый результат не трогался, а на x86-64 с помощью cltq расширялся до 64 бит.

mv ★★★★★
()

Привет велосипедистам!

/* 
 * getaddrinfo.c - Simple example of using getaddrinfo(3) function.
 * 
 * Michal Ludvig <michal@logix.cz> (c) 2002, 2003
 * http://www.logix.cz/michal/devel/
 *
 * License: public domain.
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int
lookup_host (const char *host)
{
  struct addrinfo hints, *res;
  int errcode;
  char addrstr[100];
  void *ptr;

  memset (&hints, 0, sizeof (hints));
  hints.ai_family = PF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_flags |= AI_CANONNAME;

  errcode = getaddrinfo (host, NULL, &hints, &res);
  if (errcode != 0)
    {
      perror ("getaddrinfo");
      return -1;
    }

  printf ("Host: %s\n", host);
  while (res)
    {
      inet_ntop (res->ai_family, res->ai_addr->sa_data, addrstr, 100);

      switch (res->ai_family)
        {
        case AF_INET:
          ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
          break;
        case AF_INET6:
          ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
          break;
        }
      inet_ntop (res->ai_family, ptr, addrstr, 100);
      printf ("IPv%d address: %s (%s)\n", res->ai_family == PF_INET6 ? 6 : 4,
              addrstr, res->ai_canonname);
      res = res->ai_next;
    }

  return 0;
}

int
main (int argc, char *argv[])
{
  if (argc < 2)
    exit (1);
  return lookup_host (argv[1]);
}

anonymous
()
Ответ на: комментарий от AnDoR

> видимо, на «[bash]» в заголовке всем пофигу?

Ок. Ждём от тебя реализации DNS-протокола на баше.

LamerOk ★★★★★
()

if host -t A yandex.ru > /dev/null 2>&1; then
host -t A yandex.ru | cut -f 4 -d" "
else
echo «»
fi

Можно пооптимальней, но сам додумывай.

Devix
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.