2010-03-02 2 views
11

प्रसंग:कुशल तरीका शेल स्क्रिप्ट में आपके आईपी पते पाने के लिए

ifconfig | grep 'inet' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{print $1}' 

या भी इस तरह से: * nix सिस्टम पर, एक इस तरह एक खोल स्क्रिप्ट में मशीन का IP पता प्राप्त कर सकते हैं :

ifconfig | grep 'inet' | grep -v '127.0.0.1' | awk '{print $2}' | sed 's/addr://' 

प्रश्न: एक और अधिक सरल, अभी भी पोर्टेबल, जिस तरह से एक खोल स्क्रिप्ट में उपयोग के लिए आईपी पते पाने के लिए वहाँ होगा?

(my apologies to *BSD and Solaris users as the above command may not work, मैं परीक्षण नहीं कर सकता है)

+2

क्या होगा अगर मशीन एक से अधिक एनआईसी है उपयोग कर सकते हैं? –

+1

"आईपी पता" से आपका क्या मतलब है? वर्कस्टेशन पर भी दो या दो से अधिक आईपी पते होने के लिए यह बहुत आम है ... –

+0

हां, मैंने इस मुद्दे के बारे में सोचा था। लेकिन यह इस बात पर निर्भर करता है कि स्क्रिप्ट को क्या करना है। मेरी व्यक्तिगत जरूरतों के लिए, मैं आमतौर पर इंटरफ़ेस नाम ifconfig (यानी 'ifconfig eth0', आदि) को पास करता हूं। मैंने सोचा कि सवाल बहुत विशिष्ट होगा। कोई सुझाव है कि प्रश्न को और अधिक सार्थक कैसे बनाया जाए? धन्यवाद! सुझाव के लिए –

उत्तर

12

आप इसे केवल एक अजीब कमांड के साथ कर सकते हैं। बहुत अधिक पाइप का उपयोग करने की जरूरत नहीं है।

$ ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/{split($2,_," ");print _[1]}' 
+0

+1, लेकिन व्हाइटस्पेस लुप्तप्राय नहीं है: अधिक –

+0

का उपयोग करें आपका प्रस्ताव बहुत अच्छा है। सरल परीक्षण से पता चलता है कि यह मेरे मूल प्रस्तावों की तुलना में औसतन तेज़ है। मैं अभी आपके लिए स्वीकार करना चाहता हूं। '_ [1]' और '$ 2' के कारण पोर्टेबिलिटी बेहतर नहीं है। उदाहरण के लिए, मुझे * बीएसडी के तहत सूचकांक स्विच करने की आवश्यकता है (आह, इस बार इसका परीक्षण कर सकते हैं)। ईमानदारी से, मुझे अभी भी आश्चर्य है कि एक शॉट में आईपी प्राप्त करने के लिए कोई उपकरण है, शायद पास पैरामीटर (जैसे इंटरफ़ेस नाम)। 'ifconfig' वास्तव में" नेटवर्क इंटरफ़ेस पैरामीटर कॉन्फ़िगर करें "है, पैरामीटर नहीं प्राप्त करें ... शायद टॉम द्वारा पेश किए गए 'showip.c' का एक अच्छी तरह से प्रसारित संस्करण, बहुत अच्छा होगा। –

+1

यदि आप पोर्टेबिलिटी पर विचार करना चाहते हैं, तो आप पर्ल, या पायथन जैसे विभिन्न प्रोग्रामिंग टूल से सॉकेट लाइब्रेरी का उपयोग करने का प्रयास करना चाहेंगे। उदाहरण के लिए पायथन में, कोई 'socket.gethostbyname (socket.gethostname())' का उपयोग करके आईपी पता प्राप्त कर सकता है। बेशक यह सिर्फ एक साधारण उदाहरण है। कई लोग इन पुस्तकालयों का उपयोग करके इंटरफ़ेस पते सूचीबद्ध करने के प्लेटफ़ॉर्म स्वतंत्र तरीकों के साथ आ गए हैं। तो आप इसे आज़मा सकते हैं। – ghostdog74

5

आप सीधे इंटरफ़ेस जिससे एक ग्रेप को कम करने दे।

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}' 
+0

धन्यवाद @ कोडर। मुझे आश्चर्य है कि हम आगे भी नहीं जा सकते हैं! सभी * निक्स उपकरण कुछ आसान करते हैं और इसे अच्छी तरह से करते हैं। तो इंटरफ़ेस का आईपी पता प्राप्त करने का एक मानक तरीका हो सकता है। उदाहरण के लिए, 'hostname --ip-address' जैसे कुछ (यह काम नहीं करता है) बहुत अच्छा होगा। –

+0

'ifconfig eth0 | grep inet | कट-डी: -एफ 2 | कट-डी '' -एफ 1' - इस तरह आप हेवीवेट अजीब से दूर हो जाते हैं। बेशक पीपीपी 0 आदि के साथ काम नहीं करेगा, लेकिन यदि आपके पास एक से अधिक एनआईसी हैं तो आपको अपने समाधान के साथ एक से अधिक जवाब मिलेंगे। (सिर -1 पहले पकड़ने के लिए?) –

+0

यह काम करता है, और अन्य उत्तरों की तुलना में छोटा है। – Quanlong

1

networking को बीज की मार्गदर्शिका पर यहाँ देखो एक साधारण सी प्रोग्राम का उपयोग getaddrinfo(...) कॉल का उपयोग कर IP पते बाहर मुद्रित करने के लिए सॉकेट की सूची प्राप्त करने। stdout पर उपलब्ध आईपी पते को मुद्रित करने के लिए इस सरल सी प्रोग्राम का उपयोग शेल स्क्रिप्ट के हिस्से में किया जा सकता है, जो ifconfig पर भरोसा करना आसान है, यदि आप ifconfig के आउटपुट के रूप में पोर्टेबल रहना चाहते हैं तो भिन्न हो सकते हैं।

उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।

+0

सूचक के लिए धन्यवाद टॉम; यह मदद करता है। जानकारी की एक खान। 'Showip.c' समस्या को संबोधित करता है (आउटपुट स्वरूपण को हटा रहा है)।मुझे आश्चर्य है कि गोले में "मानक" * निक्स उपकरण पर भरोसा करने का कोई तरीका है या नहीं। संदर्भ के लिए, मैं कुछ स्क्रिप्ट लिख रहा हूं जिन्हें * निक्स और * बीएसडी पर काम करना है। यह काम करता है, लेकिन मेरा रास्ता बहुत ही सुरुचिपूर्ण नहीं है। 'Showip.c' का उपयोग करके, मुझे इस कार्यक्रम को स्क्रिप्ट के साथ एक साथ तैनात करने की आवश्यकता होगी, जो मुझे विश्वास है कि इससे बचा जा सकता है। –

0

ifconfig | grep 'प्रसारण \ | Bcast' | awk -F '' {'प्रिंट $ 2'} | हेड -1 एन | sed -e's/addr: // g '

0

इससे मदद मिल सकती है।

more /etc/hosts | grep `hostname` | awk '{print $1}' 
+0

यह कम से कम उन शर्तों को निर्दिष्ट करने में मदद करेगा जहां आप यह काम सोचते हैं (ओएस, आदि)। 'Grep' मेरे लिए बहुत ही सीमित है (सफलता के बिना दो ओएस पर परीक्षण किया गया)। –

+0

मैंने एईक्स सर्वर में परीक्षण किया। ठीक काम करता है। –

+0

यह सेंटोस और मैक ओएस एक्स पर काम नहीं करता है। मुझे मानकों के बारे में पर्याप्त जानकारी नहीं है, लेकिन मुझे आश्चर्य है कि '/ etc/hosts' फ़ाइल सामग्री नियमित रूप से सिस्टम में कितनी नियमित है। –

0
# for bash/linux 
ipaddr(){ 
if="${1:-eth0}" 
result=$(/sbin/ip -o -4 addr show dev "${if}" | sed 's/^.*inet // ; s/\/...*$//') 
printf %s "${result}" 
tty -s && printf "\n" 
} 
2

this के आधार पर आप निम्न आदेश

ip route get 8.8.8.8 | awk 'NR==1 {print $NF}'