আমি কীভাবে কোনও বাশ স্ক্রিপ্টে আইপি ঠিকানার হোস্টনামটি সমাধান করতে পারি?


416

কোনও বাশ স্ক্রিপ্টের আইপি ঠিকানার হোস্টনাম সমাধান করার সবচেয়ে সংক্ষিপ্ত উপায় কী? আমি আর্চ লিনাক্স ব্যবহার করছি ।


21
লজ্জাজনক getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>উত্তরটি কোথাও নীচে কাছাকাছি এসে গেছে। এটি সবচেয়ে সহজ, অতিরিক্ত প্যাকেজগুলির প্রয়োজন নেই এবং একটি বাশ স্ক্রিপ্ট থেকে পার্স করাও সহজ
0xC0000022L

1
@ 0xC0000022L: নতুন লজ্জা যে উত্তর প্রস্তাব দেওয়া হয় getent hosts somehost, যখন এই চলমান থাকাকালীনsomehost একটি IPv6 ঠিকানা উত্পাদন করা হবে , কীভাবে অন্যান্য অধিকাংশ সরঞ্জাম (থেকে ভিন্ন ping, sshঅন্তত) জন ব্যক্তির নাম সমাধান, এবং কিছু কিছু বিরতি। এর ahostsপরিবর্তে ব্যবহার করুন hosts
j_random_hacker

@ j_random_hacker: কে আপনাকে বিশেষ করে আইপিভি 4 ( ahostsv4) বা আইপিভি 6 ( ahostsv6) ঠিকানা অনুরোধ করা থেকে বিরত রাখে ? ব্যক্তিগতভাবে আমি আইপিভি 6 ফিরিয়ে দেওয়া অনির্দিষ্ট অনুরোধের সাথে কিছুই ভুল পাই না। আপনার কোড প্রস্তুত করা উচিত। আইপিভি 6 এখন 20 বছরেরও বেশি সময় ধরে বাইরে রয়েছে।
0xC0000022L

@ 0xC0000022L: কেউ তা থেকে "আমাকে রক্ষা করে না", তবে উত্তরটি বিশেষভাবে প্রস্তাব দেয় hostsএবং এখনও অবধি 4 জন "ভীষণ হঠাৎ আইপিভি 6" দ্বারা সৃষ্ট ব্যথা প্রকাশ করার জন্য ভিন্স 17 এর মন্তব্যকে সমর্থন করেছে। আইপিভি 6 এর জন্য প্রস্তুত হওয়া সর্বদা ইস্যু নয়: দুটি প্রোগ্রাম / নাম একই ঠিকানাটিতে উল্লেখ আছে কিনা তা নির্ধারণ করার জন্য অনেক প্রোগ্রামের একটি উপায় প্রয়োজন। তারা হয় সাধারণ স্ট্রিং ম্যাচিং ব্যবহার করতে পারে, অথবা "সত্য" উত্তরটি খুঁজতে তাদের অবশ্যই নেটওয়ার্ক সম্পর্কে অনেক কিছু জানতে হবে। পরেরটি মাইনফিল্ড, এতগুলি তৃতীয় পক্ষের প্রোগ্রাম এবং সিস্টেম - যার উপর আমার কোনও নিয়ন্ত্রণ নেই - প্রাক্তনটি ব্যবহার করুন।
j_random_hacker

উত্তর:


533

আপনি ব্যবহার করতে পারেন getent, যা আসে glibc(যাতে আপনার প্রায় অবশ্যই এটি লিনাক্সে থাকে)। এটি গেথস্টব্যাডডিআর / গেথোস্টবাইনেম 2 ব্যবহার করে সমাধান করে এবং তাই /etc/hosts/ এনআইএস / ইত্যাদিও পরীক্ষা করে দেখবে :

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

অথবা, হেইনজি যেমন নীচে বলেছেন, আপনি আর্গুমেন্টটি digদিয়ে ব্যবহার করতে পারেন +short(ডিএনএস সার্ভারগুলি সরাসরি জিজ্ঞাসা করুন, /etc/hosts/ এনএসএস / ইত্যাদি দিকে তাকান না ):

dig +short unix.stackexchange.com

যদি dig +shortঅনুপলব্ধ থাকে তবে নিম্নলিখিত যে কোনও একটিরই কাজ করা উচিত। এই সমস্ত কোয়েরি সরাসরি ডিএনএস করে এবং রেজোলিউশনের অন্যান্য উপায়গুলি উপেক্ষা করে:

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

6
ডিআইজি কাজ করে না, যদি সিএনএম হয় তবে এটি আইপি ফেরত দেবে না।
সোরিন

4
কখনও কখনও, hostসময়সীমা শেষ হতে পারে এবং কিছুই ফেরত দেয় না। কিছু ডোমেনের জন্য, dig +shortপ্রথম লাইনে ডোমেন ওরফে ফিরিয়ে দিতে পারে। সুতরাং, আউটপুটটি একটি আইপিভি 4 ঠিকানা হয় তা নিশ্চিত করতে, ব্যবহার করুন dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1
ক্যাগুয়ানহো

9
ব্যবহার getent hosts <host>করা ভুল, উদাহরণস্বরূপ এটি আইপিভি 6 ঠিকানা দিতে পারে যখন আইপিভি 6 কাজ করে না। সঠিক সমাধানটি getent ahosts <host>প্রয়োজন হলে আইপিভি 6 এবং আইপিভি 4 উভয়ই ব্যবহার করার জন্য ব্যবহার করা উচিত।
ভিঙ্ক 17

5
উল্লেখযোগ্য: হোস্ট, ডিগ এবং এনস্লুআপ আপটি রেজোলভকনফ-এ তালিকাভুক্ত সার্ভারের সাথে সরাসরি কথা বলে মনে হচ্ছে, যেখানে "জেন্ট হোস্ট" সক্ষম থাকলে স্থানীয় হোস্ট ফাইল এবং লাইব্রেরি-স্তরের ক্যাচিং (যেমন এনএসসিডি) উভয়কে সম্মান করে।
সস্ট্রুপ

141

সঙ্গে hostথেকে dnsutils প্যাকেজ:

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

( মতামত অনুসারে প্যাকেজের নাম সংশোধন করা হয়েছে As নোট হিসাবে অন্য বিতরণগুলির hostবিভিন্ন প্যাকেজ রয়েছে: দেবিয়ান / উবুন্টু বাইন্ড 9-হোস্ট , ওপেনসুস বাইন্ড- ইউটস, ফ্রুগ্যালওয়্যার বাইন্ড )


4
আপনার মানে ডিএনসটিলস ? যাইহোক, দুর্দান্ত hostকাজ করেছেন, ধন্যবাদ
ইউজিন ইয়ারমাস

তুমি সম্ভবত সঠিক. চেক করার জন্য আমার এখানে কোনও আর্চ নেই। (এটি পরে উল্লেখ করে একটি মন্তব্য সংযোজন করার উদ্দেশ্যে, তবে উত্তরটি ইতিমধ্যে উস্কে দেওয়া হয়েছিল তাই আমার মনে হয়েছিল আমি এটি পেরেক দিয়েছি ...)
manatwork

1
আপনার ডিএনএসে (যেমন, / ইত্যাদি / হোস্টগুলি) কিছু না সমাধান করার দরকার হলে নীচের রেজিলিপ এন্ট্রিটি দেখুন
গ্যাভিন ব্রুক

2
সচেতন থাকুন যে hostকখনও কখনও মাল্টি-লাইন আউটপুট ফেরত দেয় (পুনর্নির্দেশের ক্ষেত্রে), আপনি host unix.stackexchange.com | tail -n1যদি কেবল আইপি ঠিকানার সাথে লাইন চান তবে আপনি চাইবেন।
এডওয়ার্ড কফফি

3
এই উত্তরটি একটি গুরুতর ডাউনওয়েটের দাবিদার। hostএটি একটি ডিএনএস সরঞ্জাম (অনুরূপ nslookup) তাই এটি কেবল ডিএনএসে হোস্টগুলি দেখায়, উদাহরণস্বরূপ নয় /etc/hosts। সুতরাং এটি ওপির প্রশ্নের উত্তর নয়
পিটার

54

আমার মেশিনে আমার একটি সরঞ্জাম রয়েছে যা কাজটি মনে করে। ম্যান পেজটি দেখায় এটি মাইএসকিএল নিয়ে এসেছে বলে মনে হচ্ছে ... আপনি কীভাবে এটি ব্যবহার করতে পারেন তা এখানে:

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

ফেডোরার আপডেট , এটি মাইএসকিএল-সার্ভারের সাথে আসে:

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
এটি এখানে একমাত্র সমাধান বলে মনে হচ্ছে যে ওএস এর বিল্ড ইন রেজোলভার ব্যবহার করে - সুতরাং / ইত্যাদি / হোস্টগুলির পাশাপাশি ডিএনএসের জন্য কাজ করে।
গ্যাভিন ব্রক

8
getentঅন্যান্য উত্তরে যেমন বর্ণনা করা হয়েছে, তেমনি / ইত্যাদি / হোস্টগুলিও দেখে এবং এটি গ্লিবিসি সহ আসে, সুতরাং লিনাক্স সিস্টেমে কোনও নির্ভরতা নেই।
আসফান্দ কাজী

44

নিম্নলিখিত কমান্ডটি ব্যবহার করে digআপনাকে কোনও এসড / অ্যাজক / ইত্যাদি ছাড়াই ফলাফল সরাসরি পড়তে দেয়। জাদু:

$ 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 : কোনও হোস্টনামের একাধিক আইপি ঠিকানা থাকলে ( debian.orgউদাহরণস্বরূপ চেষ্টা করুন ), সেগুলি সমস্তই ফিরে আসবে। এই "সমস্যা" এই প্রশ্নটিতে উল্লিখিত সমস্ত সরঞ্জামকে প্রভাবিত করে:


2
মনে রাখবেন যে কোনও ডোমেনের সিআইএম এন্ট্রি থাকলে তার ডোমেনটি কোনও আইপি ঠিকানার পরিবর্তে প্রথম লাইনে মুদ্রিত হতে পারে।
পিসওয়ার্ল্ড

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

4
এছাড়াও বিবেচনা ahosts, ahostsv4, ahostsv6সঙ্গে getent
0xC0000022L

cutজেন্টেন্টের জন্য নয়, যা \tকলাম পৃথক করতে ব্যবহার করে। সোলারিসের ক্ষেত্রে এটিই ঘটে।
সিভ করা

1
@ceving: সোলারিস উপর আপনি না চালানোর জন্য থাকতে পারে cutছাড়া -d(ডিফল্ট \tবিভেদক হিসাবে)। লিনাক্সে এটি ফাঁকা রয়েছে, সুতরাং উপরের লাইনটি কাজ করে।
sborsky

27

প্রদত্ত সমাধানগুলি এখন পর্যন্ত বেশিরভাগ সহজ ক্ষেত্রে কাজ করে: হোস্টনামটি সরাসরি একটি আইপিভি 4 ঠিকানার সমাধান করে। এটি কেবলমাত্র আপনার ক্ষেত্রে হোস্টনামগুলি সমাধান করার প্রয়োজন হতে পারে, তবে যদি তা না হয় তবে নীচে এমন কয়েকটি ক্ষেত্রে আলোচনা করা হচ্ছে যা আপনাকে হ্যান্ডেল করার প্রয়োজন হতে পারে।

ক্রিস ডাউন এবং হেইনজি সংক্ষিপ্তভাবে সেই ক্ষেত্রে আলোচনা করেছিলেন যেখানে হোস্টনাম একাধিক আইপি ঠিকানার সমাধান করে। এই ক্ষেত্রে (এবং অন্যদের নীচে), হোস্টনামটি সরাসরি একটি আইপি ঠিকানার সমাধান করে এমন ধারণার অধীনে বেসিক স্ক্রিপ্টিংটি ভেঙে যেতে পারে। নীচে, হোস্টনামের সাথে একটি আইপি ঠিকানার চেয়ে বেশি সমাধান করা একটি উদাহরণ:

$ 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সরাসরি আইপি অ্যাড্রেসগুলিতে সমাধান হয় না, তবে এমন একটি উপাধি যা নিজেই একাধিক আইপি ঠিকানার সমাধান করে। উপস্ব সম্পর্কিত আরও তথ্যের জন্য, এখানে চেক করুন । অবশ্যই, যেক্ষেত্রে একটি উপনামের একক আইপি ঠিকানা রয়েছে সেই ক্ষেত্রটি নীচে দেখানো সম্ভব:

$ 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

হোস্টনাম কোনও আইপি ঠিকানার সমাধান না করে এমন কোনও উপনামের সমাধান করে এমন কোনও উদাহরণ আমি পাইনি, তবে আমি মনে করি কেসটি ঘটতে পারে।

একাধিক আইপি অ্যাড্রেস এবং এলিয়াসের চেয়েও আরও কিছু বিশেষ কেস আছে ... আইপিভি 6 এর কী হবে? আপনি চেষ্টা করতে পারেন:

$ 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আইপিভি 6-কেবলমাত্র হোস্ট-নেম। দ্বৈত-স্ট্যাক হোস্টনামগুলি সম্পর্কে কী:

$ 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::

আবার আইপিভি 6 সম্পর্কে, যদি আপনার হোস্টটি কেবল আইপিভি 4 হয় তবে আপনি এখনও আইপিভি 6 ঠিকানাগুলি সমাধান করতে পারেন (কেবলমাত্র একটি আইভিভি 4 উইন এক্সপি এবং ipv6.google.com দিয়ে পরীক্ষা করা হয়েছে, আপনি এটি লিনাক্সে চেষ্টা করতে পারেন)। এই ক্ষেত্রে, রেজোলিউশন সফল হয়, তবে একটি অজানা হোস্ট ত্রুটির বার্তা সহ একটি পিং ব্যর্থ হয় । এটি এমন কোনও ক্ষেত্রে হতে পারে যেখানে আপনার স্ক্রিপ্টিং ব্যর্থ হয়।

আমি আশা করি যে মন্তব্যগুলি কার্যকর ছিল।


2
স্ক্রিপ্টিংয়ের ক্ষেত্রে যে কেউ মোকাবেলা করতে পারে এমন সমস্ত প্রান্তের কেস দেখিয়ে গ্রহণযোগ্য উত্তরের কী দুর্দান্ত পরিপূরক। আমার সংস্করণটি hostআমার বাক্সগুলির "ঠিকানা "ও উল্লেখ করে না।
মিহাই ড্যানিলা

21

উপকরণগুলির সমস্যা এড়াতে এবং সর্বদা ব্যবহারের জন্য একক আইপি ঠিকানা প্রস্তুত পেতে:

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

আমি এই উত্তর থেকে আমার বাশারিকে আটকে রাখতে একটি বাশ ফাংশন করেছি: gist.github.com/brycepg/ba117a37de53906dc8fcc312bd7d5fi
ব্রাইস গিন্টা

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

অন্যান্য সিস্টেমে নির্ভরতা ছাড়াই কাজ করে (এবং / ইত্যাদি / হোস্টে নির্দিষ্ট হোস্টের জন্য)


2
পিংয়ের ব্যবহারটি আমার যা দরকার তা হ'ল হোস্ট ফাইল থেকে আমার মূল্য প্রয়োজন তবে সেড প্যাটার্নটি সঠিকভাবে পার্সিং করা হয়েছে তবে এই পিং-কিউ-সি 1 -t 1 আপনার_শোস্ট_ এখানে | গ্রেপ পিং | sed -e "s / ^ [^ (] * [(] //" | সেড -e "এস / পিএল.পি.৪৪.৪৪)"
ম্যানিয়াকজেএক্সএক্স

1
আমার হোম নেটওয়ার্কে মাইহোস্টনামের মতো কিছু সমাধান করার জন্য this লোকাল এটি আমার পক্ষে কাজ করে তাই এটি সেরা উত্তর।
ম্যাট ফ্রেডম্যান

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

হোস্ট এখনও বিদ্যমান থাকলে সমস্ত কমান্ড একটি আইপি ঠিকানা সমাধান করবে। হোস্ট যদি সিএনএমে নির্দেশ করে তবে সে ক্ষেত্রে আইপিও পাবেন।

প্রথম কমান্ড সমাধান করা আইপিভি 4 ঠিকানা প্রদান করে

দ্বিতীয় কমান্ড সমাধান করা IPv6 ঠিকানা প্রদান করে

তৃতীয় কমান্ড মালিকদের পছন্দের ঠিকানাটি ফিরিয়ে দেবে যা আইপিভি 4 বা আইপিভি 6 ঠিকানা রাখতে পারে।


এখন পর্যন্ত সবচেয়ে সহজ এক। এবং এটি ডিফল্টরূপে উপলভ্য। এর মতো নয়hostbindutils
মাইকেলবন

7

এখানে pingপদ্ধতির সামান্য প্রকরণ যা "অজানা হোস্ট" কে অ্যাকাউন্টে গ্রহণ করে ( স্ট্যাডারের মাধ্যমে পাইপিং করে) এবং রিজেক্সপসের 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

ক্রিস ডাউনের উত্তরটি সম্পূর্ণ করার জন্য, এবং (সম্ভবত শৃঙ্খলাবদ্ধ) এলিয়াস সম্পর্কে জেফগ্যাগেনের মন্তব্যের সমাধানের জন্য, এখানে একটি সমাধান রয়েছে যা:

  • একাধিক আইপি অ্যাকাউন্টে নেয়
  • এক বা একাধিক উপকরণ (সিএনএম) অ্যাকাউন্টে নেয়
  • /etc/hostsফাইল জিজ্ঞাসা করে না (আমার ক্ষেত্রে আমি এটি চাইনি); এটি জিজ্ঞাসা করার জন্য, ডবার্টের অজগর সমাধানটি নিখুঁত)
  • awk / sed ব্যবহার করে না

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

সর্বদা প্রথম আইপি ঠিকানা, বা যদি সমাধান না করা হয় তবে খালি ট্রায়িং ফেরত দেয়। খননের সংস্করণ সহ:

    $ dig -v
    DiG 9.8.1-P1

1
ধন্যবাদ, অন্যান্য উত্তরগুলি ধরে "ডিগ + শর্ট" সর্বদা একটি একক আইপি ঠিকানা প্রদান করে। তারা সিএনএম-এর জন্য অ্যাকাউন্টিং করছিল না।
জামশিদ

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

এটি কাজ করে, তবে এর জন্য আপনার টার্মিনালে পিএইচপি ইনস্টল করা দরকার
Radon8472

1
টিপিক্যাল পিএইচপি ডকার কনটেইনারটিতে দরকারী হতে পারে যেখানে "হোস্ট", "ডিগ" ইত্যাদি পাওয়া যায় না
ফ্যাবিয়ান শেমংলার

5

আমি এন্ড্রু ম্যাকগ্রিগোর রে: পিং-এর একটি মন্তব্য হিসাবে এটি যুক্ত করতে চাই would তবে এটি আমাকে দেয় না, তাই আমাকে এটি অন্য উত্তর হিসাবে যুক্ত করা দরকার। (যদি কেউ এটিকে একটি মন্তব্যে স্থানান্তর করতে পারেন তবে নির্দ্বিধায়))

এটি আরেকটি বৈকল্পিক, কেবল পিং এবং গ্রেপ ব্যবহার করে:

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

grep -Eপ্রসারিত নিয়মিত অভিব্যক্তির জন্য এবং grep -oকেবল মিলে যাওয়া অংশটি ফিরে আসার জন্য। regexp নিজেই এক বা একাধিক অঙ্ক ( [0-9]+) এবং optionচ্ছিকভাবে একটি বিন্দু ( \.?) চারবার ( {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, তারপর এনএসলাপে ফিরে যায়:

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 / হোস্ট একটি লুকআপ নয় - এটি এর পূর্ণ অন কে DNS- সমাধানে কল করার জন্য একটি gethostbyaddr (3) , এবং এটি এর খুব একটি মামলা যেখানে ব্যর্থ করার সম্ভাবনা কম digসফল হবে। জেনেটের জন্য ম্যান পৃষ্ঠাটি দেখুন ।
স্টুয়ার্ট পি। বেন্টলে

@ স্টুয়ার্ট ঠিক বলেছেন - এটি লেখার পর থেকে আমি অনেক কিছু শিখেছি এবং একটি শক্তিশালী কমান্ডকে ছাপিয়েছি। getentআমার পছন্দের হিসাবে রয়ে গেছে, যদিও আমি এটি পছন্দ করিdig +short
রুবিট্রিস্টালডোন

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

সমাধানটি আমি ডিএনএস সার্ভার ছাড়াই পেয়েছি


3

সম্ভবত সবচেয়ে সংক্ষিপ্ত নয়, তবে এটি দৃust় এবং দক্ষ বলে মনে হচ্ছে:

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

এটি 1স্ট্যান্ডার আউটপুটটি মাস্ক করার সময় ব্যর্থতার ক্ষেত্রে ফিরে আসার পাশাপাশি একটি একক আইপিভি 4 আইপি আউটপুট দেয়।

আপনি এটি এর মতো ব্যবহার করতে পারেন:

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


3

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


1
ইতিমধ্যে বিদ্যমান উত্তরগুলির চেয়ে কীভাবে উত্তরটি উন্নত করে তাতে কিছু প্রসঙ্গ দুর্দান্ত। এছাড়াও, দয়া করে 4 স্পেস (সিএফ। মার্কডাউন সিনট্যাক্স) দ্বারা কমান্ডগুলি ইনডেন্ট করুন।
ম্যাক্সচলেপজিগ 21 '14

2

1 লাইন হোস্টনামের একটি তালিকা সমাধান করুন

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

2

আমি আমার ম্যাকে এটি সব সময় করছি যা নেই getentpingহ্যাকের মতো মনে হচ্ছে আমিও আমলে নিতে চাই /etc/hosts

সুতরাং, আমি dns.lookupআপনার জন্য একটি বোকা মোড়ক লিখেছিলাম যারা সিডিএল সরবরাহ করার জন্য নোড.জেএস ইনস্টল করেছেন:

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

সমাধানের কাছাকাছি কোথাও যাওয়ার আগে ভাঙ্গার 60% সম্ভাবনা।
ডটবিত

@ ডটবিত আপনি কি বিস্তারিত বলতে পারবেন? আমি '17 এর পরে এই সাপ্তাহিকটি ব্যবহার করেছি এবং কখনও কোনও সমস্যা হয়নি।
থমাস জেনসেন

@ জেনসেন তবে আপনি সর্বকালের মত একমাত্র ব্যক্তি। আমাদের বাকী অংশগুলি সাধারণত এক ধরণের বা অন্যরকম এবং সর্বদা ব্যর্থ হয়।
ডটবিট

"সর্বদা হিসাবে" আপনি এর অর্থ কি? "আমাদের বাকিরা" কে? "ফেইল এ চালানো" আপনি কোন নির্দিষ্ট সমস্যাটি দেখছেন? আমি কৌতুহলী.
থমাস জেনসেন


2

আমি ব্যাশ-স্ক্রিপ্টের সবচেয়ে সহজ উপায়টি জানি না তবে আপনি যদি কোনও হোস্টনামটি সমাধান করতে চান এবং হোস্টটি আপ হয় কিনা তা ব্যবহার করুন 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

পিং ব্যবহার করা ভাল, কারণ প্রত্যেকের কাছে এটি রয়েছে তবে আপনি যদি স্ক্রিপ্টে এটি ব্যবহার করতে চান তবে আপনাকে আউটপুটগুলি থেকে আইপি-পার্ট ফিল্টার করতে হবে।
Radon8472

1

হ্যাঁ, ইতিমধ্যে অনেক উত্তর রয়েছে তবে পার্ল ব্যবহার করে একটি সমাধান অনুপস্থিত:

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

একটি বাশ স্ক্রিপ্টে এটি ব্যবহার করা যেতে পারে:

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

এখানে ব্যবহৃত মডিউলগুলি মূল মডিউল, সুতরাং সিপিএএন ইনস্টল না করে সর্বত্র পাওয়া উচিত।


perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null অনেক পরিষ্কার। তবে আমরা দুজন ছাড়া আর কেউ পার্ল ব্যবহার করছে না, বাকি সবাই অবশ্যই পাস্কাল স্ক্রিপ্ট ব্যবহার করে।
ডটবিত

আসলে আমি কিছু ভুল হয়ে থাকলে ত্রুটি বার্তাগুলি দেখতে পছন্দ করি। 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
রুবি সংস্করণ আইপি ঠিকানার চারপাশে উদ্ধৃতি প্রিন্ট করে --- সম্ভবত এর printপরিবর্তে ব্যবহার করা উচিত p
স্লেভেন রেজিক

থেক্স, @ স্ল্যাভেন রেজিক এবং নির্দ্বিধায় উদ্বিগ্ন। তারপরে আবার, এখানে নীচে স্ক্রিপ্টটি আরও প্রদর্শিত হতে পারে ... ;-)
ডটবিট

-1
host -t a cisco.com

এই আদেশটি আইপি ঠিকানা প্রদর্শন করবে (আইপিতে ডোমেনটি পুনরায় প্রকাশ করবে)


-1

উপরের সমাধান ছাড়াও, আপনি নীচের স্ক্রিপ্টের মাধ্যমে একাধিক হোস্টের নাম আইপিতে অনুবাদ করতে পারেন, মূল ইউনিক্সের একমাত্র নির্ভরতা "পিং" কমান্ড:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.