Як я можу вирішити ім'я хоста до IP-адреси в сценарії Bash?


416

Який самий стислий спосіб дозволити ім'я хоста до IP-адреси у сценарії Bash? Я використовую Arch Linux .


21
Ганьба, що getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>відповідь десь там, біля дна. Це найпростіше, не вимагає додаткових пакетів і простіше розібратися зі сценарію Bash.
0xC0000022L

1
@ 0xC0000022L: Новий ганьба в тому , що ця відповідь передбачає getent hosts somehost, коли працює це час наsomehost справить IPv6 - адреса , який відрізняється від того, як і більшості інших інструментів ( ping, sshпо крайней мере) розпізнавання імен, і ламає деякі речі. Використовуйте ahostsзамість hosts.
j_random_hacker

@j_random_hacker: хто заважає вам запитувати конкретні адреси IPv4 ( ahostsv4) або IPv6 ( ahostsv6)? Особисто я не знаходжу нічого поганого в неспецифічному запиті про повернення IPv6. Ваш код має бути підготовлений. IPv6 існує вже більше 20 років.
0xC0000022L

@ 0xC0000022L: Ніхто не "заважає мені" цього робити, але відповідь конкретно підказує hosts, і поки що 4 люди схвалили коментар vinc17, що виражає біль, викликаний "раптово IPv6". Підготовка до IPv6 - це не завжди проблема: для багатьох програм потрібен спосіб визначити, чи стосуються два імені / адреси одного і того ж хоста. Вони можуть або використовувати просту відповідність рядків, або вони повинні знати багато про мережу, щоб знайти "справжню" відповідь. Останнє є мінним полем, так що багато сторонніх програм і систем - над якими я не маю контролю - використовують перші.
j_random_hacker

Відповіді:


533

Ви можете використовувати те getent, що поставляється разом із glibcвами (так що ви майже напевно є у Linux). Це вирішується за допомогою gethostbyaddr / gethostbyname2, а також перевірятиме /etc/hosts/ NIS / тощо:

getent hosts unix.stackexchange.com | awk '{ print $1 }'

Або, як сказано нижче Heinzi, ви можете використовувати digз +shortаргументом (запити DNS - серверів безпосередньо, не дивиться на /etc/hosts/ НСС / і т.д.):

dig +short unix.stackexchange.com

Якщо dig +shortйого немає, будь-яке з наступних дій має працювати. Усі ці запити DNS безпосередньо і ігнорують інші способи вирішення:

host unix.stackexchange.com | awk '/has address/ { print $4 }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 }'

Якщо ви хочете роздрукувати лише один IP, додайте exitкоманду до awkробочого процесу.

dig +short unix.stackexchange.com | awk '{ print ; exit }'
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'
host unix.stackexchange.com | awk '/has address/ { print $4 ; exit }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 ; exit }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }'

2
За замовчуванням використання dig працює лише з ipv4, де хост дає відповіді ipv4 та ipv6. Це може бути несподівано. Ви можете спробувати host www.google.com, dig +short www.google.com, host ipv6.google.com, dig +short ipv6.google.com, host www.facebook.com, dig +short www.facebook.com.
jfg956

6
DIG не працює, якщо це CNAME, він не поверне IP-адресу.
sorin

4
Іноді hostможе бути вичерпано та нічого не повертає. Для деяких доменів dig +shortможна повернути псевдонім домену в першому рядку. Отже, щоб переконатися, що вихід є адресою IPv4, використовуйте dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
caiguanhao

9
Використання getent hosts <host>невірно, оскільки, наприклад, воно може надати IPv6 адресу, коли IPv6 не працює. Правильним рішенням є використання getent ahosts <host>спробувати як IPv6, так і IPv4, якщо потрібно.
vinc17

5
Варто згадати: схоже, що хостинг, копати та nslookup, безпосередньо спілкуються з серверами, переліченими у резолюції.conf, тоді як "гетентні хости" поважають як файл локальних хостів, так і кешування на рівні бібліотеки (наприклад, nscd), якщо вони включені.
Саустроп

141

З hostз dnsutils пакета:

$ host unix.stackexchange.com
unix.stackexchange.com has address 64.34.119.12

( Виправлена назва пакета відповідно до коментарів. Як зауваження, інші дистрибутиви мають hostрізні пакети: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)


4
Ви мали на увазі dnsutils ? У всякому разі, hostпрацював добре, дякую
Євген Ярмаш

Ви, мабуть, праві. У мене немає арки, щоб перевірити. (Мав намір додати коментар пізніше, згадуючи про це, але відповідь вже було схвалено, тому я вважав, що я його прибив ...)
манантство

1
Дивіться запис дозволу нижче, якщо вам потрібно вирішити щось не в DNS (наприклад, / etc / hosts)
Гавін Брок

2
Майте на увазі, що hostіноді повертає багаторядковий вихід (у разі переадресації), host unix.stackexchange.com | tail -n1якщо вам потрібно просто рядок з IP-адресою.
Едвард Кофі

3
Ця відповідь заслуговує серйозного голосу. hostє інструментом DNS (подібним до nslookup), тому він шукає лише хости в DNS, а не напр /etc/hosts. Тож це НЕ відповідь на питання ОП.
пітер

54

У мене на машині є інструмент, який, здається, виконує роботу. Сторінка man показує, що, здається, вона поставляється з mysql ... Ось як ви могли це використати:

resolveip -s unix.stackexchange.com
64.34.119.12

Повернене значення цього інструмента відрізняється від 0, якщо ім'я хоста неможливо вирішити:

resolveip -s unix.stackexchange.coma
resolveip: Unable to find hostid for 'unix.stackexchange.coma': host not found
exit 2

ОНОВЛЕННЯ На Fedora, він поставляється з mysql-сервером:

yum provides "*/resolveip"
mysql-server-5.5.10-2.fc15.x86_64 : The MySQL server and related files
Dépôt         : fedora
Correspondance depuis :
Nom de fichier      : /usr/bin/resolveip

Я думаю, це створило б дивну залежність для вашого сценарію ...


6
Здається, це єдине рішення, яке використовує збірку ОС у роздільній здатності - так працює для / etc / hosts, а також DNS.
Гевін Брок

8
getent, як детально описано в іншій відповіді, також розглядає / etc / hosts і постачається з glibc, тому не має залежностей від системи Linux.
Асфанд Казі

44

Наступна команда за допомогою digдозволяє читати результат безпосередньо без sed / awk / тощо. магія:

$ dig +short unix.stackexchange.com
64.34.119.12

digтакож входить в dnsutilsкомплект.


Примітка : digмає значення повернення 0, навіть якщо ім'я не вдалося вирішити. Таким чином, вам потрібно буде перевірити, чи вихід порожній замість того, щоб перевіряти значення повернення:

hostname=unix.stackexchange.com

ip=`dig +short $hostname`

if [ -n "$ip" ]; then
    echo IP: $ip
else
    echo Could not resolve hostname.
fi

Примітка 2 : Якщо ім'я хоста має кілька IP-адрес (спробуйте debian.org, наприклад), всі вони будуть повернуті. Ця "проблема" стосується всіх інструментів, згаданих у цьому питанні дотепер:


2
Зауважте, що якщо домен має запис CNAME, його домен може бути надрукований у першому рядку замість IP-адреси.
pcworld

40
getent hosts unix.stackexchange.com | cut -d' ' -f1

4
Також розглянемо ahosts, ahostsv4, ahostsv6з getent.
0xC0000022L

cutне для гетентів, які використовують \tдля розділення стовпців. Це справа у Solaris.
закінчення

1
@ceving: на Solaris вам, можливо, доведеться бігати cutбез -d(за замовчуванням \tяк роздільник). В Linux це пробіли, тому рядок вище працює.
сборський

27

Наразі рішення, в основному, працюють у більш простому випадку: ім'я хоста безпосередньо вирішується на одну адресу IPv4. Це може бути єдиний випадок, коли вам потрібно вирішити імена хостів, але якщо ні, то нижче наведено обговорення деяких випадків, з якими вам може знадобитися вирішити.

Кріс Даун та Хайнці коротко обговорили випадок, коли ім'я хоста вирішується на більш ніж одну IP-адресу. У цьому випадку (та інших нижче) базовий сценарій за умови, що ім'я хоста безпосередньо вирішується на одну IP-адресу, може зламатися. Нижче, приклад з ім'ям хоста, що має більше ніж одна IP-адреса:

$ host www.l.google.com
www.l.google.com has address 209.85.148.147
www.l.google.com has address 209.85.148.103
www.l.google.com has address 209.85.148.99
www.l.google.com has address 209.85.148.106
www.l.google.com has address 209.85.148.105
www.l.google.com has address 209.85.148.104

Але що таке www.l.google.com? Саме тут потрібно ввести випадок псевдоніму . Перевіримо приклад нижче:

$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.105
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104

Отже www.google.comне безпосередньо для IP-адрес, а до псевдоніма, який сам вирішує декілька IP-адрес. Для отримання додаткової інформації про псевдоніми перевірте тут . Звичайно, можливий випадок, коли псевдонім має єдину IP-адресу, як показано нижче:

$ host g.www.ms.akadns.net
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.190

Але чи можна псевдоніми прикувати? Відповідь так:

$ host www.microsoft.com
www.microsoft.com is an alias for toggle.www.ms.akadns.net.
toggle.www.ms.akadns.net is an alias for g.www.ms.akadns.net.
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.254

$ host www.google.fr
www.google.fr is an alias for www.google.com.
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104
www.l.google.com has address 74.125.39.105

Я не знайшов жодного прикладу, коли ім'я хоста вирішується на псевдонім, який не відповідає IP-адресі, але, думаю, випадок може статися.

Більше ніж декілька IP-адрес і псевдонімів, чи є якісь інші особливі випадки ... а як щодо IPv6? Ви можете спробувати:

$ host ipv6.google.com
ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2a00:1450:8007::68

Якщо ім'я хоста ipv6.google.com- ім'я хоста, призначене лише для IPv6. Як щодо імен хостів з двома стеками:

$ host www.facebook.com
www.facebook.com has address 66.220.153.15
www.facebook.com has IPv6 address 2620:0:1c08:4000:face:b00c::

Знову про IPv6, якщо ваш хост призначений лише для IPv4, ви все ще можете вирішити IPv6 адреси (протестовано на IPv4 лише WinXP, а з ipv6.google.com, ви можете спробувати його на Linux). У цьому випадку роздільна здатність успішна, але пінг не вдається з невідомим повідомленням про помилку хоста . Це може бути випадок, коли ваш сценарій не вдається.

Я сподіваюся, що ці зауваження були корисними.


2
Яке чудове доповнення до прийнятої відповіді, що показує всі кращі випадки, з якими можна було б розібратися в сценарії. У моїй версії hostнавіть немає "адреси" для моїх скриньок.
Михай Даніла

21

Щоб уникнути проблеми з псевдонімами та завжди отримувати готову до використання одну IP-адресу:

python -c 'import socket; print socket.gethostbyname("www.example.com")'

Я зробив функцію bash, щоб вписатись
Брайс Гінта

18
ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

працює без залежностей від інших систем (і для хостів, зазначених у / etc / hosts)


2
Використання ping - це те, що мені потрібно, оскільки мені потрібно значення файлу файлів хостів, але правильний аналіз шаблону sed, але це працювало ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s / ^ [^ (] * [(] //" | sed -e "s / evid)).*$//"
ManiacZX

1
Щоб вирішити щось у домашній мережі, наприклад, myhostname.local, це працює, тому для мене це найкраща відповідь.
Метт Фрідман

1
Я можу запропонувати це також:ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
Метт Фрідман

getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>також працює для декларацій всередині /etc/hosts... і це інструмент переходу на всі види системних баз даних (passwd, група, псевдоніми, послуги).
0xC0000022L

17

Простий, але корисний:

  1. getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  2. getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  3. getent hosts google.de | head -n 1 | cut -d ' ' -f 1

Усі команди вирішать IP-адресу, якщо хост все ще існує. Якщо хост вказує на CNAME, він також отримає IP-адресу в цьому випадку.

Перша команда повертає розв'язану адресу IPv4

Друга команда повертає розв'язану адресу IPv6

Третя команда поверне власникам бажану адресу, що може бути IPv4 або IPv6 адресою.


На сьогоднішній день найпростіший. І вона доступна за замовчуванням. Не так, як hostвимагають встановитиbindutils
michaelbn

7

Ось невелика зміна pingпідходу, який враховує "невідомого хоста" (шляхом проходження через stderr) і використовує, trщоб уникнути використання sedрегулярних виразів:

ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

У випадку, якщо важливо зафіксувати вихідне значення, тоді працює наступне (хоча і менш елегантне):

ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

Мені подобається це рішення, оскільки воно працює без зайвих інструментів.
Radon8472

7

Щоб завершити відповідь Кріса Дауна та звернутися до коментарів jfgagne щодо (можливо, прикутих) псевдонімів, ось таке рішення:

  • враховує кілька IP-адрес
  • враховує один або кілька псевдонімів (CNAME)
  • не запитує /etc/hostsфайл (у моєму випадку я цього не хотів); щоб його запитати, рішення пітона на Дбернта ідеально)
  • не використовує awk / sed

    dig +short www.alias.com  | grep -v "\.$" | head -n 1

Завжди повертає першу IP-адресу чи порожню тринг, якщо її не вирішено. з версією dig:

    $ dig -v
    DiG 9.8.1-P1

1
Дякую, інші відповіді припускають, що "dig + short" завжди повертає одну ip адресу. Вони не обліковували CNAME.
джамшид

5
 php -r "echo gethostbyname('unix.stackexchange.com');"

це працює, але вимагає, щоб на вашому терміналі встановити php
Radon8472,

1
може бути корисним у типовому контейнері php docker, де "хост", "копати" тощо немає в наявності
Fabian Schmengler

5

Я хотів би додати це як коментар до Ендрю Макгрегора Re: ping. Однак це мені не дозволило, тому мені потрібно додати це як ще одну відповідь. (Якщо хтось може перенести це в коментар, сміливо.)

Це ще один варіант, лише з використанням ping та grep:

ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}"

grep -Eдля розширеного регулярного вираження та grep -oповернення лише відповідної частини. сам regexp шукає одну або кілька цифр ( [0-9]+) і необов'язково крапку ( \.?) чотири рази ( {4})


4

Ви можете використовувати host:

hostname=example.org

# strips the IP
IP=$( host ${hostname} | sed -e "s/.*\ //" )

# checks for errors
if [ $? -ne 0 ] ; then
   echo "Error: cannot resolve ${hostname}" 1>&2
   exit 1;
fi

4

ось рецепт Баша, який я приготував, використовуючи відповіді інших людей - спочатку намагається /etc/hosts, а потім повертається до nslookup:

resolveip(){
    local host="$1"
    if [ -z "$host" ]
    then
        return 1
    else
        local ip=$( getent hosts "$host" | awk '{print $1}' )
        if [ -z "$ip" ] 
        then
            ip=$( dig +short "$host" )
            if [ -z "$ip" ]
            then
                echo "unable to resolve '$host'" >&2 
                return 1
            else
                echo "$ip"
                return 0
            fi
        else
            echo "$ip"
            return 0
        fi
    fi
}

Щоб було зрозуміло, getent hostsце не просто пошук у / etc / hosts - це повний DNS-вирішальний дзвінок gethostbyaddr (3) , і це дуже навряд чи digвийде з ладу у випадку, коли це вдасться. Дивіться сторінку чоловіка для гетен .
Стюарт П. Бентлі

@Stuart має рацію - я дуже багато навчився з моменту написання цього запиту і спростив потужну команду. getentзалишається моїм улюбленим, хоча мені теж подобаєтьсяdig +short
RubyTuesdayDONO

4
nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

було рішенням, яке я знайшов без сервера DNS


3

Можливо, не самий стислий, але він здається надійним та ефективним:

# $(get_host_dns_short "google.com")
#
# Outputs the IPv4 IP Address of a hostname, resolved by DNS. Returns 0 if DNS
# responded successfully; 1 otherwise. Will mask error output.
function get_host_dns_short()
{
    (
        set -o pipefail

        host -4 -W1 -t A "$1" 2>/dev/null | awk '/has address/ { print $NF; exit }'
    ) && return 0 || return 1
}

Це виведе єдиний IPv4 IP, а також повернеться 1у разі відмови, маскуючи при цьому більш жорсткий вихід.

Ви можете використовувати його так:

GOOGLE_IP="$(get_host_dns_short "google.com")"
if [[ $? -eq 0 ]]; then
    echo "Google's IP is ${GOOGLE_IP}."
else
    echo "Failed to resolve Google's IP."
fi

IP-адреса Google - 216.58.192.46.

Якщо ви хочете замість цього адресу IPv6, просто замініть -4на -6.


3

dig +noall +answer +nocomments example.com | awk '{printf "%-36s\t%s\n", $1, $5 }'


1
Деякий контекст, яким чином ця відповідь покращиться у порівнянні з уже існуючими, був би чудовим. Крім того, будь ласка, введіть команди відступу на 4 пробіли (див. Синтаксис розмітки).
maxschlepzig

2

1 рядок вирішує список імені хоста

for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk '/^Address: / { print $1 }');  echo $a >> ~/Desktop/ip; done

2

Я роблю це весь час на своєму Mac, якого немає getent. pingсхоже на злом. Я також хотів би взяти /etc/hostsдо уваги.

Отже, я написав дурну обгортку для dns.lookupвас, у яких Node.js встановлений для надання CLI:

$ npm install -g lookup-hostname
$ lookup google.com
62.243.192.89

60% шансу на поломку, перш ніж потрапити будь-де поблизу рішення.
dotbit

@dotbit ви могли б розібратися? Я використовував цей тиждень з 17 року і жодних проблем не виникав.
Томас Дженсен

@Jensen, але ти єдиний, як завжди. Решта з нас зазвичай стикаються з тим чи іншим видом, і завжди.
dotbit

"як завжди" Що ви маєте на увазі під цим? "Решта з нас" Хто це? "натрапити на помилку" Яку конкретну проблему ви бачите? Мені цікаво.
Томас Дженсен

2

копати занадто повільно, nslookup набагато швидше

nslookup google.com | grep -Po 'Address:\s*[0-9.]+' | tail -1 | sed -e 's/Address:\s*//g'

2

Я не знаю найпростішого способу для bash-скрипту, але якщо ви хочете вирішити ім'я хоста і подивитися, чи хост працює, використовуйте ping!

ping -a hostname -c 1

Буде pingхост один раз і вирішить ім'я хоста до IP-адреси.

$ ping -a www.google.com -c 1
PING www.google.com (216.58.211.132) 56(84) bytes of data.
64 bytes from arn09s10-in-f4.1e100.net (216.58.211.132): icmp_seq=1 ttl=54 time=1.51 ms

використання ping - це добре, оскільки його мають усі, але вам потрібно відфільтрувати IP-частину з результатів, якщо ви хочете використовувати її в сценарії.
Radon8472

1

Так, відповідей уже багато, але рішення з використанням perl відсутнє:

perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com

У скрипті bash його можна використовувати так:

#!/bin/bash
ipaddr=$(perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com)
echo $ipaddr

Модулі, які використовуються тут, є основними модулями, тому повинні бути доступні всюди, не встановлюючи CPAN.


perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null набагато чистіше. але ніхто, крім нас двох, не використовує pörl, всі інші, звичайно, використовують Паскаль Сценарій.
dotbit

Насправді я вважаю за краще бачити повідомлення про помилки, якщо щось піде не так. Can't call method "addr" on an undefined valueне зовсім найкраще повідомлення про помилку, але може дати підказку про проблему.
Славен Резіч

1
#!/bin/bash

systemd-resolve   RT.com -t A  | awk '{ print $4 ; exit }'
systemd-resolve unix.stackexchange.com -t A --legend=no | awk '{ print $4 ; exit }'

resolveip -s      RT.com
dig       +short  RT.com
host              RT.com | awk '/has address/ { print $4 }'
nslookup          RT.com | awk '/^Address: /  { print $2 }'
ping -q -c 1 -t 1 RT.com | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

ruby     -rresolv -e      ' print    Resolv.getaddress "RT.com" '
python2  -c 'import socket; print socket.gethostbyname("RT.com")'
perl     -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' RT.com  2>/dev/null
php      -r "echo gethostbyname( 'RT.com' );"

echo        "   all do work for me - take your pick!  "

1
Рубінова версія друкує лапки навколо IP-адреси --- мабуть, printслід використовувати замість p.
Славен Резіч

thx, @Slaven Rezic і не соромтеся виголосити. потім знову, тут внизу сценарій може бути більш помітним насправді ... ;-)
dotbit

-1
host -t a cisco.com

ця команда покаже ip адресу (перенесе домен на IP)


-1

Окрім наведеного вище рішення, ви можете перекласти декілька імен хоста в ip через скрипт нижче, єдиною залежністю є команда "ping" в ядрі Unix:

getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }

getip 'hostname.number1.net'

getip 'hostname.number2.net'

getip 'hostname.number3.net'

getip 'hostname.number4.net'

getip 'hostname.number5.net'

getip 'hostname.number6.net'

getip 'hostname.number7.net'

getip 'hostname.number8.net'
$ cat /tmp/result.log

ABC.DEF.GHI.XY1

ABC.DEF.GHI.XY2

ABC.DEF.GHI.XY3

ABC.DEF.GHI.XY4

ABC.DEF.GHI.XY5

ABC.DEF.GHI.XY6

ABC.DEF.GHI.XY7

ABC.DEF.GHI.XY8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.