কীভাবে আমার নিজের আইপি ঠিকানা পেতে এবং এটি একটি শেল স্ক্রিপ্টের একটি ভেরিয়েবলে সংরক্ষণ করতে?


65

আমি কীভাবে নিজের আইপি ঠিকানা পেতে পারি এবং এটি শেল স্ক্রিপ্টের একটি ভেরিয়েবলে সংরক্ষণ করতে পারি?


2
সাবধানতার একটি শব্দ: এখানে অনেকগুলি "আমার সিস্টেমে কাজ করে" উত্তর রয়েছে যা অন্য পরিবেশে পোর্টেবল নাও হতে পারে। আপনার সিদ্ধান্ত নিতে হবে যে আপনি এমন কিছু চান যা আপনার পক্ষে কাজ করে বা এমন কিছু যা ভাগ করে নেওয়া যায়। প্রতিটি সিস্টেমে একাধিক আইপি থাকে। একটি বহনযোগ্য সমাধান প্রশ্নটির উত্তর দেয়: " ব্লেহে পৌঁছতে আমি কোন আইপি ব্যবহার করি ?" আমার সিস্টেম সমাধানে একটি কাজ প্রশ্নটির উত্তর দেয়: "আমার আইপি কী?" এটির সাথে: "আমি মনে করি আপনি এটির অর্থই বোঝাচ্ছেন ..." এটি পোর্টেবল ইউনিক্স.স্ট্যাকেক্সেঞ্জিং.com
ব্রুনো ব্রোনোস্কি

এই একটি উপায় IP ঠিকানা ফর্ম জন্য / proc প্রাপ্ত প্রদান করে unix.stackexchange.com/questions/365225/...
Pierz

উত্তর:


30

আপনি যদি ওয়ালান এবং অন্যান্য বিকল্প ইন্টারফেসগুলিকে বিবেচনা করতে চান তবে এটি এত সহজ নয়। আপনি যদি জানেন যে কোন ইন্টারফেসের জন্য আপনি ঠিকানা চান (উদাহরণস্বরূপ, eth0, প্রথম ইথারনেট কার্ড), আপনি এটি ব্যবহার করতে পারেন:

ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"

অন্য কথায়, আমার জন্য নেটওয়ার্ক কনফিগারেশন তথ্য পান, সন্ধান করুন, eth0সেই লাইনটি এবং পরেরটিটি ( -A 1) সন্ধান করুন, কেবল সর্বশেষ লাইনটি পান, বিভক্ত হওয়ার সময় সেই লাইনের দ্বিতীয় অংশটি পান :, তারপরে বিভক্ত হওয়ার সময় এর প্রথম অংশটি পান স্থান সহ


1
এতে grep"eth0:" দিয়ে কোনও ইন্টারফেস উপেক্ষা করতে আমি আপনার কোডে একটি অতিরিক্ত যুক্ত করেছি; এটি এখন আমার প্রত্যাশার মতোই কাজ করে (কেবলমাত্র "eth0" আইপি ঠিকানা প্রদান করে এবং কোনও উপ-ইন্টারফেস নয় (eth0: 0, eth0: 1, ইত্যাদি):ip="$(ifconfig | grep -v 'eth0:' | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"

6
আপনি ব্যবহার করে প্রথম গ্রেপ এড়িয়ে যেতে পারেনifconfig eth0
ব্রায়ান লার্সেন


70

আমি বিশ্বাস করি আপনার আইপিভি 4 ঠিকানা পাওয়ার "আধুনিক সরঞ্জামগুলি" উপায়টি 'আইফোনফিগ' এর পরিবর্তে 'আইপি' পার্স করা, সুতরাং এটি এমন কিছু হবে:

ip4=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
ip6=$(/sbin/ip -o -6 addr list eth0 | awk '{print $4}' | cut -d/ -f1)

বা এই জাতীয় কিছু।


4
ipআমার ব্যবহৃত সমস্ত রেড হ্যাট এবং ফেডোরা ডিস্ট্রোজে উপলব্ধ। ipআইপ্রাউট 2 প্যাকেজের অংশ ( লিনাক্সফাউন্ডেশন.আর / কোলবোরেট / ওয়ার্কগ্রুপস / নেটওয়ার্কিং / আইপ্রুটি 2 )। ifconfigএবং routeঅনুমান করা হয়, যদিও এগুলি প্রচুর লোকের দ্বারা বিশেষত স্ক্রিপ্টগুলিতে ব্যবহার করা অবিরত রয়েছে। ipআমার মতামত, আরও অনেক পার্সেবল।
jsbillings

3
ipআমি দেখেছি এমন সমস্ত ডেবিয়ান এবং ডেবিয়ান ভিত্তিক ডিস্ট্রোগুলিতেও উপলব্ধ। এটি আইপ্রেট প্যাকেজের অংশ যা গুরুত্বপূর্ণ হিসাবে চিহ্নিত হয়েছে।
অ্যারোমাস্টার

2
এটি একেবারে কীভাবে করা উচিত, আমি তাদের অন্যান্য আইফোনফিগ ব্যবহারের উত্তরগুলিকে নীচে নামিয়ে দেব। ipiproute2 প্যাকেজের অংশ যা ডিফল্টরূপে অনেকগুলি ডিস্ট্রো। এটি সবচেয়ে ভাল ভাতে। en.wikipedia.org/wiki/Iproute2
jwbensley

3
@jsbillings এর /sbin/ipপরিবর্তে কেন ip?
l0b0

1
এটি একটি দুর্দান্ত উত্তর! সমন্বয় awkএবং cutআস্তে আমার কাছে মজাদার, এখানে একটি সম্ভাব্য বিকল্প যা আসলে ভাল নাও হতে পারে আছে:ip -o -4 addr show eth0 | awk '{ split($4, ip_addr, "/"); print ip_addr[1] }'
সুইস

32

কেন সহজভাবে না IP=$(hostname -I)?


3
hostname -iআমাকে দেয় 127.0.0.1, hostname -Iআমাকে সঠিক আইপি adress ... দেয়
ছাত্র

@ বিদ্রূপী হ্যাঁ, আমি এটি এমন একটি মেশিনে পরীক্ষা করেছি যা তার হোস্টনামটি সমাধান করতে পারে, যেমন ম্যানপেজটি বলেছে-i Display the network address(es) of the host name. Note that this works only if the host name can be resolved. Avoid using this option; use hostname --all-ip-addresses
আন্দ্রেই

আমি কীভাবে আমার মেশিনটির হোস্টনেম সমাধান করতে কনফিগার করব?
ছাত্র

সবচেয়ে সহজতম উপায় এটি /etc/hostsসম্পর্কিত আইপি ঠিকানার সাথে যুক্ত করছে
আন্দ্রেই

3
-Iফ্রিবিএসডি-তে নেই , তবে আপনি ব্যবহার করতে পারেনdig +short `hostname -f`
টিগার

24

আপনি যদি কোনও ইন্টারফেসের ঠিকানা চান, তবে সবচেয়ে সহজ উপায় হ'ল মুর্টিলগুলি ইনস্টল করা:

anthony@Zia:~$ ifdata -pa br0
172.16.1.244

ifdataবেশিরভাগই প্রতিটি প্রশ্নের উত্তর দেয় যা আপনার ifconfigজন্য আউটপুট পার্স করার প্রলুব্ধ হয় ।

যদি আপনি আপনার আইপি ঠিকানাটি বাইরের দেখতে যেমন দেখতে পান তবে এটি খুঁজে পেতে চান (কোনও NAT, ইত্যাদির বাইরে), প্রচুর পরিষেবা রয়েছে যা এটি করবে। একটি মোটামুটি সহজ:

anthony@Zia:~$ curl ifconfig.me
173.167.51.137

ওহ মঙ্গল, এই উত্তরের জন্য আপনাকে ধন্যবাদ। এর আগে মুরগির কথা কখনও শুনিনি। আমি ঠিক তা করতে আমার নিজের ছোট্ট সি প্রোগ্রাম লেখার বিষয়ে গুরুত্ব সহকারে বিবেচনা করছিলাম।
ক্রিস হ্যারিংটন

এটি ifdataযুক্ত করা ভাল হবে iproute2। হতে পারে একটি নতুন বাইনারি নামে পরিচিতipdata
সুইস

ifdata ভাল তবে এটি ipv6 সমর্থন করে না।
MakeBackCommodore64

15

আইপিভি 4 এবং আইপিভি 6 ঠিকানা পেতে এবং প্রধান ইন্টারফেসটি ধরে নেই eth0(এই দিনগুলি em1 বেশি সাধারণ ), চেষ্টা করুন:

ips=$(ip -o addr show up primary scope global |
      while read -r num dev fam addr rest; do echo ${addr%/*}; done)
  • -oএক-লাইন আউটপুট ফরম্যাট, যা সহজ সঙ্গে প্রক্রিয়া ব্যবহার read, grepইত্যাদি
  • up সক্রিয় নয় এমন ডিভাইসগুলি বাদ দেয়
  • scope globalব্যক্তিগত / স্থানীয় ঠিকানা যেমন 127.0.0.1এবং হিসাবে বাদ দেয়fe80::/64
  • primaryঅস্থায়ী ঠিকানাগুলি বাদ দেয় (ধরে নিবেন এমন কোনও ঠিকানা চান যা পরিবর্তিত হয় না)

1
এটি সেরা উত্তর হতে হবে কারণ 1) এটি কোনও ডিভাইসের নাম ধরে নেয় না, 2) এটি 'আইপি' ব্যবহার করে পুরানো স্কুল 'ইফকনফিগ' এর বিপরীতে, এবং 3) এটি আইপিভি 6 কেও সমর্থন করে।
MakeBackCommodore64

আমি সম্মত হয়েছি, এটি বেশিরভাগ ব্যবহারের ক্ষেত্রে সবচেয়ে ভাল শুরু। আপনি ফিল্টার ঠিকানা প্রকার -4/ পাস করতে পারেন -6। আপনি সহজেই অন্যান্য ইন্টারফেস পরামিতি পেতে পারেন। ব্যক্তিগতভাবে, লুপ করার সময় আমি অপছন্দ করি এবং আমি পছন্দ করিgrep -o 'inet6\? [0-9a-f\.:]*' | cut -f 2 -d ' '
জারুমে পাউিলার

7

নিজের আইপি ঠিকানার মাধ্যমে আপনি কী বোঝাতে চান তা নির্ভর করে। সিস্টেমে কয়েকটি সাবনেটগুলিতে আইপি অ্যাড্রেস থাকে (কখনও কখনও সাবनेटে বেশ কয়েকটি), যার মধ্যে কিছু আইপিভি 4, কিছু আইপিভি 6 ইথারনেট অ্যাডাপ্টার, লুপব্যাক ইন্টারফেস, ভিপিএন টানেল, ব্রিজ, ভার্চুয়াল ইন্টারফেসের মতো ডিভাইস ব্যবহার করে ...

আমি আপনাকে বোঝাতে চাইছি এমন আইপি ঠিকানা যা দিয়ে অন্য প্রদত্ত ডিভাইসটি আপনার কম্পিউটারে পৌঁছতে পারে, আপনাকে খুঁজে বের করতে হবে যে এটি কোন সাবনেট, এবং আমরা কোন আইপি'র সংস্করণটির কথা বলছি। এছাড়াও, মনে রাখবেন যে ফায়ারওয়াল / রাউটারগুলির দ্বারা করা NAT এর কারণে, কোনও ইন্টারফেসের আইপি ঠিকানাটি একই রকম নাও হতে পারে যেমন কোনও দূরবর্তী হোস্ট আপনার কম্পিউটার থেকে আগত সংযোগটি দেখে।

যখন অভিনব উত্সের রাউটিং বা প্রতি প্রোটোকল / পোর্ট রাউটিং থাকে তখন কোনও প্রদত্ত প্রোটোকলের উপর দিয়ে কোনও দূরবর্তী কম্পিউটারের সাথে কোন ইন্টারফেসের জন্য কথা বলতে ব্যবহৃত হবে তা খুঁজে পাওয়া মুশকিল হতে পারে, তখনও সেই ইন্টারফেসের আইপি ঠিকানা হতে পারে এমন কোনও গ্যারান্টি নেই আপনার কম্পিউটারে একটি নতুন সংযোগ স্থাপন করতে চাইলে প্রত্যন্ত কম্পিউটার দ্বারা সরাসরি ঠিকানাযোগ্য।

আইপিভি ((সম্ভবত আইপিভি for-র জন্যও কাজ করে) এর জন্য একটি কৌশল যা লিনাক্স সহ অনেকগুলি ইউনেসে একটি নির্দিষ্ট হোস্টে পৌঁছানোর জন্য ব্যবহৃত ইন্টারফেসের আইপি অ্যাড্রেস খুঁজে বের করতে একটি ইউডিপি সকেটে কানেক্ট (2) ব্যবহার করে গেসোকনাম ব্যবহার করে ():

উদাহরণস্বরূপ, আমার বাড়ির কম্পিউটারে:

perl -MSocket -le 'socket(S, PF_INET, SOCK_DGRAM, getprotobyname("udp"));
connect(S, sockaddr_in(1, inet_aton("8.8.8.8")));
print inet_ntoa((sockaddr_in(getsockname(S)))[1]);'

ইন্টারফেসের আইপি ঠিকানাটি খুঁজে পেতে ব্যবহার করা হবে যার মাধ্যমে আমি ৮.৮.৮.৮ (গুগলের ডিএনএস সার্ভার) পৌঁছাতে পারি। এটি "192.168.1.123" এর মতো কিছু ফেরত দেবে যা ইন্টারনেটে ডিফল্ট রুটের ইন্টারফেসের ঠিকানা। তবে, গুগল আমার মেশিনের ডিএনএস অনুরোধটি দেখতে পাবে না যেটি সেই আইপি ঠিকানা থেকে এসেছে যা একটি ব্যক্তিগত ঠিকানা, যেমনটি আমার বাড়ির ব্রডব্যান্ড রাউটারের দ্বারা সম্পাদিত NAT রয়েছে।

কোনও ইউডিপি সকেটে সংযুক্ত () কোনও প্যাকেট প্রেরণ করে না (ইউডিপি সংযোগ-কম), তবে রাউটিং টেবিলটি জিজ্ঞাসা করে সকেট প্রস্তুত করে।


7
ipa=$(ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g')

ipa=$(hostname -i|cut -f2 -d ' ')

1
-Iপরিবর্তে ব্যবহার করা -iআরও ভাল যেমন আপনি লুপব্যাক অ্যাড্রেসগুলি উপেক্ষা করতে চান, তাই চূড়ান্ত আদেশটি হবেipa=$(hostname -I|cut -f1 -d ' ')
কার্ল.এস

1
যদি grepপর্যাপ্ত না হয় তবে এটি অন্য কোনও কিছুর কাছে পাইপ করবেন না। শুধু অন্য কিছু (ব্যবহার sed, awkইত্যাদি)।
ব্রুনো ব্রোনোস্কি

7

আমি বোকা হওয়া বলতে চাই না, তবে সত্যিই একটি সঠিক উপায় আছে এবং এটি এটি। আপনি ip routeকেবল উত্স আইপি পেতে আউটপুটটি ছাঁটাই করেন । আপনি কোন আইপি-তে পৌঁছানোর চেষ্টা করছেন তার উপর নির্ভর করে "আমার নিজের আইপি ঠিকানা" (ওপির শব্দ) আলাদা হবে। আপনি যদি সর্বজনীন ইন্টারনেটে পৌঁছানোর বিষয়ে চিন্তা করেন তবে গুগলের 8.8.8.8 ডিএনএস সার্ভারটি ব্যবহার করা বেশ মান standard তাই ...

সংক্ষিপ্ত উত্তরটি হ'ল:

ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'

এখানে বিস্তারিত ব্যাখ্যা

ইন্টারনেটে পৌঁছানোর জন্য আমি যে আইপি ব্যবহার করি তা যদি আমি চাই তবে আমি এটি ব্যবহার করি:

pi@et3:~ $ ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
10.55.0.200

আমি যদি আমার ভিপিএন- তে কিছু পৌঁছানোর জন্য আইপিটি ব্যবহার করি তবে আমি এটি ব্যবহার করি:

pi@et3:~ $ ip route get 172.31.0.100 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
172.29.0.9

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

আমি নিজের কাছে পৌঁছানোর জন্য আমি যে আইপিটি ব্যবহার করি তা চাইলে আমি এটি ব্যবহার করব :

pi@et3:~ $ my_ip=$(getent hosts $(cat /etc/hostname) | awk '{print $1; exit}')
pi@et3:~ $ ip route get $my_ip | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
127.0.0.1

এই sedআদেশ সম্পর্কে আরও

প্রথমে আমাকে বলতে দাও যে ইউনিক্স সরঞ্জামগুলি বেছে নেওয়ার সময়, আপনি সেই সরঞ্জামগুলি বেছে নেওয়ার চেষ্টা করবেন যার জন্য খুব কম পাইপ প্রয়োজন require সুতরাং, যখন কিছু উত্তর নল হবে ifconfigথেকে grepথেকে sedথেকে head, যে ধরণের ঘটনা খুব কমই প্রয়োজন। আপনি যখন এটি দেখেন, এটি একটি লাল পতাকা বাড়াতে হবে যা আপনি অল্প অভিজ্ঞতার সাথে পরামর্শ নিয়ে চলেছেন। এটি "সমাধান" ভুল করে না। তবে, এটি সম্ভবত কিছু স্ট্রিমলাইনিং ব্যবহার করতে পারে।

আমি sedএটি বেছে নিয়েছি কারণ এটি একই কর্মপ্রবাহের চেয়ে বেশি পরিশ্রুত awk। (আমি নীচে থেকে একটি অদ্ভুত উদাহরণ আছে।) আমি মনে করি না যে অন্য কোনও সরঞ্জাম তবে সেই 2 টি উপযুক্ত হবে।

আসুন পরীক্ষা করে দেখুন কী sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'করে:

sed            # the sed executable located via $PATH
-n             # no output unless explicitly requested
'              # begin the command space
/src/          # regex match the string 'src'
{              # begin a block of commands **
s/             # begin a substitution (match)
  .*src *      # match anything leading up to and including src and any number of spaces
  \([^ ]*\)    # define a group containing any number of non spaces
  .*           # match any trailing characters (which will begin with a space because of the previous rule).
/              # begin the substitution replacement
  \1           # reference the content in the first defined group
/              # end the substitution
p              # print (explicitly, remember) the result
;              # designate the end of the command
q              # quit
}              # end the block of commands
'              # end the command space

** all of which will be performed "on match"
  - otherwise only the first command to following the match would be performed "on match"
    - any other commands would be performed whether there was a match or not
বিঃদ্রঃ:

আমি ব্যবহার করতাম sed -n '/src/{s/.*src *//p;q}'তবে একটি মন্তব্যকারী নির্দিষ্ট করে দিয়েছিলেন যে কিছু সিস্টেমে srcমাঠের পরে ডেটা পিছনে রয়েছে ।

অজানা ব্যবহার করা হচ্ছে

ip route get 8.8.8.8 | \
    awk '{gsub(".*src",""); print $1; exit}'

# or

ip route get 8.8.8.8 | \
    awk '{for(i=1; i<NF; i++){if($i=="src"){i++; print $i; exit}}}'

আমার নেটওয়ার্ক সম্পর্কে আরও

আমার ifconfigশোগুলি যে tun0আমার ভিপিএন এবং eth0আমার লনের জন্য রয়েছে।

pi@et3:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.55.0.200  netmask 255.255.252.0  broadcast 10.55.3.255
        inet6 fe80::71e6:5d7c:5b4b:fb25  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:b2:96:84  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 172.29.0.9  netmask 255.255.255.255  destination 172.29.0.10
        inet6 fe80::3a8e:8195:b86c:c68c  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:e7:c3:d1  txqueuelen 1000  (Ethernet)

ip route get 8.8.8.8 | sed -n '/src/{s/.*src *//p;q}'আমাকে দিয়েছে 10.1.2.3 uid 1002। সুতরাং আমি | awk '{print $1}'কেবল আইপি ঠিকানা রাখতে সংযোজন করব ।
উইসবাকি

@ উইসবাকী আমি কখনই রেকর্ডকৃত কোডগুলিতে একে অপরের কাছে সেড / অ্যাজক / গ্রেপ পাইপ করি না। (আমি হুট করেই কমান্ড লাইনে এটি ব্যবহার করব, তবে আমার ~ / .bash_history ব্যতীত অন্য কোনও ডিস্কে এটি লিখিত পাবেন না) আমি উত্তেজক ব্যবহারের উত্তর আপডেট করেছি এবং এটি এই সমস্যার সমাধান করে।
ব্রুনো ব্রোনোস্কি

1
@ উইসবাকী আমি এটি দাঁড়াতে পারিনি। আমি আপনার পরিবেশের সাথে আমার সেড কাজ করেছি।
ব্রুনো ব্রোনস্কি

2

ফ্রিবিএসডি-তে আপনি ব্যবহার করতে পারেন

dig +short `hostname -f`

এটি অন্যান্য পরিবেশের জন্য কাজ করতে পারে, আপনার সেট আপের উপর নির্ভর করে।


আমি বিশ্বাস করি এটি /etc/resolv.confকীভাবে নেটওয়ার্ক রাউটার স্থানীয় হোস্ট-নেমগুলি পরিচালনা করে on এটা ব্যবহার করতে সূক্ষ্ম আপনার পরিবেশ যদি আপনি এটি পরীক্ষা করতে এবং এটি কাজ করে। তবে আপনি যদি এটি করেন তবে আপনি একটি "ব্রিটল" সিস্টেম তৈরি করছেন যা এটি ভাগ করে নিলে অন্যকে সমস্যার কারণ হতে পারে। সতর্কতার সাথে ব্যবহার করুন.
ব্রুনো ব্রোনোস্কি

2

ধরে নিচ্ছি যে আপনার বিভিন্ন নামের বিভিন্ন ইন্টারফেস থাকতে পারে তবে আপনি প্রথম নন-লোকালহোস্ট এবং নন-আইপিভি 6 চান, আপনি চেষ্টা করতে পারেন:

ip=`ip addr show |grep "inet " |grep -v 127.0.0. |head -1|cut -d" " -f6|cut -d/ -f1`

ip = $ (ifconfig | grep -oP '(? <<= inet adder:) \ S *' | grep -v 127)
rcjohnson

1

আমি এই ওয়ান-লাইনারটি ব্যবহার করি:

IP=$(/sbin/ifconfig | grep -e "inet:" -e "addr:" | grep -v "inet6" | grep -v "127.0.0.1" | head -n 1 | awk '{print $2}' | cut -c6-)

ব্যবহার ifconfig(ব্যাপকভাবে উপলভ্য), localhostঠিকানা গ্রহণ করে না , আপনাকে প্রদত্ত ইন্টারফেস নামের সাথে আবদ্ধ করে না, আইপিভি 6 আমলে নেয় না এবং প্রথম নেটওয়ার্ক ইন্টারফেসের আইপি উপলব্ধ করার চেষ্টা করে।


1
myip=$(curl -kLs "http://api.ipify.org")

অথবা

myip=$(wget -q "http://api.ipify.org" -O -)

1

আপনার বর্তমান ipপরিবর্তিত ifconfig, রক্ষণাবেক্ষণ করা এবং সম্ভবত স্ক্রিপ্টিংয়ের জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয় হিসাবে এটির পরিবর্তে ) ব্যবহার করা উচিত , এটি একটি ধারাবাহিক & পার্সেবল আউটপুট উত্পাদন করে। নিম্নলিখিত কয়েকটি অনুরূপ পন্থা:

আপনি যদি আপনার ইথারনেট ইন্টারফেসের জন্য আইপিভি 4 ঠিকানা চান eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

লিপি হিসাবে:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

উপরে উত্পাদিত আউটপুট সিআইডিআর স্বরলিপি হয়। সিআইডিআর স্বরলিপি না চাইলে এটি ছিনিয়ে নেওয়া যায়:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

আইএমএইচও "সর্বাধিক মার্জিত" এর অন্য একটি বিকল্প নির্দিষ্ট দূরবর্তী হোস্টের সাথে সংযোগ স্থাপনের জন্য যা কিছু ইন্টারফেস ব্যবহার করা হয় তার IPv4 ঠিকানা পায় (এই ক্ষেত্রে 8.8.8.8)। এই উত্তরে @ গ্যাটোয়াটিগ্রাডোর সৌজন্যে :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

লিপি হিসাবে:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

এটি একটি একক ইন্টারফেস সহ হোস্টে পুরোপুরি ভাল কাজ করে, তবে আরও সুবিধাজনকভাবে একাধিক ইন্টারফেস এবং / অথবা রুট স্পেসিফিকেশন সহ হোস্টগুলিতেও কাজ করবে।

ipআমার পছন্দসই পদ্ধতি হবে, তবে অবশ্যই এই বিড়ালের চামড়ার একমাত্র উপায় নয়। hostnameআপনি যদি আরও সহজ / আরও সংক্ষিপ্ত কিছু পছন্দ করেন তবে এখানে এমন আরও একটি পদ্ধতির ব্যবহার রয়েছে :

$ hostname --all-ip-addresses | awk '{print $1}'  

অথবা, আপনি যদি আইপিভি 6 ঠিকানা চান:

$ hostname --all-ip-addresses | awk '{print $2}'  

0

আমার তারযুক্ত এনআইসিতে রেডিও সার্ভার শুরু করার জন্য আমার একটি উলামের মধ্যে এটি করা দরকার। আমি ব্যবহার করতাম

ip addr | egrep -i "inet.+eth1" | awk -F[\ /] '{print $6}' | tr -d [:space:]

egrepঅবচয় করা হয়। grep -Eপরিবর্তে ব্যবহার করুন।
ইয়োকাই

0

কিছু কমান্ড সেন্টোস 6 বা 7 এ কাজ করছে, নীচের কমান্ড দুটিতে কাজ করছে,

#!/bin/sh

serverip=`/sbin/ifconfig eth0 | grep "inet" | awk '{print $2}' | awk 'NR==1' | cut -d':' -f2`

echo $serverip

যে উপায় খুব বেশি grep | awk | awk। লাইনটি সংক্ষিপ্ত করা যেতে পারে/sbin/ifconfig eth0 | awk '$1 == "inet" { print substr($2,6); next ; } '
আরচেমার

আমি গ্রহণ করেছি, আপনি কি সেন্টোস 6 এবং 7 উভয়ই পরীক্ষা করতে পারবেন? Centos 7.x / sbin / ifconfig eth0 | awk '$ 1 == "inet" {মুদ্রণ সাবস্ট্রাস্ট ($ 2,6); পরবর্তী ; 35 '35.104.41 Centos6.x (ফাইন কাজ করছে) / sbin / ifconfig eth0 | awk '$ 1 == "inet" {মুদ্রণ সাবস্ট্রাস্ট ($ 2,6); পরবর্তী ; 192 '192.168.0.1
লক্ষ্মীকান্দন

0

ধরে নেওয়া আপনার পৃথিবীর অন্যান্য অংশ থেকে যেমন দেখানো হয়েছে আপনার প্রাথমিক পাবলিক আইপি দরকার , এর মধ্যে যে কোনও একটি ব্যবহার করে দেখুন:

wget http://ipecho.net/plain -O - -q
curl http://icanhazip.com
curl http://ifconfig.me/ip

0

এই স্নিপেট ডিভাইসটির নাম ('এথ0' এর মতো) হার্ড-কোডিং এড়ায় এবং এর ipপরিবর্তে ব্যবহার করবে ifconfig:

/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'

এটি এর আউটপুটে তালিকাভুক্ত প্রথম সক্রিয় ডিভাইসের আইপি ফিরিয়ে দেবে ip addr। আপনার মেশিনের উপর নির্ভর করে এটি আইপিভি 4 বা আইপিভি 6 ঠিকানা হতে পারে।

এটিকে ভেরিয়েবলে সঞ্চয় করতে, ব্যবহার করুন:

ip=$(/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')

0

বেকার / সেড / গ্রেপ ব্যবহার করে সমস্ত সমাধান আমার পরিস্থিতির জন্য অত্যধিক জটিল এবং কুৎসিত বলে মনে হচ্ছে ... সুতরাং আমি এই সত্যিই সহজ সমাধানটি নিয়ে এসেছি তবে এ সম্পর্কে কিছু ধারণা অনুধাবন করা উচিত, ধারণাটি হ'ল সর্বশেষতম ইন্টারফেসটি হ'ল আপনি one আগ্রহী. যদি আপনি এটির সাথে ঠিক থাকেন তবে এটি বেশ পরিষ্কার:

ifconfig | awk '/net / { x = $2 } END { print x }'

অন্যথায় আপনি ifনির্দিষ্ট উপসর্গ বা আপনার যে মানদণ্ড থাকতে পারে তা পরীক্ষা করার জন্য কিছু নির্বোধ বক্তব্য করতে পারেন।


0

ডিফল্ট ইন্টারফেস সহ আইপি অ্যাড্রেস জরিমানা করার সহজ কমান্ড।

ip route | grep src | awk '{print $NF; exit}'

সমস্ত ইউনিক্স ওএসে পরীক্ষিত


0

এটি সর্বাধিক শক্তিশালী বা সঠিক সমাধান নাও হতে পারে তবে অন্যান্য বেশিরভাগ সমাধানের বিপরীতে কমান্ডটি লিনাক্স এবং ম্যাক উভয় ক্ষেত্রেই কাজ করে।

host `hostname` | awk '{print $NF}'

0

আপনি যদি বাক্সটির সার্বজনীন আইপি ঠিকানা সন্ধান করছেন , আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

  • dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \"

আপনি আইপিভি 4 বা আইপিভি 6 ঠিকানার dig(1)মতো -4বা -6বিশেষত সন্ধানের জন্য বিকল্পগুলি ব্যবহার করতে পারেন ; গুগল TXTপ্রকারের একটি রেকর্ডে একটি উত্তর সরবরাহ করবে, যা উপস্থাপন করার সময় এর চারপাশে উদ্ধৃতি থাকবে dig; যদি আপনি পরবর্তীকালে ইউটিলিটিগুলির সাথে ভেরিয়েবলটি ব্যবহার করতে চান তবে আপনাকে উদ্ধৃতিগুলি সরানোর জন্য ট্র (1) এরtraceroute মতো কিছু ব্যবহার করতে হবে ।

অন্যান্য বিকল্পগুলির মধ্যে অন্তর্ভুক্ত রয়েছে whoami.akamai.netএবং myip.opendns.comযা উত্তর Aএবং AAAAরেকর্ড করে ( TXTগুগলের উপরের উদাহরণের পরিবর্তে ), সুতরাং তাদের উদ্ধৃতি অপসারণের প্রয়োজন নেই:

  • dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

  • dig -4 @resolver1.opendns.com -t any myip.opendns.com +short

  • dig -6 @resolver1.opendns.com -t any myip.opendns.com +short

ভেরিয়েবলগুলি সেট করতে উপরের সমস্ত বিকল্প ব্যবহার করে এমন একটি নমুনা স্ক্রিপ্ট এখানে দেওয়া হয়েছে:

#!/bin/sh
IPANY="$(dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv4="$(dig -4 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv6="$(dig -6 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
AKAMv4="$(dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short)"
CSCOv4="$(dig -4 @resolver1.opendns.com -t a myip.opendns.com +short)"
CSCOv6="$(dig -6 @resolver1.opendns.com -t aaaa myip.opendns.com +short)"
printf '$GOOG:\t%s\t%s\t%s\n' "${IPANY}" "${GOOGv4}" "${GOOGv6}"
printf '$AKAM:\t%s\n$CSCO:\t%s\t%s\n' "${AKAMv4}" "${CSCOv4}" "${CSCOv6}"

আপনি একটি ব্যক্তিগত IP ঠিকানা খুঁজছেন, অথবা বক্স নির্ধারিত সব IP ঠিকানার একটি এমন সেট, আপনি কিছু সমন্বয় ব্যবহার করতে পারে ifconfig, (বাসদ এবং জিএনইউ / লিনাক্স দিকে) ip addr(জিএনইউ / লিনাক্স দিকে), hostname(অপশন -iএবং -Iউপর জিএনইউ / লিনাক্স) এবং netstatকী চলছে তা দেখার জন্য।


-2
hostname -I >> file_name 

এটি আপনার যা কিছু করতে পারে তা করবে


hostname: invalid option -- 'l'...
জেসনওয়ারিয়ান

এটি একটি মূলধন i। এটি সুস্পষ্টরূপে কাজ করছে বলে মনে হচ্ছে যদিও এটি স্পষ্টতই সমস্ত ইন্টারফেসের আইপি ঠিকানাগুলি প্রিন্ট করে।
জো

এটি পূর্ববর্তী উত্তরের একটিতে প্রস্তাবিত। এছাড়াও এটি ভেরিয়েবলে আইপি সংরক্ষণ করে না। তাহলে এই উত্তরটির মূল বক্তব্য কী?
জাকুজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.