উত্তরটি হ'ল আপনি পারবেন না, যদি না আপনার ফাইল সিস্টেমে কোনও বাগ থাকে। কারণটা এখানে:
আপনার ফাইলে সংজ্ঞায়িত পুনঃনামকরনের জন্য একটি সিস্টেম কল fs/namei.c
নামক renameat
:
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
সিস্টেম কলটি আহ্বান করা হলে, এটি do_path_lookup
নামের উপর একটি পথ অনুসন্ধান ( ) করে। এটি সন্ধান করতে থাকুন, এবং এটিতে এটি আমাদের কাছে আসে link_path_walk
:
static int link_path_walk(const char *name, struct nameidata *nd)
{
struct path next;
int err;
unsigned int lookup_flags = nd->flags;
while (*name=='/')
name++;
if (!*name)
return 0;
...
এই কোডটি যে কোনও ফাইল সিস্টেমে প্রযোজ্য। এর মানে কী? এর অর্থ হ'ল যদি আপনি '/'
traditionalতিহ্যবাহী উপায় ব্যবহার করে ফাইলের নাম হিসাবে প্রকৃত চরিত্রের সাথে একটি প্যারামিটারটি পাস করার চেষ্টা করেন তবে এটি আপনার ইচ্ছা অনুযায়ী করবে না। চরিত্রটি থেকে বাঁচার উপায় নেই। যদি কোনও ফাইলসিস্টেম এটিকে "সমর্থন করে", কারণ এটি হয়:
- একটি ইউনিকোড চরিত্র বা এমন কিছু ব্যবহার করুন যা স্ল্যাশের মতো দেখাচ্ছে তবে তা নয়।
- তাদের একটি বাগ আছে।
উপরন্তু, যদি আপনি করেনি একটি ফাইলের নাম মধ্যে একটি স্ল্যাশ চরিত্র যোগ করার জন্য এবং সম্পাদনা বাইটে যান, খারাপ জিনিস ঘটতে পারে। এর কারণ আপনি কখনই এই ফাইলটি নাম দ্বারা রেফার করতে পারেন নি :( যেহেতু আপনি যা করেছেন, লিনাক্স ধরে নিবে যে আপনি কোনও অস্তিত্বের ডিরেক্টরিকে নির্দেশ করছেন। Rm *) কৌশলটি কোনওভাবেই কাজ করবে না, কারণ বাশ কেবল ফাইলের নামের সাথে এটি প্রসারিত করে। এমনকি rm -rf
কাজ করবে না, যেহেতু একটি সহজ স্ট্রাস প্রকাশ করে যে কীভাবে জিনিসগুলি হুডের নীচে চলছে (সংক্ষিপ্ত):
$ ls testdir
myfile2 out
$ strace -vf rm -rf testdir
...
unlinkat(3, "myfile2", 0) = 0
unlinkat(3, "out", 0) = 0
fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(3) = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0
...
লক্ষ্য করুন যে এই কলগুলি unlinkat
ব্যর্থ হবে কারণ তাদের নাম অনুসারে ফাইলগুলি উল্লেখ করা দরকার।