क्या मैं एक निश्चित नाम का फ़ोल्डर बना सकता हूं?


16

मैं एक LAMP वेब ऐप पर काम कर रहा हूं और कहीं न कहीं एक निर्धारित प्रक्रिया है जो shopसाइट के रूट में नामक एक फ़ोल्डर बनाता रहता है । हर बार यह प्रतीत होता है कि यह ऐप में नियमों को फिर से लिखने के साथ टकराव का कारण बनता है, अच्छा नहीं।

जब तक मुझे आपत्तिजनक स्क्रिप्ट नहीं मिल जाती, तब तक shopक्या रूट में बनाए गए फोल्डर को रोकने का कोई तरीका है ? मुझे पता है कि मैं सामग्री को बदलने से रोकने के लिए एक फ़ोल्डर में अनुमतियों को बदल सकता हूं, लेकिन मुझे एक निश्चित नाम के फ़ोल्डर को रोकने का कोई तरीका नहीं मिला है।


4
यह पता लगाने के लिए कि निर्माण क्या कर रहा है, आप ऑडिटिंग को सक्षम कर सकते हैं
एंड्रयू हेनल

जवाबों:


30

निर्देशिका को बनाने वाले उपयोगकर्ता को मूल निर्देशिका पर लिखने की पर्याप्त अनुमति नहीं है।

आप इसके बजाय inotifyलिनक्स कर्नेल द्वारा प्रदान किए गए सिस्टम कॉल के परिवार का लाभ उठा सकते हैं , दिए गए डायरेक्टरी में mvडायरेक्टरी के निर्माण (और वैकल्पिक रूप से ) के लिए देख सकते हैं shop, यदि डायरेक्टरी (या वैकल्पिक रूप से mv), rmडायरेक्टरी बनाई गई है ।

इस मामले में आपके द्वारा आवश्यक यूजरस्पेस प्रोग्राम inotifywait( inotify-toolsजरूरत पड़ने पर इसे पहले इंस्टॉल करें)।


मान लिया जाये कि निर्देशिका shopमें रहने वाले की जाएगी /foo/barनिर्देशिका, के लिए एक निगरानी निर्धारित करने की अनुमति /foo/bar/shopसृजन, और rmतुरन्त अगर बनाया:

inotifywait -qme create /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
  • inotifywait -qme create /foo/barदेखता है /foo/barकिसी भी फाइल / निर्देशिका है कि किसी भी के लिए यानी घड़ी बनाया जा सकता है के लिए निर्देशिका createघटना

  • यदि बनाया गया है, awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'तो जाँच करें कि क्या फ़ाइल एक निर्देशिका होती है और नाम है shop( /,ISDIR shop$/), यदि ऐसा है rmतो निर्देशिका ( system("rm -r -- /foo/bar/shop"))

आपको कमांड को एक उपयोगकर्ता के रूप में चलाने की आवश्यकता है जिसने निर्देशिका से /foo/barहटाने के लिए निर्देशिका पर अनुमति लिखी है shop


यदि आप mvभी संचालन की निगरानी करना चाहते हैं, तो moved_toघटना के लिए घड़ी भी जोड़ें :

inotifywait -qme create,moved_to /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'

बस ध्यान दें, यदि आप एक फ़ाइल की तलाश कर रहे हैं, तो निर्देशिका नहीं, नाम shop:

inotifywait -qme create /foo/bar | \
                 awk '$NF == "shop" { system("rm -- /foo/bar/shop") }'

inotifywait -qme create,moved_to /foo/bar | \
                 awk '$NF == "shop" { system("rm -- /foo/bar/shop") }'

2
इसके अलावा अगर आप inotifywaitऐसा करने के लिए उपयोग कर रहे हैं तो यह भी संभव है कि ट्रिगर भी प्रक्रिया को पकड़ने में सक्षम होps -ef
roaima

30

एक निश्चित नाम के एक फ़ोल्डर को रोकने के सवाल पर आधारित शाब्दिक रूप से उत्तर देने के लिए।

touch shop

यदि कोई निर्देशिका समान नाम वाली फ़ाइल विद्यमान है, तो आप एक निर्देशिका नहीं बना सकते

mkdir: cannot create directory ‘shop’: File exists


6
यह * पर्याप्त नहीं हो सकता है। mkdir ऐसा नहीं कर सकता है, लेकिन यह किया जा सकता है। यह एक अच्छा पहला प्रयास है।
coteyr

9
लिनक्स सिस्टम पर, chattr +i shopइसे अपरिवर्तनीय बनाने के लिए उपयोग करें। जब तक अपरिवर्तनीय ध्वज को हटा नहीं दिया जाता, तब तक इसका नाम बदला / हटाया नहीं जा सकता।
आर .. गिटहब स्टॉप हेल्पिंग ICE

1
यह एक स्मार्ट छोटी चाल है, मेरी स्थिति के लिए बिल्कुल सही नहीं है, लेकिन कुछ परिस्थितियों के लिए एक चतुर विचार smart
एंड्रयू

1
@ र .. रोचक। मुझे rename(2)अभी भी काम करने की उम्मीद थी, क्योंकि नाम इनोड का हिस्सा नहीं है, लेकिन यह नहीं है। त्वरित इंटरनेट खोज से पता नहीं चलता कि क्यों। कोई संकेत?
व्यक्त करते

@domen: क्योंकि यह "अपरिवर्तनीय" विशेषता के उद्देश्य का हिस्सा है। मुझे संदेह है कि काम करने से रोकने के लिए कार्यान्वयन स्तर पर यह अतिरिक्त काम लेता है rename
R .. गिटहब स्टॉप हेल्पिंग ICE

4

के बारे में mkdirsyscall अपहरण के बारे में क्या LD_PRELOAD...?

$ ls
test.c
$ cat test.c 
#define _GNU_SOURCE

#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>

typedef int (*orig_mkdir_func_type)(const char *path, mode_t mode);

int mkdir(const char *path, mode_t mode) {
    if(!strcmp(path, "shop")) return 1;

    orig_mkdir_func_type orig_func;
    orig_func = (orig_mkdir_func_type)dlsym(RTLD_NEXT, "mkdir");
    return orig_func(path, mode);
}
$ gcc -shared -fPIC test.c -o test.so
$ LD_PRELOAD='./test.so' mkdir test
$ LD_PRELOAD='./test.so' mkdir shop
mkdir: cannot create directory ‘shop’: No such file or directory
$ ls
test  test.c  test.so

ध्यान दें कि इस हैंडलर के अंदर आप उस PID प्रक्रिया को लॉग इन कर सकते हैं जो इस निर्देशिका को बनाना चाहते हैं:

$ cat test.c 
#define _GNU_SOURCE

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>

typedef int (*orig_mkdir_func_type)(const char *path, mode_t mode);

int mkdir(const char *path, mode_t mode) {
    if(!strcmp(path, "shop")) {
        FILE* fp = fopen("/tmp/log.txt", "w");
        fprintf(fp, "PID of evil script: %d\n", (int)getpid());
        fclose(fp);
    }

    orig_mkdir_func_type orig_func;
    orig_func = (orig_mkdir_func_type)dlsym(RTLD_NEXT, "mkdir");
    return orig_func(path, mode);
}
$ gcc -shared -fPIC test.c -o test.so
$ LD_PRELOAD='./test.so' mkdir shop
$ cat /tmp/log.txt 
PID of evil script: 8706

इसका उपयोग करने के लिए आपको इसे ~/.bashrcरूट (या जो कोई भी आपके एप्लिकेशन चला रहा है) को रखने की आवश्यकता है:

export LD_PRELOAD=/path/to/test.so

2
यह एक डाउनवोट नहीं होना चाहिए, यह एक समाधान और एक अच्छा है
बिल्ली

4
यह सेम के एक टिन को खोलने के लिए एक सूटकेस परमाणु का उपयोग कर रहा है। लेकिन हे कम से कम वे पकाया जाएगा ...
मोनिका

2
@ कोट: मैं असहमत हूं। LD_PRELOADइस तरह के हैक मूल रूप से हमेशा गलत होते हैं, और जब तक आपको पता नहीं होता कि आप क्या कर रहे हैं, वे आपके द्वारा लोड किए जा रहे फ़ंक्शन के एसिंक्स-सिग्नल-सुरक्षा जैसे गुणों को तोड़कर आपके द्वारा लोड किए गए प्रोग्राम को बुरी तरह से तोड़ सकते हैं।
आर .. गिटहब स्टॉप हेल्पिंग ICE

1
इसके अलावा, मुझे लगता है कि इसके बजाय fopenहोना चाहिए , इसलिए यह पिछले लॉग को संरक्षित कर सकता है"a""w"
बिल्ली

2
यह भी काम नहीं करेगा यदि बुरा कोड सीधे syscall को कॉल करता है, ना कि libc के माध्यम से। या यदि बुरा कोड स्टेटिकली लिंक है।
व्यक्त करते

3

(मीता के जवाब पर टिप्पणी की होगी, लेकिन मेरे पुराने खाते को याद नहीं कर सकते हैं और इस नए पर पर्याप्त प्रतिष्ठा नहीं है ...)

आप एक फ़ाइल बनाकर और फिर फ़ाइल विशेषताएँ बदलकर ब्लॉक कर सकते हैं।

$ sudo touch shop
$ sudo chattr +i shop

फिर उस फ़ाइल के साथ कुछ भी करने का कोई भी प्रयास अवरुद्ध हो जाएगा - भले ही उपयोगकर्ता रूट हो जाए।

$ rm shop
rm: remove write-protected regular empty file ‘shop’? y
rm: cannot remove ‘shop’: Operation not permitted
$ sudo rm shop
rm: cannot remove ‘shop’: Operation not permitted

2
यदि आप अपने पुराने खाते का नाम / ईमेल पता जानते हैं, तो आप प्रत्येक पृष्ठ के निचले भाग से जुड़े संपर्क फ़ॉर्म से खाता मर्ज करने का अनुरोध कर सकते हैं ।
wizzwizz4 20

इसके अलावा, हमें यह क्यों नहीं बताया कि यह दूसरे उत्तर से कैसे संबंधित है, बजाय इसके कि आपने पोस्ट करने का फैसला क्यों किया?
jpaugh

2

एक गैर-मौजूदा निर्देशिका के अंदर एक गैर-मौजूदा स्थान की ओर इशारा करते हुए एक सिमलिंक बनाएं। इसके कुछ मजेदार निहितार्थ हैं:

$ ln -s non-existent/foobar foo
$ ls -ln
total 0
lrwxrwxrwx 1 1000 1000 19 Okt  4 17:17 foo -> non-existent/foobar
$ mkdir foo
mkdir: cannot create directory ‘foo’: File exists
$ cat foo
cat: foo: No such file or directory
$ echo foo > foo
zsh: no such file or directory: foo
  1. mkdir, लिंक और अन्य EEXIST(फ़ाइल मौजूद है) के साथ विफल हो जाएगा ।
  2. पढ़ने, लिखने या जोड़ने के लिए रास्ता खोलने का प्रयास विफल रहेगा ENOENT(ऐसी कोई फ़ाइल या निर्देशिका नहीं)
  3. स्थान पर स्टेट (2) (स्टैट नहीं लेस्टैट (2) या स्टेट (1)) का उपयोग करना भी विफल रहता है ENOENT। लॉस्टेट निश्चित रूप से सिम्लिंक के बारे में जानकारी लौटाएगा।

यहां प्रस्तावित कुछ अन्य समाधानों पर इसके दो फायदे हैं: (ए) आपको ऐसी सेवा की आवश्यकता नहीं है जो निर्देशिका के निर्माण को ट्रैक करती है और (बी) नाम अधिकांश कमांडों के लिए कोई भी चीज़ नहीं है।

आपको इसे एक शॉट देना होगा, लेकिन मुझे संदेह है कि आपके पास जो भी नियम हैं, वे lstat या अन्य गैर-डीरफेरिंग कमांड का उपयोग नहीं करते हैं, जिससे वे विफल हो जाते हैं।

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