আমি কি একটি নির্দিষ্ট নামের একটি ফোল্ডার তৈরি হওয়া আটকাতে পারি?


16

আমি একটি ল্যাম্প ওয়েব অ্যাপে কাজ করছি এবং কোথাও একটি নির্ধারিত প্রক্রিয়া রয়েছে যা shopসাইটের মূলের মধ্যে একটি ফোল্ডার তৈরি করে রাখে । প্রতিবার এটি প্রদর্শিত হওয়ায় এটি অ্যাপটিতে পুনর্লিখনের বিধিগুলির সাথে দ্বন্দ্ব সৃষ্টি করে, ভাল নয়।

আমি আপত্তিজনক স্ক্রিপ্ট না পাওয়া পর্যন্ত, কোনও ফোল্ডারটি shopরুটে তৈরি হওয়া রোধ করার কোনও উপায় আছে কি? আমি জানি যে আমি কোনও ফোল্ডারের সামগ্রীর পরিবর্তন হওয়া রোধ করতে অনুমতিগুলিতে পরিবর্তন করতে পারি, তবে নির্দিষ্ট নামের একটি ফোল্ডার তৈরি হওয়া রোধ করার কোনও উপায় আমি পাইনি।


4
কী তৈরি করছে তা জানতে, আপনি নিরীক্ষণ সক্ষম করতে পারবেন ।
অ্যান্ড্রু হেনেল

উত্তর:


30

আপনি পারবেন না, ডিরেক্টরি তৈরি করা ব্যবহারকারীকে পিতামাতার ডিরেক্টরিতে লেখার পর্যাপ্ত অনুমতি আছে।

পরিবর্তে inotifyলিনাক্স কার্নেলের দ্বারা সরবরাহিত সিস্টেম কলগুলির পরিবারকে ডিরেক্টরিটি তৈরি করা (অথবা optionচ্ছিকভাবে) ডিরেক্টরিটি তৈরি করা হলে mvডিরেক্টরিটি তৈরি করতে (এবং optionচ্ছিকভাবে-বিড) ডিরেক্টরিটি দেখতে পারেন toshopmvrm

এই ক্ষেত্রে আপনার যে ইউজারস্পেস প্রোগ্রামটি প্রয়োজন তা হ'ল 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
ট্রিগারটিও

30

একটি নির্দিষ্ট নামের একটি ফোল্ডার তৈরি হওয়া রোধ করার প্রশ্নের উপর ভিত্তি করে আক্ষরিক উত্তর দেওয়া ।

touch shop

অভিন্ন নামের একটি ফাইল বিদ্যমান থাকলে আপনি ডিরেক্টরি তৈরি করতে পারবেন না

mkdir: cannot create directory ‘shop’: File exists


6
এটি * যথেষ্ট নাও হতে পারে। mkdir এটি নাও করতে পারে তবে এটি করা যেতে পারে। যদিও এটি প্রথম চেষ্টা করুন।
coteyr

9
লিনাক্স সিস্টেমে chattr +i shopএটি অপরিবর্তনীয় করতে ব্যবহার করুন । অপরিবর্তনীয় পতাকা সরিয়ে না দেওয়া পর্যন্ত এটির নাম / নামও মুছে ফেলা যায় না।
আর .. গিটিহাব থামিয়ে দিন ICE

1
এটি একটি স্মার্ট সামান্য কৌশল, আমার পরিস্থিতির পক্ষে একেবারেই সঠিক নয় তবে নির্দিষ্ট পরিস্থিতিতে একটি চতুর ধারণা 👍
অ্যান্ড্রু

1
@ আর .. আকর্ষণীয় আমি rename(2)এখনও কাজ করার প্রত্যাশা করছিলাম , কারণ নামটি ইনোডের অংশ নয়, তবে তা হয় না। দ্রুত ইন্টারনেট অনুসন্ধান কেন তা প্রকাশ করে না। কোন ইঙ্গিত?
ডোমেন

@ ডমেন: কারণ এটি "অপরিবর্তনীয়" বৈশিষ্ট্যের উদ্দেশ্যটির অংশ। আমার সন্দেহ হয় কাজ করা renameথেকে বিরত রাখতে এটি বাস্তবায়নের স্তরে অযৌক্তিক অতিরিক্ত কাজ নেয় ।
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

4

হাইজ্যাকিং mkdirসিস্কেল দিয়ে কী 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

নোট করুন যে এই হ্যান্ডলারের অভ্যন্তরে আপনি প্রক্রিয়াটির পিআইডি লগ করতে পারেন যা পরিবর্তে এই ডিরেক্টরিটি তৈরি করতে চান:

$ 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হ্যাকগুলি মূলত সর্বদা ভুল থাকে এবং আপনি কী করছেন তা আপনি যদি না জানেন তবে আপনি যে ফাংশনটি প্রতিস্থাপন করছেন তার অ্যাসিঙ্ক-সিগন্যাল-সুরক্ষার মতো বৈশিষ্ট্যগুলি ভেঙে আপনি যে প্রোগ্রামটি লোড করে সেগুলি তারা খারাপভাবে ভেঙে ফেলতে পারে ।
আর .. গিটিহাব বন্ধ করুন আইসিসি

1
এছাড়াও, আমি মনে করি এর পরিবর্তে fopenথাকা উচিত , যাতে এটি পূর্ববর্তী লগগুলি সংরক্ষণ করতে পারে"a""w"
বিড়াল

2
খারাপ কোড যদি সিস্কেলকে সরাসরি কল করে তবে এটি কাজ করবে না লিবির মাধ্যমে। বা যদি খারাপ কোডটি স্থিরভাবে সংযুক্ত থাকে।
ডোমেন

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

এছাড়াও, কেন আপনি পোস্টের সিদ্ধান্ত নেওয়ার চেয়ে অন্য উত্তরগুলির সাথে এটি কীভাবে সম্পর্কিত তা আমাদের বলবেন না?
jpaugh 18

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) (lstat (2) বা স্ট্যাট (1)) ব্যবহার করাও ব্যর্থ হয় ENOENT। lstat অবশ্যই sylink সম্পর্কিত তথ্য ফিরিয়ে দেবে।

এখানে প্রস্তাবিত অন্যান্য সমাধানগুলির মধ্যে এটির দুটি সুবিধা রয়েছে: (ক) আপনার কোনও পরিষেবা চলমান নেই যা ডিরেক্টরি তৈরির উপর নজর রাখে এবং (খ) বেশিরভাগ কমান্ডের সাথে নামটি উপস্থিত নেই।

আপনাকে এটিকে একটি শট দিতে হবে, তবে আমার সন্দেহ হয় যে আপনার যা কিছু পুনর্লিখনের নিয়ম রয়েছে, তারা lstat বা অন্যান্য নন-ডেরেফারিং কমান্ড ব্যবহার করে না, এগুলি ব্যর্থ করে তোলে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.