2010-12-03 10 views
14
1 import subprocess 
    2 raw = raw_input("Filename:").lower() 
    3 ip = raw_input("Host:").lower() 
    4 cmd = subprocess.call("tcpdump -c5 -vvv -w" + " raw " + " ip ",shell=True) 

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

मुझे कैसे पता है कि यह काम नहीं कर रहा है क्योंकि मेरा पहला कच्चा इनपुट फ़ाइल नाम है, इसलिए मैंने परीक्षण किया, जब मैं देखता हूं फ़ोल्डर में मेरी स्क्रिप्ट थी, यह "कच्चे" अर्थ वाली फाइल का उत्पादन करती है, यह वास्तव में मेरे इनपुट को केवल "एक्स" के अंदर उपयोग नहीं कर रही है ...

तो मैं इस पर आने के कुछ अवसर बना देता हूं:

1 import subprocess 
    2 raw = raw_input("Filename:").lower() 
    3 ip = raw_input("Host:").lower() 
    4 cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw + "host" + ip,shell=True) 

कौन सा महान है क्योंकि यह वास्तव में डब्ल्यू के लिए कहता है, लेकिन यह "कच्चे" रों इनपुट के बजाय rawhostip के रूप में अब यह बचाता है। संदर्भ के लिए इस आदेश को टर्मिनल में ऐसा दिखाई देता है:

tcpdump -c5 -vvv -w savename host wiki2 

केवल दो variabls savename कर रहे हैं और आदेश काम करने के लिए wiki2 आराम की जरूरत है।

इस स्क्रिप्ट के साथ

मैं इस त्रुटि मिलती है:

import subprocess 
raw = raw_input("Filename:").lower() 
ip = raw_input("Host:").lower() 
cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw, "host" + ip,shell=True) 

त्रुटि:

Traceback (most recent call last): 
    File "te.py", line 4, in <module> 
    cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw, "host" + ip,shell=True) 
    File "/usr/lib/python2.6/subprocess.py", line 480, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 583, in __init__ 
    raise TypeError("bufsize must be an integer") 
TypeError: bufsize must be an integer 

मैं एक खो में हूँ। कोई मदद महान होगी, हां, मुझे पता है कि साइट पर सबप्रोसेस के डॉक्टर की तलाश है: एक्स, मुझे मुझे सिखाने के लिए एक इंसान की जरूरत है, मुझे समझ में नहीं आता कि मैं क्या पढ़ रहा हूं।

मेरा प्रश्न यह है कि मैं इन चर के साथ कैसे काम करूं।

+0

प्रश्न क्या है? –

उत्तर

27

shell=True का उपयोग न करें। यह False होना चाहिए।

आप इनपुट के साथ सूक्ष्म गलतियां कर रहे हैं। विशेष रूप से, अगर आप दो तार है:

>>> s1 = 'Hello' 
>>> s2 = 'Hi' 
>>> s1 + s2 
'HelloHi' 

सूचना, वहाँ Hello और Hi के बीच कोई जगह नहीं है। तो ऐसा मत करो। (आपका लाइन 4)

आप क्या करना चाहिए (अच्छा तरीका):

>>> raw = raw_input('Filename: ') 
Filename: test 
>>> ip = raw_input('Host: ') 
Host: 192.168.1.1 
>>> command = 'tcpdump -c5 -vvv -w {0} {1}'.format(raw, ip) # the command goes here 
>>> subprocess.call(command.split(), shell=False) # call subprocess and pass the command as a list using split 

अब यह काम करना चाहिए।

+2

ओह भगवान सुखबीर! : डी ठीक है, मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन अब मैं आखिरकार इन {0} {1} चीजों को उदाहरणों में कमांड में डालता हूं। वे टेबल/सूचियां सही हैं? मुझे पता था कि खोल = सही नहीं है, यह एक सुरक्षा समस्या है। मुझे नहीं पता था कि मुझे यह दिखाने के लिए झूठा धन्यवाद नहीं था। मुझे इसका परीक्षण करने दें बीआरबी –

+0

ठीक है मुझे पूरा यकीन है कि फ़ाइल नाम काम कर रहा है, लेकिन एक चीज जो इसमें सही नहीं है, उसे "होस्ट" को कॉल करना है, जिसमें पाइथन है: tcpdump -c5 -vvv -w परीक्षण मेजबान 1 9 2.168.1।1 मैं आपके उदाहरण –

+0

में अपने चर का उपयोग कर रहा हूं मैंने आपको केवल मूल रूपरेखा दी है, बाकी आपके लिए इसे जांचना है! प्रयोग! – user225312

24

आपको स्ट्रिंग फॉर्म ओबी subprocess फ़ंक्शंस का उपयोग नहीं करना चाहिए। आज़माएं:

subprocess.check_call(["tcpdump", "-c5", "-vvv", "-w", raw, "host", ip]) 
+1

+1 बिंदु लिया गया। – user225312