Bash ස්ක්‍රිප්ට් එකක ඇති IP ලිපිනයකට සත්කාරක නාමයක් විසඳන්නේ කෙසේද?


456

Bash ස්ක්‍රිප්ට් එකක ඇති IP ලිපිනයකට සත්කාරක නාමයක් නිරාකරණය කිරීමට වඩාත්ම සංක්ෂිප්ත ක්‍රමය කුමක්ද? මම ආරුක්කු ලිනක්ස් භාවිතා කරමි .


23
ලැජ්ජාව getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>උත්තරය කොහේ හරි පහළට පහළින් තිබීම ගැන. එය සරලම ය, අමතර පැකේජ අවශ්‍ය නොවන අතර බාෂ් ස්ක්‍රිප්ට් එකකින් විග්‍රහ කිරීම පහසුය .
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

X 0xC0000022L: කිසිවෙකු එය කිරීමෙන් මාව වළක්වන්නේ නැත, නමුත් පිළිතුර නිශ්චිතවම යෝජනා කරයි hosts, මේ වන විට 4 දෙනෙකු "හදිසියේම IPv6" නිසා ඇති වන වේදනාව ප්‍රකාශ කරමින් vinc17 ගේ ප්‍රකාශය ඉදිරිපත් කර ඇත. IPv6 සඳහා සුදානම් වීම සැමවිටම ගැටළුවක් නොවේ: බොහෝ වැඩසටහන් වලට එකම ධාරකයට නම් / ලිපින දෙකක් යොමු වේද යන්න තීරණය කිරීමට ක්‍රමයක් අවශ්‍ය වේ. ඔවුන්ට සරල නූල් ගැලපීමක් භාවිතා කළ හැකිය, නැතහොත් “සත්‍ය” පිළිතුර සොයා ගැනීමට ඔවුන් ජාලය ගැන බොහෝ දේ දැන සිටිය යුතුය. දෙවැන්න බිම් බෝම්බයක් වන අතර, තෙවන පාර්ශවීය වැඩසටහන් සහ පද්ධති - මට පාලනය කළ නොහැකි - කලින් භාවිතා කරන්න.
j_random_hacker

Answers:


589

ඔබට භාවිතා කළ හැකිය getent, එය එන්නේ glibc(එබැවින් ඔබට එය ලිනක්ස් වල නිසැකවම තිබේ). මෙය gethostbyaddr / gethostbyname2 භාවිතයෙන් නිරාකරණය වන අතර /etc/hosts/ NIS / etc ද පරීක්ෂා කරනු ඇත :

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

හෝ, හයින්සි පහත සඳහන් පරිදි, ඔබට තර්කය digසමඟ භාවිතා කළ හැකිය +short(ඩීඑන්එස් සේවාදායකයන් කෙලින්ම විමසයි, /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 }'

ඔබට අවශ්‍ය වන්නේ එක් අයිපී එකක් පමණක් මුද්‍රණය කිරීමට නම්, එවිට වැඩ ප්‍රවාහයට 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
පෙරනිමියෙන්, ඩිග් භාවිතා කිරීම 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

7
DIG ක්‍රියා නොකරයි, CNAME නම් එය IP නැවත ලබා නොදෙනු ඇත.
සෝරින්

4
සමහර විට, hostකල් ඉකුත් වී කිසිවක් ආපසු ලබා දිය නොහැක. සමහර වසම් සඳහා, dig +shortපළමු පේළියේ වසම් අන්වර්ථය නැවත ලබා දිය හැකිය. එබැවින්, ප්‍රතිදානය IPv4 ලිපිනයක් බව සහතික කිරීමට, භාවිතා කරන්න dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
caiguanhao

13
භාවිතා getent hosts <host>කිරීම වැරදිය, උදාහරණයක් ලෙස IPv6 ක්‍රියා නොකරන අතර IPv6 ලිපිනයක් ලබා දිය හැකිය. නිවැරදි විසඳුම getent ahosts <host>නම් අවශ්‍ය නම් IPv6 සහ IPv4 යන දෙකම උත්සාහ කිරීමට භාවිතා කිරීමයි.
vinc17

6
සඳහන් කිරීම වටී: ධාරක, කැණීම් සහ nslookup විසින් resolv.conf හි ලැයිස්තුගත කර ඇති සේවාදායකයන් සමඟ කෙලින්ම කථා කරන බවක් පෙනේ.
Saustrup

149

සමග hostසිට dnsutils පැකේජය:

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

( අදහස් අනුව පැකේජයේ නම නිවැරදි කර ඇත. සටහනක් ලෙස වෙනත් බෙදාහැරීම් hostවිවිධ පැකේජවල ඇත: ඩේබියන් / උබුන්ටු bind9-host , openSUSE bind-utils , Frugalware bind .)


5
ඔබ අදහස් කළේ ඩන්සුටිල්ස් ද ? කෙසේ වෙතත්, හොඳින් hostවැඩ කළා, ස්තූතියි
ඉයුජින් යර්මාෂ්

ඔබ බොහෝ විට හරි. පරීක්ෂා කිරීමට මට මෙහි ආරුක්කුවක් නොමැත. (පසුව මෙය සඳහන් කරමින් අදහස් දැක්වීමක් එකතු කිරීමට අදහස් කර ඇත, නමුත් පිළිතුර දැනටමත් ඉහළ නංවා ඇති බැවින් මම එය ඇණ
ගැසුවෙමි යැයි සිතුවෙමි

1
ඔබට ඩීඑන්එස් හි නොමැති යමක් නිරාකරණය කිරීමට අවශ්‍ය නම් පහත විසඳුම් විසඳුම බලන්න (උදා: etc / host)
ගේවින් බ්‍රෝක්

2
බව දැනුවත් විය host(යළි-යොමුකරයි පිළිබඳ පැමිණිල්ලේ දී) බහු-රේඛාව ප්රතිදානය නැවත සමහර විට, ඔබට අවශ්ය වෙනවා host unix.stackexchange.com | tail -n1ඔබ IP ලිපිනය රේඛාව අවශ්ය නම්.
එඩ්වඩ් කෝෆි

4
මෙම පිළිතුර බරපතල පසුබෑමකට ලක්විය යුතුය. hostඑය ඩීඑන්එස් මෙවලමකි (සමාන nslookup) එබැවින් එය සත්කාරක දෙස බලන්නේ ඩීඑන්එස් තුළ මිස උදා /etc/hosts. එබැවින් එය OP ගේ ප්‍රශ්නයට පිළිතුරක් නොවේ .
පීටර්

55

මගේ යන්ත්‍රයේ මෙවලමක් මා සතුව ඇත. මෑන් පිටුව පෙන්වන්නේ එය 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

යාවත්කාලීන කිරීම ෆෙඩෝරා මත, එය mysql-server සමඟ පැමිණේ:

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

මම හිතන්නේ එය ඔබගේ පිටපත සඳහා අමුතු යැපීමක් ඇති කරයි ...


7
මෙහෙයුම් පද්ධතියේ විසර්ජනය තුළ භාවිතා කරන එකම විසඳුම මෙය බව පෙනේ - එබැවින් / etc / host සඳහා මෙන්ම DNS සඳහාද ක්‍රියා කරයි.
ගේවින් බ්‍රොක්

8
getent, අනෙක් පිළිතුරෙහි විස්තර කර ඇති පරිදි, / etc / ධාරකයන් දෙස බලන අතර glibc සමඟ එන බැවින් ලිනක්ස් පද්ධතියක් මත යැපීමක් නොමැත.
අස්ෆන්ඩ් කාසි

ඔබ වෙනත් පැකේජයක් මත යැපීමක් නිර්මාණය කරන බැවින් මම විසදුම් භාවිතා නොකරමි. getent පෙරනිමියෙන් ස්ථාපනය කර ඇත. ධාරක, nslookup, සහ dig සියල්ලම විකල්ප පැකේජවල ඇත. ස්ක්‍රිප්ට් එකක getent භාවිතා කරන්න.
මයිකල් ග්‍රාන්ට්

46

පහත දැක්වෙන විධානය භාවිතා digකිරීමෙන් කිසිදු sed / awk / etc නොමැතිව ප්‍රති result ලය කෙලින්ම කියවීමට ඔබට ඉඩ සලසයි. මැජික්:

$ dig +short unix.stackexchange.com
64.34.119.12

digdnsutilsපැකේජයට ද ඇතුළත් කර ඇත .


සටහන : නම නිරාකරණය කළ නොහැකි වුවද 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, උදාහරණයක් ලෙස), ඒවා සියල්ලම ආපසු ලබා දෙනු ඇත. මෙම "ගැටළුව" මේ දක්වා සඳහන් කර ඇති සියලුම මෙවලම් වලට බලපායි:


3
වසමකට CNAME ඇතුළත් කිරීමක් තිබේ නම්, එහි වසම IP ලිපිනයක් වෙනුවට පළමු පේළියේ මුද්‍රණය කළ හැකි බව සලකන්න.
pcworld

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

4
ද සලකා ahosts, ahostsv4, ahostsv6සමග getent.
0xC0000022L

cut\tතීරු වෙන් කිරීමට භාවිතා කරන getent සඳහා නොවේ . සොලාරිස් හි තත්වය මෙයයි.
ceving

1
@ceving: සොලාරිස් හි ඔබට cutනොමැතිව ධාවනය කිරීමට සිදුවනු ඇත -d(පෙරනිමි \tලෙස පරිසීමකය ලෙස). ලිනක්ස් හි එහි අවකාශය ඇත, එබැවින් ඉහත රේඛාව ක්‍රියා කරයි.
sbersky

30

මෙතෙක් ලබා දී ඇති විසඳුම් බොහෝ දුරට සරල නඩුවේදී ක්‍රියාත්මක වේ: ධාරක නාමය සෘජුවම තනි 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.comIP ලිපින වලට කෙලින්ම විසඳන්නේ නැත, නමුත් අන්වර්ථ නාමයකටම 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.comIPv6- පමණක් සත්කාරක නාමයකි. ද්විත්ව සිරස් ධාරක නාම ගැන කුමක් කිව හැකිද:

$ 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 සමඟ පරීක්ෂා කර බැලුවහොත් ඔබට එය ලිනක්ස් මත උත්සාහ කළ හැකිය). මෙම අවස්ථාවේදී, විභේදනය සාර්ථක වේ, නමුත් නොදන්නා ධාරක දෝෂ පණිවිඩයක් සමඟ පිං අසමත් වේ . මෙය ඔබගේ ස්ක්‍රිප්ටින් අසමත් වූ අවස්ථාවක් විය හැකිය.

එම ප්‍රකාශ ප්‍රයෝජනවත් වනු ඇතැයි මම බලාපොරොත්තු වෙමි.


2
ස්ක්‍රිප්ටින් කිරීමේදී ගනුදෙනු කිරීමට අවශ්‍ය විය හැකි සියලු අද්දර සිද්ධීන් පෙන්වමින් පිළිගත් පිළිතුරට කෙතරම් හොඳ අනුපූරකයක්ද? මගේ අනුවාදයේ hostමගේ පෙට්ටි සඳහා "ලිපිනයක් ඇත" යනුවෙන් සඳහන් නොවේ.
මිහයි ඩැනිලා

22

අන්වර්ථ නාමයන් සමඟ ඇති ගැටළුව වළක්වා ගැනීමට සහ සෑම විටම තනි IP ලිපිනයක් භාවිතයට සූදානම් කර ගන්න:

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

මෙම පිළිතුරෙන් මගේ bashrc හි රැඳී සිටීමට මම bash ශ්‍රිතයක් කළෙමි: gist.github.com/brycepg/ba117a37de53906dc8fcc312bd7d5fee
බ්‍රයිස් ගින්ටා

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

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

වෙනත් පද්ධති මත යැපීමකින් තොරව ක්‍රියා කරයි (සහ / etc / ධාරක වල දක්වා ඇති ධාරකයන් සඳහා)


2
පිං භාවිතය මට අවශ්‍ය වන්නේ ධාරක ගොනුවෙන් වටිනාකම අවශ්‍ය වන නමුත් sed රටාව නිවැරදිව විග්‍රහ කරන නමුත් මෙය ක්‍රියාත්මක වූයේ පිං -q -c 1 -t 1 your_host_here | grep PING | sed -e "s / ^ [^ (] * [(] //" | sed -e "s / Leisure)] .*$ / /"
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

20

සරල නමුත් ප්‍රයෝජනවත්:

  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

9

මෙන්න ක සුළු වෙනස්කම් විද්යාමාන pingසැලකිල්ලට "නොදන්නා සත්කාරක" (stderr හරහා ගිනි අඟුරුවල විසින්) ගනී බඹුන් ප්රවේශය trභාවිතය වැළැක්වීම සඳහා sedregexps:

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}'

මම මෙම විසඳුමට කැමතියි, මන්ද එය අමතර මෙවලම් නොමැතිව ක්‍රියා කරන බැවිනි.
රේඩොන් 8472

8

ක්‍රිස් ඩවුන්ගේ පිළිතුර සම්පුර්ණ කිරීමට සහ අන්වර්ථ නාමයන් (සමහරවිට දම්වැල් සහිත) අන්වර්ථ නාමයන් පිළිබඳව jfgagne අදහස් දැක්වීමට, මෙන්න විසඳුම:

  • බහු අයිපී සැලකිල්ලට ගනී
  • අන්වර්ථ නාම එකක් හෝ කිහිපයක් (CNAME) සැලකිල්ලට ගනී
  • /etc/hostsගොනුව විමසන්නේ නැත (මගේ නඩුවේ මට එය අවශ්‍ය නොවීය); එය විමසීමට, ඩබර්න්ට්ගේ පයිතන් ද්‍රාවණය පරිපූර්ණයි)
  • awk / sed භාවිතා නොකරයි

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

සෑම විටම පළමු IP ලිපිනය ලබා දෙයි, නැතහොත් විසඳා නොමැති නම් හිස් ට්‍රින්ග් කරන්න. කැණීම් අනුවාදය සමඟ:

    $ dig -v
    DiG 9.8.1-P1

1
ස්තූතියි, වෙනත් පිළිතුරු උපකල්පනය කරන්නේ "dig + short" සෑම විටම තනි අයිපී ලිපිනයක් ලබා දෙන බවයි. ඔවුන් CNAME සඳහා ගණන් නොගනී.
ජම්ෂිඩ්

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

මෙය ක්‍රියාත්මක වේ, නමුත් එයට ඔබගේ පර්යන්තයේ php ස්ථාපනය කිරීම අවශ්‍ය වේ
Radon8472

1
"ධාරක", "කැණීම්" යනාදිය නොමැති සාමාන්‍ය php ඩොකර් බහාලුමක් මත ප්‍රයෝජනවත් විය හැකිය
ෆේබියන් ෂ්මෙන්ග්ලර්

6

ඇන්ඩ rew මැක්ග්‍රෙගර් රී: පිං වෙත අදහස් දැක්වීමක් ලෙස මෙය එක් කිරීමට මම කැමතියි. කෙසේ වෙතත් එය මට ඉඩ නොදේ, එබැවින් මට මෙය තවත් පිළිතුරක් ලෙස එක් කළ යුතුය. (යමෙකුට එය අදහස් දැක්වීමකට ගෙන යා හැකි නම්, නිදහස් වන්න.)

මෙය තවත් ප්‍රභේදයකි, පිං සහ ග්‍රෙප් භාවිතා කිරීම පමණි:

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

grep -Eදීර් extended නිත්‍ය ප්‍රකාශනය සඳහා සහ grep -oගැලපෙන කොටස පමණක් ආපසු ලබා දීම සඳහා . regexp විසින් ඉලක්කම් එකක් හෝ කිහිපයක් ( [0-9]+) සහ විකල්පයක් ලෙස තිතක් ( \.?) හතර වතාවක් ( {4}) සොයයි


5

ඔබට භාවිතා කළ හැකිය 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

5

මෙන්න මම වෙනත් ජන පිළිතුරු භාවිතා කර පිසූ බාෂ් වට්ටෝරුවකි - පළමුව උත්සාහ කර /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-විසඳීම තියෙන්නේ (3) gethostbyaddr , සහ ඒක ඉතා එහිදී නඩුවේ අසමත් නොහැක්කකි digසාර්ථක වනු ඇත. ලබා ගැනීම සඳහා man පිටුව බලන්න .
ස්ටුවර්ට් පී. බෙන්ට්ලි

U ස්ටුවර්ට් හරි - මම එය ලිවීමෙන් පසුව බොහෝ දේ ඉගෙන ගෙන ප්‍රබල විධානයක් සරල කර ඇත්තෙමි. getentdig +short
මමත්

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

ඩීඑන්එස් සේවාදායකය නොමැතිව මා සොයාගත් විසඳුම එයයි


4

සමහර විට වඩාත්ම සංක්ෂිප්ත නොවිය හැකි නමුත් එය ශක්තිමත් හා කාර්යක්ෂම බව පෙනේ:

# $(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

ගූගල් හි අයිපී 216.58.192.46 වේ.

ඔබට ඒ වෙනුවට IPv6 ලිපිනයක් අවශ්‍ය නම්, එය වෙනුවට ආදේශ -4කරන්න -6.


4

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


1
දැනටමත් පවතින ඒවාට වඩා එම පිළිතුර වැඩිදියුණු වන ආකාරය පිළිබඳ සමහර සන්දර්භය විශිෂ්ට වනු ඇත. කරුණාකර, අවකාශ 4 කින් විධාන ඇතුල් කරන්න (cf. ලකුණු කිරීමේ සින්ටැක්ස්).
maxschlepzig


3

1 පේළිය මඟින් සත්කාරක නාම ලැයිස්තුවක් නිරාකරණය කරයි

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

3

මගේ මැක්හි නැති සෑම විටම මම මෙය කරමි getent. pingහරියට කඩුල්ලක් වගේ. මමත් සැලකිල්ලට ගන්න කැමතියි /etc/hosts.

එබැවින්, dns.lookupCLI එකක් සැපයීම සඳහා Node.js ස්ථාපනය කර ඇති ඔබ වෙනුවෙන් මම මෝඩ එතුමක් ලිවීමි :

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

ඔබ විසඳුමක් ළඟට යාමට පෙර 60% කැඩී යාමේ අවස්ථාව.
dotbit

ot ඩොට්බිට් ඔබට විස්තර කළ හැකිද? මම මෙම සතිපතා '17 සිට භාවිතා කර ඇති අතර කිසි විටෙකත් ගැටළු නොමැත.
තෝමස් ජෙන්සන්

En ජෙන්සන් නමුත් ඔබ සැම විටම මෙන් එකම කෙනා ය. අපෙන් ඉතිරි අය සාමාන්‍යයෙන් එක් ආකාරයක හෝ වෙනත් ආකාරයක අසාර්ථකත්වයට දිව යයි.
dotbit

"සෑම විටම" ඔබ එයින් අදහස් කරන්නේ කුමක්ද? "අපි ඉතුරු" කවුද ඒ? "අසාර්ථක වීමට" ඔබ දකින්නේ කුමන විශේෂිත ගැටලුවක්ද? මට කුතුහලයක්.
තෝමස් ජෙන්සන්

3

බෑෂ්-ස්ක්‍රිප්ට් සඳහා පහසුම ක්‍රමය මම නොදනිමි, නමුත් ඔබට සත්කාරක නාමයක් නිරාකරණය කර ධාරකය ඉහළ මට්ටමක තිබේදැයි බැලීමට අවශ්‍ය නම් භාවිතා කරන්න 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

පිං භාවිතා කිරීම හොඳයි, මන්ද සෑම කෙනෙකුටම එය ඇත, නමුත් ඔබ එය ස්ක්‍රිප්ට් එකක භාවිතා කිරීමට කැමති නම්, ප්‍රතිදානයන්ගෙන් IP- කොටස පෙරීමට අවශ්‍ය වේ.
රේඩොන් 8472

2

ඔව්, දැනටමත් බොහෝ පිළිතුරු ඇත, නමුත් පර්ල් භාවිතා කරන විසඳුමක් නොමැත:

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 වඩා පිරිසිදුයි. නමුත් අප දෙදෙනා හැර වෙන කිසිවෙකු පර්ල් භාවිතා නොකරයි, අනෙක් සියල්ලෝම පැස්කල් ස්ක්‍රිප්ට් භාවිතා කරති.
dotbit

ඇත්තටම මම කැමති දෙයක් වැරදුනොත් වැරදි පණිවිඩ බලන්න. Can't call method "addr" on an undefined valueහරියටම හොඳම දෝෂ පණිවිඩය නොවේ, නමුත් ගැටලුව පිළිබඳ ඉඟියක් ලබා දිය හැකිය.
ස්ලේවන් රෙසික්

2
#!/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, la ස්ලේවන් රෙසික් සහ ඉහළට ඔසවා තැබීමට නිදහස් වන්න. ඉන්පසු නැවතත්, මෙහි පතුලේ පිටපත සැබවින්ම දෘශ්‍යමාන විය හැකිය ... ;-)
dotbit

-1
host -t a cisco.com

මෙම විධානය මඟින් ip ලිපිනය පෙන්වනු ඇත (වසම IP වෙත නැවත යොමු කරයි)


-1

ඉහත විසඳුමට අමතරව, ඔබට පහත දැක්වෙන ස්ක්‍රිප්ට් හරහා බහු ධාරක නාමය ip වෙත පරිවර්තනය කළ හැකිය, එකම පරායත්තතාවය හර යුනික්ස් හි “පිං” විධානයයි:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.