जिस प्रक्रिया ने फ़ाइल को डिलीट कर दिया है, उसका pid कैसे पता करें?


13

मैं VM प्रवास से संबंधित परियोजना पर काम कर रहा हूं। कभी-कभी वीएम छवि गायब हो जाएगी और मैं सिर्फ यह जानना चाहता हूं कि अपराधी कौन है। मैंने संदिग्ध प्रक्रियाओं पर रोक लगाने की कोशिश की लेकिन कोई फायदा नहीं हुआ।


मैं सिर्फ एक के बजाय हर प्रक्रिया पर अनलिंक सिस्टम कॉल को ट्रेस करने का एक तरीका खोजने की उम्मीद कर रहा था, लेकिन मुझे लगता है कि ऐसा करने का कोई आसान तरीका नहीं है ...
मोहम्मद

जवाबों:


14

अंत में मुझे यहाँ उत्तर मिल गया ।

लिनक्स ऑडिट डेमॉन ट्रिक करेगा।

sudo auditctl -w /path/to/somefile -p wra

और फिर

ausearch -f /path/to/somefile -i

अच्छा है, लेकिन यह प्रदर्शन को कैसे प्रभावित करता है?
वार्त


1

आप एक प्रक्रिया के पीआईडी ​​का पता लगा सकते हैं, जिसमें कुछ फ़ाइल का उपयोग करके खुला है lsof

एक बार फ़ाइल बंद और हटा दी गई है, तो आपको वह जानकारी नहीं मिल सकती है।

Btw। ध्यान रखें, कि फ़ाइल हटाना उस निर्देशिका में ऑपरेशन है जो किसी फ़ाइल में नहीं है।


दुर्भाग्य से इसे हटाने के लिए कोई फ़ाइल खोलने की आवश्यकता नहीं है। कम से कम उदाहरण के लिए "स्ट्रेस आरएम कुछ-फाइल" आउटपुट यह नहीं दिखाता है कि आरएम कमांड पहले फाइल को खोलती है और फिर इसे हटा देती है। इसलिए मुझे लगता है कि lsof मददगार नहीं है।
मोहम्मद

मेरे उत्तर के अंतिम वाक्य को पढ़ें
vartec

1

मुझे ssdig के साथ एक विकल्प सुझाने दें क्योंकि उपरोक्त उत्तर उम्र बढ़ने के हैं। आज्ञा देना प्रदर्शित pidऔर nameप्रक्रियाओं है कि फ़ाइल को हटाने की /tmp/test। सबसे पहले हम फाइल बनाते हैं touch /tmp/test। फिर हम sysdigनिम्नलिखित फिल्टर से शुरू करते हैं:

$ sudo sysdig -p'%proc.pid,%proc.name' '(evt.type=unlinkat and (evt.arg.name=test or evt.arg.name=/tmp/test)) or (evt.type=unlink and evt.arg.path=/tmp/test)'

unlinkat(2)एक की आवश्यकता है orफिल्टर करता है, तो पथ (उदाहरण के लिए evt.arg.name) हो सकता है रिश्तेदार । दोनों unlink(जो कॉल करता है unlink(2)) और rm(जो unlinkat(2)इसके GNU संस्करण में कॉल करता है ) को संभालने के लिए , फ़िल्टर को दोनों syscalls से मेल खाना चाहिए।

sysdigजब कोई प्रक्रिया फ़ाइल को हटाती है तो उसे चलाना चाहिए। तब जब हम ऐसी आज्ञाओं को क्रियान्वित करते हैं:

$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test

यह ऐसे आउटपुट को प्रदर्शित करेगा:

11380,unlink
11407,rm
11662,rm

कृपया फ़िल्टरिंग और आउटपुट के बारे में स्पष्टीकरण के लिए sysdig उपयोगकर्ता मार्गदर्शिका देखें ।

चूंकि फ़िल्टर बहुत लंबा है, इसलिए मुझे छेनी लिखना सुविधाजनक लगा। यह एक लुआ स्क्रिप्ट है जो एक sysdigकमांड से जुड़ी है :

description = "displays processes that delete a file"
short_description = "spy file deletion"
category = "files"

args = 
{
    {
        name = "path", 
        description = "the path of the file to monitor", 
        argtype = "string"
    },
}

function on_set_arg(name, val)
    path = val
    return true
end

function on_init()
    local filename = path
    for i in string.gmatch(path, "[^/]+") do
        filename = i
    end
    chisel.set_event_formatter("%proc.pid\t%proc.name")
    chisel.set_filter(
        "(evt.type=unlinkat and (evt.arg.name=" .. path .. " or \
                             evt.arg.name=" .. filename .. ")) or \
     (evt.type=unlink and evt.arg.path=" .. path .. ")")
    return true
end

बेझिझक टिप्पणी करें और इसे सुधारें। आप spy_deletes.luaएक निर्देशिका के अंदर एक फ़ाइल में लुआ स्क्रिप्ट रख सकते हैं और sysdigइस निर्देशिका में निष्पादित कर सकते हैं ताकि छेनी उपलब्ध हो सके। टाइप करते समय sudo sysdig -clआप इसे इस प्रकार देखेंगे:

Category: files
---------------
spy_deletes         spy file deletion

अब आप इसे कॉल कर सकते हैं:

$ sudo sysdig -c spy_deletes /tmp/test

और दूसरे टर्मिनल प्रकार में:

$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test

यह उत्पादन होगा:

16025   unlink
16033   unlink
16041   rm
16049   rm

unlinkatफिल्टर और अधिक सटीक होना करने के लिए और केवल निरपेक्ष पथ से मेल खाते हैं लायक होगा। इसके लिए पारित निर्देशिका की fd को पुनः प्राप्त करना होगा unlinkat(2)


आपकी आज्ञा से मेरा कोई आउटपुट नहीं है।
AB

मैं rm /tmp/testदूसरे टर्मिनल में टाइप कर रहा था । मैंने इसे स्पष्ट करने के लिए अपने उत्तर को संपादित किया।
ग्रेग लेक्लेर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.