बुराई कोड छिपाएं - एक निर्देशिका ट्री में कहीं भी एक दी गई स्ट्रिंग वाली फाइलें प्रिंट करें [बंद]


17

इस पहेली का उद्देश्य यह सीखना है कि किसी प्रोग्राम में दुर्भावनापूर्ण कोड को कैसे छिपाया और खोजा जा सकता है।

एक व्यक्ति प्रश्न पूछ रहा है:

Plz मुझे कुछ कोड देता है कि मैं एक फ़ाइल को कैसे खोज सकता हूं वह Present Directory या इसके Sub-निर्देशिकाएँ में हो सकता है।

(यह एक वास्तविक प्रश्न का एक प्रकार है जिसे मैंने एक साइट पर पोस्ट किया है।)

अधिक विशिष्ट होने के लिए: ओपी चाहता है कि आप एक प्रोग्राम लिखें जो एक स्ट्रिंग और एक निर्देशिका को स्वीकार करता है। यह निर्देशिका में सभी फ़ाइलों को पीछे छोड़ देगा और अपने सभी उपनिर्देशिकाओं को पुनरावृत्ति करेगा। प्रत्येक फ़ाइल के लिए यह जाँच करेगा कि क्या फ़ाइल में स्ट्रिंग है, और यदि यह है, तो फ़ाइल का नाम प्रिंट करेगा। (कार्यक्रम में अतिरिक्त विशेषताएं हो सकती हैं जब तक कि वे मुख्य लक्ष्य के लिए प्रासंगिक हों, यदि आप चाहें।) ट्रैवर्स ऑर्डर पर कोई आवश्यकताएं नहीं हैं।

हालांकि, इस पहेली का मुख्य कार्य प्रोग्राम अतिरिक्त कोड में छिपाना है जो उस व्यक्ति को बेवकूफ बना देगा जो अपने उपयोगकर्ताओं / सहयोगियों / बॉस / आदि की आंखों में कार्यक्रम के लिए पूछता है। उदाहरण के लिए, कुछ बिंदु पर एक अपमानजनक पाठ प्रिंट करें, जैसे: कार्यक्रम के लेखक को पता नहीं है कि कैसे प्रोग्राम करना है, उसे अपना डिप्लोमा वापस करना चाहिए और निकाल दिया जाना चाहिए। रचनात्मक बनो।

नियम:

  • समाधान हानिकारक नहीं होना चाहिए (ओपी को मूर्ख बनाने के अलावा, बिल्कुल)। यह अंत उपयोगकर्ताओं (कोई सामान की तरह rm -rf) के लिए कोई अपरिवर्तनीय क्षति नहीं करना चाहिए ! ऐसे समाधानों को अयोग्य घोषित किया जाएगा।
  • ट्रोलिंग सामान को छिपाया जाना चाहिए ताकि ओपी उसे आसानी से न मिले।
  • यह स्पष्ट नहीं होना चाहिए कि आप ओपी को ट्रोल कर रहे हैं। कोड वास्तविक दिखना चाहिए।
  • समाधान एक उचित स्पष्टीकरण के साथ आना चाहिए कि यह ओपी को कैसे ट्रोल करता है ताकि हर कोई आपके समाधान से कुछ सीख सके। स्पष्टीकरण को छिपे हुए-जब तक आप पाठ (स्पॉइलर) में छिपाया जाना चाहिए । न्याय करते समय, स्पष्टीकरण की तलाश किए बिना ट्रोलिंग की खोज करने की कोशिश करें और उन लोगों के लिए वोट करें, जिन्हें खोजना मुश्किल है।
  • ओपी से ट्रोलिंग को छिपाने की कोशिश करें यदि वह कुछ बार कोड चलाने की कोशिश करता है। शायद एक विशेष तिथि के बाद ही ट्रोल करना शुरू करें, या कुछ शर्तों के तहत जो एक टेढ़ा प्रोग्रामर परीक्षण नहीं करेगा। रचनात्मक रहें और चाल की व्याख्या करना न भूलें।
  • मौजूदा उपकरण जैसे grepया का उपयोग करके स्क्रिप्ट न बनाएं find। स्क्रैच से प्रोग्राम लिखें। बेहतर पुस्तकालयों से बचें और निम्न-स्तरीय कॉल पसंद करते हैं - यह कोड को अधिक जटिल बना देगा और आपको वहां मौजूद बुरे सामान को छिपाने का अवसर प्रदान करेगा।

यह एक । कृपया उपरोक्त बिंदुओं के अनुसार न्याय करें।


6
कैसे करता है "उस व्यक्ति को बेवकूफ बना देगा जो अपने उपयोगकर्ताओं / सहयोगियों / बॉस की आंखों में कार्यक्रम के लिए पूछता है।" और "उसे अपना डिप्लोमा वापस करना चाहिए और निकाल देना चाहिए।" "समाधान हानिकारक नहीं होना चाहिए, इसके उपयोगकर्ताओं के लिए कोई नुकसान नहीं करना चाहिए" के साथ वर्ग?
एमोरी

मैं सराहना करता हूं कि आपने "ट्रोलिंग" प्रश्नों के अधिकांश पोस्टर की तुलना में अधिक प्रयास किए हैं, लेकिन इस साइट पर सभी प्रश्नों का एक स्पष्ट विनिर्देश होना चाहिए और "मैं एक फ़ाइल कैसे खोज सकता हूं जो वर्तमान निर्देशिका में हो सकती है" उस मानक को पूरा करने में कहीं नहीं है। । (किसी भी कोड-trolling सवाल है कि मानक को पूरा कर सकते हैं एक है अलग मुद्दा )।
पीटर टेलर

@PeterTaylor मैंने अधिक विशिष्ट असाइनमेंट देने की कोशिश की। यदि आपके पास अधिक विशिष्ट सुझाव हैं, तो मैं उनकी सराहना करूंगा।
पेट्र पुडलक

2
@ मेमोरी कोडर उपयोगकर्ता नहीं है। ग्राहकों को प्रभावित किए बिना अपने साथी कोडरों के सामने कोडर को अपमानित करना संभव है।
क्रंचर

3
मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि यह कम आंका गया है
निकोल आउटफर गोल्फ

जवाबों:


42

यहाँ मेरा समाधान है (पर्ल में):

#! /usr/bin/perl -w

use Cwd 'abs_path';

# Check the command line arguments
my $F = abs_path($0);
if ($#ARGV!=1) {
    print "Usage: ".$F." <dir> <expr>\n";
    exit(1);
}

# The first argument is the directory
my @u = (abs_path($ARGV[0]));
# Check for trailing slash
my $c = substr $u[0], -1, 0;


# Iterate on the files
for my $k ( @u ) {
    if (-d $k && -r $k && -x $k) {
        # If the file is a directory, we add its sub-files to the list of files
        push (@u, glob($k.($c eq "/" ? "*" : "/*")));
    } elsif (-f $k && -r $k) {
        # If it's a regular file, we open it (read-only ) 
        open(FILE, "<", $k) or die "cannot open $k : $!";
        # Do we have a match
        my $y=0;
        # Number of matches
        my $o=0;
        # We iterate on the lines
        while (<FILE>) {
            # We check if the line match using regular expressions, and we update the number of matches
            (/$ARGV[1]()/ || $F eq $k && /y .([F c-y])/) && (($c,$y,$o)=($c.$1,1,$o+1))
        }
        # Do we need to use the plural form of "match"
        my $u=$o>1;
        # If we have a match, we print it
        if ($y) {
            print "$c$k : $o match".($u?"es\n":"\n");
        }
        # Close the file (opened read-only ) 
        close(FILE) or die "cannot close $k : $!";
    }
}

कार्यक्रम का पहला तर्क निर्देशिका है और दूसरा तर्क वह स्ट्रिंग है जिसे हम ढूंढ रहे हैं। कार्यक्रम प्रत्येक फ़ाइल में मैचों की संख्या भी दिखाता है।

यहाँ "VGA" को / आदि में कैसे खोजा जाए:

$ ./mygrep.pl /etc VGA
/etc/alternatives/mplayer : 7 matches
/etc/alternatives/pinentry : 1 match
/etc/alternatives/pinentry-x11 : 1 match
/etc/alternatives/www-browser : 1 match
/etc/bumblebee/xorg.conf.nouveau : 2 matches
/etc/bumblebee/xorg.conf.nvidia : 2 matches
/etc/default/console-setup : 2 matches
/etc/htdig/english.0 : 1 match
/etc/X11/X : 6 matches
/etc/laptop-mode/conf.d/video-out.conf : 3 matches
$

और अब, यहाँ चाल है:

यह प्रोग्राम ठीक उसी तरह से काम करता है, जब तक कि यह फाइलों में मौजूद नहीं होता। जैसे ही यह सामना करता है, यह पागलपन के साथ पाई जाने वाली प्रत्येक फ़ाइल को उपसर्ग करना शुरू कर देता है। चलो वर्तमान निर्देशिका में कुछ फ़ाइलों की प्रतिलिपि बनाएँ और पुनः प्रयास करें:

$ सी.पी.
$ ./mygrep.pl ./ वीजीए
/ tmp / mygrep / कंसोल-सेटअप: 2 मैच
/tmp/mygrep/english.0: 1 मैच
भाड़ में जाओ तुम /tmp/mygrep/mygrep.pl: 9 मैच
भाड़ में जाओ तुम /tmp/mygrep/xorg.conf.nouveau: 2 मैच
भाड़ में जाओ तुम /tmp/mygrep/xorg.conf.nvidia: 2 मैच
$
यह इस कोड के कारण है:
$ F eq $ k && / y। ([F cy]) /
यह परीक्षण करता है कि क्या चालू फ़ाइल रनिंग प्रोग्राम है, और यदि यह है, तो यह प्रोग्राम के कुछ भाग को एक रेग्जिप के साथ निकालता है और इसे $ c के साथ प्रभावित करता है
$ c = $ c। $ 1
Regexp द्वारा जो निकाला जाता है वह परिवर्तनशील घोषणाएँ हैं (चर का नाम $ F, @u, $ c, $ k, $ y, $ o, $ u) और टिप्पणियों से दो स्थान हैं। मुझे यह करना था कि इसे छिपा कर रखा जाए, भले ही यह कार्यक्रम अपेक्षाकृत छोटा हो।


हाहा, यह महाकाव्य है।
सोहम चौधरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.