2009-07-27 12 views
17

सबसे अच्छा तरीका यह पता लगाने की पिंग करने (ICMP) अजगर से कुछ प्रयास करते समय, मैं इन सवालों में आए:अजगर विशेषाधिकार रहित ICMP

उत्तर आमतौर पर "रूट विशेषाधिकारों के साथ इस तीसरे पक्ष के मॉड्यूल का उपयोग" करने के लिए उबालते हैं या "सिस्टम के पिंग कमांड का उपयोग करते हैं और आउटपुट पार्स करते हैं"। मूल विधियों में से icmplib और M. Cowles and J. Diemer's ping.py स्पष्ट रूप से रूट विशेषाधिकारों की आवश्यकता का जिक्र करते हैं, जैसा scapymanual करता है।

तो उस मोर्चे से, विशेष रूप से विशेष विशेषाधिकारों के बिना आईसीएमपी पिंग भेजना असंभव लगता है। सिस्टम पिंग कमांड किसी भी तरह का प्रबंधन करता है, लेकिन इसका मैन पेज इस पर कोई प्रकाश नहीं डालता है।

 
Non-privileged ICMP 
    ICMP sockets can be opened with the SOCK_DGRAM socket type without 
    requiring root privileges. The synopsis is the following: 

    socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) 

    Datagram oriented ICMP sockets offer a subset of the functionality avail- 
    able to raw ICMP sockets. Only IMCP request messages of the following 
    types can be sent: ICMP_ECHO, ICMP_TSTAMP or ICMP_MASKREQ.

तो यह है कि प्रतीत होता है, कम से कम ICMP के अनुसार, यह अनुमत है: man page for icmp, दूसरे हाथ पर, यह संभव है का कहना है कि लगता है। तो यह क्यों है कि सभी अजगर उपकरण ऐसा करने में असमर्थ हैं? क्या अजगर उपकरण बहुत सामान्य हैं और विशेषाधिकार प्राप्त सॉकेट पर किसी भी काम को विशेषाधिकार प्राप्त करने की उम्मीद है? क्या सी में एक पिंग फ़ंक्शन लिखना संभव होगा जो रूट विशेषाधिकारों के बिना पिंग कर सकता है, और इसके साथ अजगर का विस्तार कर सकता है? क्या किसी ने ऐसा किया है? क्या मैंने समस्या को गलत समझा है?

+0

आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं? [हालिया लिनक्स कर्नल] (https://lkml.org/lkml/2011/5/10/389) और मैक ओएस एक्स को गैर-विशेषाधिकार प्राप्त आईसीएमपी सॉकेट के रूप में जाना जाता है। आपके द्वारा प्राप्त किया गया मैन पेज ओएस एक्स से है, और इसे काम करना चाहिए। मैं एक गैर-विशेषाधिकार प्राप्त शुद्ध-पायथन [पिंग प्रोग्राम] (https://github.com/lilydjwg/winterpy/blob/master/pylib/icmplib.py) के साथ सफल हुआ है जो लिनक्स पर काम करता है (कर्नेल सेटिंग परिवर्तन के साथ) लेकिन ओएस एक्स – lilydjwg

+0

पर कुछ समायोजन की आवश्यकता हो सकती है, लिनिक्स के लिए, यहां देखें http://stackoverflow.com/questions/8290046/icmp-sockets-linux/20105379#20105379, आपको सॉकेट का उपयोग करने में सक्षम होने के लिए एक विशेष sysctl की आवश्यकता है (AF_INET, SOCK_DGRAM, IPPROTO_ICMP) ' – nos

उत्तर

11

पिंग प्रोग्राम सेटुइड रूट स्थापित है। यह किसी भी उपयोगकर्ता को प्रोग्राम का उपयोग करने की अनुमति देता है, और फिर भी एक कच्ची सॉकेट खोलने में सक्षम हो जाता है।

कच्चे सॉकेट को खोलने के बाद, यह आम तौर पर रूट निजी को छोड़ देता है।

आपको आम तौर पर आईसीएमपी सही करने के लिए कच्चे सॉकेट की आवश्यकता होती है, और कच्चे सॉकेट आमतौर पर प्रतिबंधित होते हैं। तो यह वास्तव में पाइथन की गलती नहीं है।

उपरोक्त आईसीएमपी के बारे में थोड़ा सा, स्पष्ट रूप से कई कार्यान्वयन वास्तव में झंडे के उन संयोजनों का समर्थन नहीं करते हैं। तो यह संभावना है कि अधिकांश प्रत्यारोपण केवल अधिकांश/सभी आर्किटेक्चर पर "पता" काम करते हैं।

+0

आह, यह एक रहस्य कम है - चूंकि पिंग पर छोटे अंतराल को अभी भी सूडो की आवश्यकता होती है, मुझे नहीं लगता था कि यह सेटुइड रूट था, लेकिन आप इसके बारे में स्पष्ट रूप से सही हैं। – Markus

+0

पिंग आवश्यक रूप से आईसीएमपी जांच का उपयोग नहीं करता है, न ही कच्चे सॉकेट और न ही रूट विशेषाधिकारों की आवश्यकता है। –

11

यहाँ कैसे/sbin/पिंग "किसी भी तरह का प्रबंधन करता है" (अधिकांश यूनिक्स-y सिस्टम पर) है:

$ ls -l /sbin/ping 
-r-sr-xr-x 1 root wheel 68448 Jan 26 10:00 /sbin/ping 

देखते हैं? इसकी स्वामित्व root है और यह अनुमति में s बिट है - setuserid। तो, कोई फर्क नहीं पड़ता कि उपयोगकर्ता क्या चल रहा है, रूट के रूप में चलाता है।

यदि आप नए "गैर-विशेषाधिकार प्राप्त आईसीएमपी सॉकेट" के साथ बीएसडी कर्नेल का उपयोग कर रहे हैं तो यह देखना दिलचस्प होगा कि पाइथन से पिंग करने के लिए उस कार्यक्षमता का उपयोग करने के लिए क्या आवश्यक है (लेकिन यह किसी भी उपयोगकर्ता की मदद नहीं करेगा निश्चित रूप से कम उन्नत कर्नेल)।

+0

दिलचस्प, तो गैर-विशेषाधिकार प्राप्त आईसीएमपी सॉकेट नए हैं? शायद मैं पाइथन से काम करने का प्रयास करूंगा जब मेरे पास कुछ समय होगा, ज्यादातर जिज्ञासा से बाहर। – Markus

+0

यह सब नया ** एक spec ** के रूप में नहीं है (मुझे विश्वास है कि यह सभी पुराने पुराने शानदार बीएसडी 4.3 पर वापस जाता है!), लेकिन उस spec का _working_ कार्यान्वयन बहुत नया होगा (और वास्तव में बहुत अच्छी खबर, IMHO)। –

0

मुझे यकीन नहीं है कि किसी प्रश्न में कुछ पोस्ट करना ठीक है या नहीं, ऐसा लगता है कि इसे पहले से ही उत्तर दिया गया है।

मैं एक ही कार्यान्वयन की तलाश कर रहा हूं और पाइथन के माध्यम से गैर रूट विशेषाधिकारों के साथ आईसीएमपी करने का एक तरीका मिला है।

python-ping जब sock बुला ही 'की जरूरत-जड़' जिस तरह से एक पिंग करने के लिए उपयोग करता है, लेकिन एक बग रिपोर्ट, जहां एक उपयोगकर्ता SOCK_DGRAM को SOCK_RAW बदलते सुझाव भर में आया था:

http://hg.io/delroth/python-ping/issue/1/icmp-without-root-privilege

देव यह बताता है एक "वॉन-फिक्स" स्थिति होगी क्योंकि यह एक यूडीपी पिंग है।

के बाद से मैं वास्तव में परवाह नहीं है अगर ICMP यूडीपी के माध्यम से बाहर जा रहा है, मैं आगे चला गया और कोड मिला है और बदल प्रस्तावित कर दिया।

मैं अब उपप्रक्रिया बुला या रूट की जरूरत के बिना एक पिंग ऐसा करने में सक्षम हूँ!

फिर, यकीन नहीं करता है, तो यहां इस तरह के एक लंबे समय के बाद पोस्टिंग ठीक है, लेकिन सोचा कि यह एक बेहतर बात थी!

+0

यह एक दिलचस्प दृष्टिकोण है। अच्छी तरह से काम करना चाहिए, लेकिन कड़ाई से बोलना, यह अब एक पिंग नहीं है। इसका मतलब है कि फायरवॉल और ऐसे में जिनके पास विशेष पिंग हैंडलिंग अलग-अलग व्यवहार कर सकती है। – DonGar

+3

वह दृष्टिकोण बिल्कुल काम नहीं करता है। आप प्रोटोकॉल आईसीएमपी के साथ एक यूडीपी प्रकार सॉकेट नहीं बना सकते हैं। मुझे एक EPROTONOSUPPORT मिला (प्रोटोकॉल समर्थित नहीं है)। कारण सरल है: ऐसा प्रोटोकॉल संयोजन मौजूद नहीं है। (प्रतिक्रिया परीक्षण संभवतः यूडीपी/टीसीपी के साथ अप्रसन्न है, लेकिन इसके लिए सूक्ष्म परिवर्तनों की आवश्यकता होती है।) –

-2

मैं भी उपप्रक्रिया का उपयोग कर या पिंग के लिए रूट की जरूरत के बिना पिंग के एक कार्यान्वयन के लिए देख रहा था। मेरा समाधान क्रॉस-प्लेटफॉर्म, अर्थात् विंडोज और लिनक्स होने की आवश्यकता है।

विंडोज पर सॉकेट परिवर्तन करने से एक में परिणाम SOCK_DGRAM को "प्रोटोकॉल समर्थित नहीं 100,043" अपवाद। तो ऐसा लगता है कि विंडोज़ सही ढंग से यह देखने के लिए जांच करता है कि आईसीपी के बजाय टीसीपी पर आईसीएमपी भेजा जा रहा है या नहीं। हालांकि, विंडोज़ परवाह नहीं है अगर यह "रूट" के रूप में चल रहा है क्योंकि यह एक लिनक्स अवधारणा है।

if os.name == 'nt': 
    #no root on windows 
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) 
else: 
    #changed to UDP socket...gets around ROOT priv issue 
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, icmp) 
1

वास्तव में, विंडोज 7 और Vista पर आप की क्या ज़रूरत है करने के लिए 'प्रशासक के रूप में चलाने के लिए' करने के लिए:

my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) 

और जैसा कि आप ध्यान दें, एक आंकड़ारेख सॉकेट से अधिक यह कर एक त्रुटि का कारण बनता है।

-8

मैं विंडोज 7 के तहत अजगर चला रहा हूँ, के बाद से मैं संपादन कर रहा हूँ और ग्रहण Pydev प्लगइन के तहत "संकलन" कोड, मेरे समाधान किया गया था: एक व्यवस्थापक के रूप eclipse.exe चल रहा है: इस समस्या का समाधान,

यह समाधान cmd को व्यवस्थापक के रूप में चलाने के समान है।

+8

कृपया लोगों को मनमाने ढंग से प्रोग्राम प्रशासक के रूप में चलाने का सुझाव न दें। इस तरह यूएसी को पहली जगह खराब रैप मिला। आपका उत्तर उत्पादन में तैनात कार्यक्रम के लिए भी मदद नहीं करता है। – AdmiralNemo

0

आदमी पेज आप पढ़ रहे हैं के बारे में "बीएसडी कर्नेल इंटरफेस मैनुअल" है और "मैक ओएस एक्स 10.9" से आते हैं लगता है। मैं एक मैक ओएस एक्स मशीन की कोशिश करने की जरूरत नहीं है, लेकिन लिनक्स, तहत रूट के रूप में या उपयोगकर्ता के रूप में मैं एक अनुमति नहीं दी त्रुटि मिलती है जब मैं एक ICMP खोलने ऐसे करने का प्रयास करें:

$ strace -e trace=socket python 
Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 
[GCC 4.8.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import socket 
>>> socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_ICMP) 
socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP) = -1 EACCES (Permission denied) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/socket.py", line 187, in __init__ 
    _sock = _realsocket(family, type, proto) 
socket.error: [Errno 13] Permission denied 

OpenBSD के तहत मैं एक "प्रोटोकॉल समर्थित नहीं है" त्रुटि:

>>> import socket 
>>> socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_ICMP) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/socket.py", line 187, in __init__ 
    _sock = _realsocket(family, type, proto) 
socket.error: [Errno 43] Protocol not supported 

हो सकता है किसी को MacOS एक्स या अन्य BSDs के तहत की कोशिश कर सकते हैं, लेकिन फिर भी इस सॉकेट प्रकार पोर्टेबल तरह नहीं दिखता है, कम से कम कहने के लिए!

+0

आप इसे गलत कर रहे हैं, आईसीएमपी संदेशों को डीजीआरएएम सॉकेट द्वारा त्रुटि संदेशों के रूप में लाया जाता है। डीजीआरएएम पर सॉकेट प्रोटोकॉल के रूप में आईसीएमपी निर्दिष्ट करना गलत है। –

+0

मैं करता हूं कि ओपी ने क्या किया है ... और पूछता है। – Pierre

3

आधुनिक लिनक्स पिंग libcap का उपयोग करता है और काम करने के लिए libcap पूछता है।यह चेक (capget/सेट funcitons) और अनुमतियों को प्रबंधित:

[email protected]:~/WORK$ ldd /bin/ping 
    linux-gate.so.1 => (0xb77b6000) 
    libcap.so.2 => /lib/i386-linux-gnu/libcap.so.2 (0xb7796000) 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e7000) 
    /lib/ld-linux.so.2 (0xb77b7000) 

चलें कहते हैं कि तुम एक "myping" कार्यक्रम है:

[email protected]:~/WORK$ getcap ./myping  
[email protected]:~/WORK$ (-> nothing!) 
[email protected]:~/WORK$ setcap cap_net_raw=ep ./myping 
unable to set CAP_SETFCAP effective capability: Operation not permitted 
[email protected]:~/WORK$ sudo setcap cap_net_raw=ep ./myping 

अब कार्य करें:

[email protected]:~/WORK$ getcap ./myping 
./ping = cap_net_raw+ep 

अब, अपने " मायपिंग "रूट के बिना काम करेगा। यही है, जब तक myping वास्तव में एक बाइनरी कार्यक्रम है। यदि यह एक स्क्रिप्ट है, तो इस क्षमता को स्क्रिप्ट दुभाषिया पर सेट करना होगा।

+0

उत्कृष्ट बिंदु, मैं लगभग निराशा में था कि किसी ने भी क्षमताओं का उल्लेख नहीं किया था। हालांकि, यह ध्यान दिया जाना चाहिए कि यदि आपका "प्रोग्राम" एक स्क्रिप्ट है, तो स्क्रिप्ट के बजाय स्क्रिप्ट दुभाषिया में क्षमता सेट की जानी चाहिए। – 0xC0000022L