'Rm -rf' থেকে সুরক্ষিত একটি ডিরেক্টরি তৈরি করা


9

আমি সবেমাত্র ফোল্ডার এ এর ​​কিছু তথ্য হারিয়েছি যা ফোল্ডার বি এর ভিতরে ছিল rm -rf B। আমি কী করেছি বুঝতে পারার আগেই তা শেষ হয়ে গিয়েছিল। এখন একটি পাঠ শিখেছে, পরের বার যখন আমি অনুরূপ কিছু করি এবং নিজেকে মেরে ফেলতে চাই তখন আমার কিছু ফোল্ডার ইডিয়ট-প্রুফ তৈরি করতে চাই।

আমি যেভাবে ভাবতে পারি তা হ'ল বাশ ফাংশন লিখুন এবং এটির নাম দিন rm। এই ফাংশনটি যেমন একটি লুকানো ফাইলের জন্য প্রতিটি উপ-ফোল্ডারটিতে সন্ধান করবে .dontdelete। যখন খুঁজে পাওয়া যায়, তখন জিজ্ঞাসা করা হত যে আমি সত্যিই চালিয়ে যেতে চাই কিনা। এই ফোল্ডারে অবিচ্ছিন্নভাবে লেখার একটি প্রক্রিয়া থাকায় আমি লেখার সুরক্ষিত করতে পারি না। এটি করার আরও ভাল উপায় আছে কি?


2
আপনি কি উপনামটি ব্যবহার rmকরে চেষ্টা করেছেন rm -i:> প্রত্যেকটি অপসারণের পূর্বে প্রম্পট বা> -আই প্রম্প্ট একবারে তিনটি বেশি ফাইল সরিয়ে দেওয়ার আগে, বা পুনরাবৃত্তভাবে অপসারণ করার সময়। -I এর চেয়ে কম কন্ট্রোসিভ, তবুও বেশিরভাগ ভুলের বিরুদ্ধে সুরক্ষা দেওয়ার সময় আপনি যে কোনও সময় অন্য পতাকাগুলি দিয়ে চালিত করতে পারেন।
আইবিআর

2
দেখুনsafe-rm
sr_

এটি করার জন্য প্রায় এক ডজন উপায় রয়েছে। আপনার পরিবেশ সম্পর্কে আপনার আরও বিশদে যেতে হবে।
ইগনাসিও ওয়াজকেজ-আব্রামস


আরেকটি ধারণা হ'ল এটিকে একটি ফাংশনটিতে উপন্যাস করা যা এটি কেবল একটি নির্দিষ্ট ফোল্ডারে নিয়ে যায় এবং তারপরে একটি ক্রোনজব তৈরি tmpwatchকরে যা প্রতি ঘন্টা এই ফোল্ডার থেকে ফাইলগুলি মুছতে দৌড়ে ।
ব্র্যাচলে

উত্তর:


14

আপনার প্রশ্ন গবেষণায় আমি এই কৌশলটি নিয়ে এসেছি যা ভবিষ্যতে আপনাকে সহায়তা করতে পারে।

আপনি সম্ভবত ডিরেক্টরিতে কোনও ফাইল স্পর্শ করতে পারেন:

touch -- -i

এখন আপনি যখন উপস্থিত rm -fr *একটি ডিরেক্টরিতে কমান্ডটি চালাবেন তখন আপনাকে -iইন্টারেক্টিভ প্রম্পটটি উপস্থাপিত হবে rm

$ ls
file1  file2  file3  file4  file5  -i

$ rm -fr *
rm: remove regular empty file `file1'? n
rm: remove regular empty file `file2'? n
rm: remove regular empty file `file3'? n
rm: remove regular empty file `file4'? n
rm: remove regular empty file `file5'? n

rmসর্বদা করার জন্য কেবল একটি উপাধি রেখে একই জিনিস অর্জন করা যেতে পারে rm -i। এটি বিরক্তিকর হতে পারে। তাই প্রায়শই আমি যা দেখেছি তা হল এই উরফটি জায়গায় রাখা এবং তারপরে এটি অক্ষম করা যখন আপনি সত্যিই অনুরোধ না করে মুছতে চান।

alias rm='rm -i'

এখন ডিরেক্টরিতে আপনাকে এইভাবে স্বাগত জানানো হবে:

$ ls
file1  file2  file3  file4  file5

$ rm -r *
rm: remove regular empty file `file1'?

নামটি ওভাররাইড করতে:

$ \rm -r *

এটি এখনও কিছুটা থামছে না rm -fr। তবে এটি আপনাকে কিছুটা সুরক্ষা দেয়।

তথ্যসূত্র


1
এটি একটি দুর্দান্ত, মার্জিত সমাধান যা আপনি কেবলমাত্র ডিরেক্টরিগুলির একটি ছোট সেট রক্ষা করতে চাইলে / প্রয়োজনে ভাল কাজ করে। এবং আমি সেকেলে হতে পারে কিন্তু আমি এখনো ছাপ অধীন লাইভ যে আপনি যদি বলতে --forceকিছু, আপনি কি সত্যিই এটা মানে।
একটি সিভিএন

আরও মনে রাখবেন যে rm -I(আপার ক্ষেত্রে i) কোনও উপাত্তে দরকারী হতে পারে, কারণ এটি কিছুটা কম অনুপ্রবেশকারী (ম্যান পৃষ্ঠা অনুসারে, কেবলমাত্র যদি আপনি তিনটিরও বেশি ফাইল সরিয়ে ফেলেন বা পুনরাবৃত্তি করে) p
একটি সিভিএন

নোট করুন যে touch ./-iকৌশলটি শুধুমাত্র GNU এর সাথে কাজ করে rmএবং কেবলমাত্র POSIXLY_CORRECT ভেরিয়েবল সেট না করা থাকলে (পসিক্স কমান্ড আর্গুমেন্টের পরে বিকল্পগুলি স্বীকৃতি দেয় না)।
স্টাফেন চেজেলাস

5

অনেক সম্ভাবনা:

  • alias rm='rm -i'- আরএম জিজ্ঞাসা করবে - আপনি নির্দিষ্ট না করে -f...
  • chmod -w dir - ডিরেক্টরি সরাসরি ডিরেক্টরি ফাইল রক্ষা করে।
  • chattr +i আপনি যদি সত্যিই এটি বোঝাতে চান
  • আরএম এর চারপাশে আপনার নিজের মোড়ক লিখুন
  • ইত্যাদি ...

তবে একটি ভাল উপায় সম্ভবত একটি ভাল ব্যাকআপ রাখা এবং গুরুত্বপূর্ণ ডেটা একরকম সংস্করণ নিয়ন্ত্রণে রাখা (যেমন git) রাখা হয়, যা প্রচুর পরিমাণে অন্যান্য সুবিধাও বয়ে আনে।


1
এটি উল্লেখ করতে এখানে এসেছিলেন। এটিকে সম্পূর্ণরূপে নিরাপদ করার জন্য আমি চ্যাটার + এর পরামর্শ দেব।
জেজেওলা

আমি ইতিমধ্যে আরএম এ্যালাইজ করেছি rm -iতবে একজন যেমন আশা করে, এটি -fবিকল্পের সাথে কাজ করে না । আমি অন্যান্য অনেক উদ্দেশ্যে গিট ব্যবহার করি, তবে আমি যদি ঘটনাক্রমে rm -rf *গিটটিও করি তবে কী হবে?
দিলোয়ার

গিটের সাহায্যে, আপনি যদি কেবল একটি উপ-ডিরেক্টরি মুছে ফেলেন তবে আপনি সহজেই এটি আপনার স্থানীয় সংগ্রহস্থল থেকে পুনরুদ্ধার করতে পারেন। আপনি যদি পুরো সংগ্রহস্থলটি সরিয়ে ফেলেন তবে আপনি এটিকে আবার ক্লোন করতে পারেন - আপনি এটিকে আগে অন্য কোনও জায়গায় ঠেলে দিলে।
মিচাস

1

gitআপনার প্রকল্পগুলি encapsulate পছন্দ মত একটি সংস্করণ নিয়ন্ত্রণ সফ্টওয়্যার ব্যবহার করুন ।

যতক্ষণ না আপনি একটি সম্পূর্ণ প্রকল্প মুছবেন না ততক্ষণ আপনাকে উদ্দেশ্যমূলকভাবে ডিরেক্টরিটি rm -rf .*মুছে .gitফেলতে হবে এবং রোলব্যাকের জন্য প্রয়োজনীয় সমস্ত ডেটা হারাতে হবে।

এতে অতিরিক্ত সুবিধা রয়েছে যা আপনি গিথুব বা বিটবকেটের মতো দূরবর্তী সার্ভারে আপনার স্টাফের ব্যাকআপগুলি ধাক্কা দিতে পারেন।


1

এখানে কীভাবে rm -rf dirকাজ করে:

  1. এটি খোলে dirএবং এর সামগ্রী তালিকাভুক্ত করে।
  2. প্রতিটি প্রবেশের জন্য, যদি এটি ডিরেক্টরি থাকে তবে এর জন্য একই প্রক্রিয়াটি পুনরাবৃত্তি করুন, যদি তা না হয় তবে এটিতে কল unlinkকরুন।

যদি আপনি, ডিরেক্টরি তালিকার জন্য, প্রথমে একটি বিশেষ ফাইলের নামটি ফিরিয়ে দিতে পারেন, এবং যদি আপনি unlinkসেই ফাইলটিতে কোনও প্রক্রিয়াটি মারা যাওয়ার কারণ হতে পারেন তবে সমস্যার সমাধান হবে। এটি একটি ফিউজ ফাইল সিস্টেম ব্যবহার করে করা যেতে পারে।

উদাহরণস্বরূপ, আপনি পার্ল ফিউজ মডিউল থেকে loopback.plউদাহরণটি রূপান্তর করতে পারেন যা কেবল মাত্র একটি ডামি ফাইল সিস্টেম প্রয়োগ করে যা নীচের একটি বাস্তব ফাইল সিস্টেমের কাছে কেবল একটি পাস-থ্রো (নীচে প্যাচও দেখুন):

  • ডিরেক্টরি তালিকাভুক্ত করার সময়, যদি এতে একটি এনট্রি নামের অন্তর্ভুক্ত থাকে তবে .{{do-not-delete}}.দুটি ফাইল সহ এন্ট্রিগুলির তালিকাটি পূর্বে যুক্ত করুন: .{{do-not-delete}}!errorএবং.{{do-not-delete}}!kill
  • unlinkপ্রথমটির চেষ্টা করার সময়, EPERMকোডটি ফিরিয়ে দিন যাতে rmকোনও ত্রুটি বার্তা প্রদর্শিত হয়
  • unlinkদ্বিতীয়টির চেষ্টা করার পরে, প্রক্রিয়াটি মারা যায়।

$ ls -Ff dir/test
./  .{{do-not-delete}}.  foo/  ../  bar
$ ./rm-rf-killer dir
$ ls -Ff dir/test
.{{do-not-delete}}!error  .{{do-not-delete}}!kill  ./  .{{do-not-delete}}.   foo/  ../  bar
$ rm -rf dir/test
rm: cannot remove `dir/test/.{{do-not-delete}}!error': Operation not permitted
zsh: terminated  rm -rf dir/test
$ ls -Ff dir/test
.{{do-not-delete}}!error  .{{do-not-delete}}!kill  ./  .{{do-not-delete}}.   foo/  ../  bar

ধারণার প্রমাণ হিসাবে সেই loopback.plউদাহরণের উপরে প্রয়োগ করার জন্য এখানে একটি প্যাচ রয়েছে :

--- loopback.pl 2013-06-03 22:35:00.577316063 +0100
+++ rm-rf-killer    2013-06-03 22:33:41.523328427 +0100
@@ -7,2 +7,4 @@
 my $has_threads = 0;
+my $flag = ".{{do-not-delete}}";
+
 eval {
@@ -42,3 +44,4 @@

-use blib;
+#use blib;
+use File::Basename;
 use Fuse;
@@ -49,3 +52,3 @@

-my %extraopts = ( 'threaded' => 0, 'debug' => 0 );
+my %extraopts = ( 'threaded' => 0, 'debug' => 0, 'mountopts' => 'nonempty' );
 my($use_real_statfs, $pidfile);
@@ -64,3 +67,7 @@

-sub fixup { return "/tmp/fusetest-" . $ENV{LOGNAME} . shift }
+sub fixup {
+    my $f = shift;
+    $f =~ s#(/\Q$flag\E)!(error|kill)$#$1.#s;
+    return ".$f";
+}

@@ -78,3 +85,9 @@
 }
-    my (@files) = readdir(DIRHANDLE);
+    my @files;
+    
+    while (my $f = readdir(DIRHANDLE)) {
+        unshift @files, "$flag!error", "$flag!kill"
+            if ($f eq "$flag.");
+        push @files, $f;
+    }
 closedir(DIRHANDLE);
@@ -121,3 +134,12 @@
 sub x_readlink { return readlink(fixup(shift));         }
-sub x_unlink   { return unlink(fixup(shift)) ? 0 : -$!; }
+sub x_unlink   {
+    my $f = shift;
+    if (basename($f) eq "$flag!error") {return -EPERM()}
+    if (basename($f) eq "$flag!kill") {
+        my $caller_pid = Fuse::fuse_get_context()->{"pid"};
+        kill("TERM", $caller_pid);
+        return -EPERM();
+    }
+    return unlink(".$f") ? 0 : -$!;
+}

@@ -203,3 +225,2 @@
 sub daemonize {
-    chdir("/") || die "can't chdir to /: $!";
 open(STDIN, "< /dev/null") || die "can't read /dev/null: $!";
@@ -236,2 +257,3 @@

+chdir($mountpoint) or die("chdir: $!");
 daemonize();
@@ -239,3 +261,3 @@
 Fuse::main(
-    'mountpoint'    => $mountpoint,
+    'mountpoint'    => '.',
 'getattr'       => 'main::x_getattr',

-1

এই কাজটি আরও সহজ করার জন্য আমি একটি স্ক্রিপ্ট তৈরি করেছি। শেল স্ক্রিপ্টটি রুট পাসওয়ার্ড না জিজ্ঞাসা করে ইন্টারঅ্যাকটিভভাবে ফোল্ডারগুলির প্রদত্ত তালিকার পড়া / লেখার অনুমতি এবং চ্যাটার ফ্ল্যাগটি পরিবর্তন করে। নীচের লিঙ্কটি থেকে আপনি জিপ ফাইলটি ডাউনলোড করতে পারেন।

https://drive.google.com/file/d/0B_3UYBZy2FVsMVpBSWdSWnFBYk0/edit?usp=sharing

সেটআপটি আরও সহজ করার জন্য আমি ইনস্টলেশন স্ক্রিপ্টও অন্তর্ভুক্ত করেছি। জিপ ফাইলে নির্দেশাবলী বদ্ধ থাকে।

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