क्या यह जांचने का कोई तरीका है कि हाल ही में rm
कमांड के साथ क्या हटाया गया था ?
क्या यह जांचने का कोई तरीका है कि हाल ही में rm
कमांड के साथ क्या हटाया गया था ?
जवाबों:
कोई लॉग नहीं है, लेकिन अगर आप चाहते हैं ...
आप पुनरावर्ती और मॉनिटर मोड inotify
में पुस्तकालयों का उपयोग कर सकते हैं :
inotifywait -e delete --timefmt %c --format '%T %_e %w %f' -r -m / >/path/logfile
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
Fri Jul 19 11:57:39 2013 DELETE /tmp/ testfiletodelete
Fri Jul 19 11:57:46 2013 DELETE /home/user/ testfiletodelete
यह एक sysadmin दृष्टिकोण है: सभी उपयोगकर्ता, सभी निर्देशिका और माउंट किए गए बिंदु ...
चेतावनी यह एक छोटे से ओवरकिल पढ़ा जा सकता है ध्यान से आदमी पृष्ठ और कुछ विकल्प जैसे जोड़ें--exclude
rm
कमांडआप अपने लिए कुछ जोड़ सकते हैं .bashrc
...
rm
से ट्रांसफ़ॉर्म करेंmkdir -p $HOME/.Trashcan
rm() {
local destdir=$(mktemp -d $HOME/.Trashcan/trash-XXXXXXXXX);
mkdir $destdir/files
echo $0 $@ >$destdir/command
set >$destdir/environ
mv -t $destdir/files $@
}
इसलिए हर बार जब आप rm
अपने बैश में आते हैं, तो फ़ाइलों को एक डायरेक्टरी में ले जाया जाएगा, कमांड और एनवायरन को भी सहेजा जाएगा।
जैसा कि प्रत्येक rm
नई निर्देशिका को सही ढंग से दिनांकित करेगा, उपयोग करने की कोई आवश्यकता नहीं है date
।
rm
कमांड में लॉग स्टेप जोड़ना ।लेकिन अगर आप उपयोगकर्ता लीवर में अपना ऑपरेशन लॉग करना चाहते हैं:
rm() {
date >>$HOME/.rm.log +"%a %d %b %Y %T: rm $@"
/bin/rm $@
}
काम कर सकता था।
नोटा 1
जैसा कि @slhck ने ठीक ही कहा: सामान्य आदेशों को फिर से परिभाषित करने से नए उपयोगकर्ताओं के लिए बुरा व्यवहार हो सकता है, इसलिए यदि आप ऐसे मानकों को संशोधित करते हैं, तो आपको किसी अन्य सिस्टम पर काम करते समय यह नहीं भूलना चाहिए !
नोटा २
यह पैच केवल rm
इंटरेक्टिव यूजर शेल द्वारा संचालित कमांड है। आप संपादित कर सकते हैं /etc/bashrc
उन्हें सभी उपयोगकर्ताओं के लिए बनाने के लिए है, लेकिन सब पर, केवल बैश उपकरण प्रभावित हो सकता है।
यदि फ़ाइलों को नमूने के लिए हटा दिया जाता unlink
है perl
, तो यह इसके द्वारा लॉग नहीं किया जाएगा।
या यहां तक कि अगर ksh
, dash
या फिर बैश के बजाय लागू किया जाता है ... कोई लॉग नहीं।
नोटा 3
मूल आदेश तक पहुंचने के लिए, alias
या व्यक्तिगत के बजाय function
, आपको पूर्ण पथ को सटीक करना /bin/rm myfile
होगा : हटा देगा myfile
लेकिन rm
फ़ंक्शन को दरकिनार करके , कुछ भी लॉग नहीं किया जाएगा।
rm
करना बुरा अभ्यास है, क्योंकि जब आप वास्तव में ऐसा नहीं कर रहे हैं, तो आप सुरक्षित होने की आदत डाल लेंगे - एक अन्य सिस्टम पर काम करने की कल्पना करें जिसमें यह फ़ंक्शन नहीं है। यह उन गलतियों से सीखने के और प्रकार बेहतर है rm -i
या इसी तरह जब भी अनिश्चित, या हटाए जाने से पहले फ़ाइलों की सूची और फिर बदलने के ls
साथ rm
।
alias ls=rm
...; ;-) आप ठीक कह रहे हैं, मैं सहमत हूँ: यह वास्तविक अच्छा विचार नहीं है क्योंकि सीमा प्रभाव पड़ सकता है ... लेकिन यह नौसिखियों के पहले चरणों में मदद कर सकता है, ज्यादातर अगर यह स्वयं द्वारा जोड़ा गया था। अपने लिए, मैं उपयोग करता हूं alias ls="/bin/ls -ltrF --color --show-control-chars" la="ls -a"
और कभी भी आश्चर्यचकित नहीं होता ls
हूं जब कमांड सामान्य प्रभाव नहीं देता है।
safe-rm
पैकेज (और पढ़ें: serverfault.com , launchpad.net , डेबियन पैकेज )।
यदि यह आप है जिसने गलती से फ़ाइलों को हटा दिया है, और आपका शेल इतिहास का समर्थन करता है, तो आप इतिहास को इस तरह वापस सूचीबद्ध कर सकते हैं:
history | grep rm
बेशक, आपको यह जानने के लिए इतिहास के माध्यम से एक अंतर्दृष्टि खोज करनी होगी कि आपने फ़ाइल को कहाँ हटाया है।
यदि यह एक अन्य उपयोगकर्ता था, तो शायद उसकी / ~/.bash_history
या इसी तरह की फ़ाइल (जो भी उपयोगकर्ता उपयोग करता है शेल के लिए) उस जानकारी हो सकती है, अगर उन्होंने इसे वहां से नहीं हटाया।
लेकिन वास्तव में, जैसा कि अन्य उत्तर प्रस्तावित करते हैं, कोई लॉग नहीं है। अभी तक नहीं हटाए गए फ़ाइलों के लिए सतह को स्कैन करने का मतलब है।
वैसे, कॉपी-ऑन-राइट फाइलसिस्टम का उपयोग करके, जैसे कि ZFS या btrfs, आप समय में ड्राइव के "राज्यों" के बीच की गई फ़ाइलों को हटा सकते हैं, जिसे स्नैपशॉट कहा जाता है।
आपके पास हाल ही में पर्याप्त स्नैपशॉट है, और फिर स्नैपशॉट और वर्तमान स्थिति के बीच अंतर सुनिश्चित करने के लिए आवश्यक समय ग्रैन्युलैरिटी के साथ एक क्रोन कार्य हो सकता है।
एक और तरीका है। आप अपने स्वयं के आरएम बाइनरी को संकलित कर सकते हैं, जो कि यह क्या करता है के निशान को बचाता है।