কোনও ফাইলনামে "/" ব্যবহার করা কি সম্ভব?


111

আমি জানি যে এটি এমন কিছু নয় যা কখনও করা উচিত, তবে স্ল্যাশ চরিত্রটি ব্যবহার করার কোনও উপায় আছে যা সাধারণত লিনাক্সের একটি ফাইলের নামের মধ্যে ডিরেক্টরি পৃথক করে?


1
আমি অনুমান করি যে আপনি আপনার হার্ডডিস্ক পার্টিশনে সরাসরি অ্যাক্সেস ব্যবহার করে কোনও ফাইলের নাম পরিবর্তন করতে পারেন এবং কোথাও কোথাও একটি '/' অক্ষর প্যাচ করতে পারেন। যা ঘটে তা একটি আকর্ষণীয় প্রশ্ন ... সম্ভবত আপনি যা চান তা সম্ভবত নয়।
hochl

1
তবে সংক্ষিপ্ত উত্তরটি হওয়া উচিত: না, এটি এমন কিছু নয় যা কখনও করা উচিত :-)
সিমন ভিজার

এফএস কাউন্টে ডিরেক্টরিতে প্রবেশের ফাইলের নাম স্ল্যাশ হ্যাকিং কি না? এটি সুপারিশ করা হবে না; আপনি কখনও ফাইলটি অ্যাক্সেস করতে সক্ষম হবেন না।
জোনাথন লেফলার

35
এটি আমার বন্ধুটির নাম অনুসারে একটি ফাইল তৈরি করার সময় *এবং তারপরে জিজ্ঞাসা করেছিল, "আমি কীভাবে একটি ফাইল সরিয়ে ফেলব?" আমি উত্তর দিয়েছি, rmফাইলের নাম অনুসরণ করে। ঠিক আছে, আপনি বাকি জানেন।
ডেভিড হেফারনান

1
নতুন লিনাক্স ব্যবহারকারীদের জন্য, আপনি যখন কোনও এক্সপ্রেশন বা ফাইলের নাম সম্পর্কে আত্মবিশ্বাসী নন, তখন আমি মনে করি lsযে আপনি যে ফাইলগুলি সরাতে চান তার তালিকা তৈরি করতে এবং তারপরে lsকমান্ডটি rmপরবর্তী সময়ে পরিবর্তন করা ভাল ব্যবহার use
ডেভ এফ

উত্তর:


129

উত্তরটি হ'ল আপনি পারবেন না, যদি না আপনার ফাইল সিস্টেমে কোনও বাগ থাকে। কারণটা এখানে:

আপনার ফাইলে সংজ্ঞায়িত পুনঃনামকরনের জন্য একটি সিস্টেম কল 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ব্যর্থ হবে কারণ তাদের নাম অনুসারে ফাইলগুলি উল্লেখ করা দরকার।


8
এছাড়াও, নোট করুন যে e2fsckকোনও ফাইলনামকে কমপক্ষে একটি অবৈধ ফাইল নাম হিসাবে বিবেচনা করে যা স্থির করতে হবে the উত্সটি দেখুন । সুতরাং যদি আপনি কোনওরকম কোনও ফাইল নাম দিয়ে শেষ করেন যা এতে স্ল্যাশ করে থাকে তবে আপনি fsckসমস্যার সমাধান করতে পারেন ।
ehabkost

4
কোন ফাইলনাম ? বাগের মতো শোনাচ্ছে e2fsck: p
flarn2006

36

আপনি একটি ইউনিকোড অক্ষর ব্যবহার করতে পারেন যা "/" হিসাবে প্রদর্শিত হয় (উদাহরণস্বরূপ এটি আপাতদৃষ্টিতে রিন্ডান্ট গ্লাইফ ) ধরে নিচ্ছে যে আপনার ফাইল সিস্টেমটি এটি সমর্থন করে।


42
হ্যাঁ, অবিকল: শুধুমাত্র /, যা U + 002F SOLIDUS, নিষিদ্ধ। প্রচুর অন্যান্য উপযুক্ত প্রার্থী রয়েছে: U ইউ + 2044 FRACTION SLASH; U হ'ল ইউ + 2215 DIVISION SLASH; U হ'ল ইউ + 29 এফ 8 BIG SOLIDUS; U হ'ল ইউ + এফএফ0 এফ FULLWIDTH SOLIDUS, এবং U হ'ল ইউ + 2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT। সমস্ত প্রশংসনীয়ভাবে কাজ করবে!
tchrist

2
তবে তারপরে যদি ব্যবহারকারী তার ফাইল / দির নামগুলিতে সেই প্রকৃত অক্ষরগুলি ব্যবহার করে? আমাদের জেনেরিক পালানোর সমাধান দরকার। খুব খারাপ লিনাক্সের স্বাভাবিক কোড কোনওটিকে সমর্থন করে না, কারণ এটি আক্ষরিকভাবে ASCII 0x2F এর সাথে মেলে। ASCII কমপক্ষে 20 বছর থেকে একটি বড় নম্বর no (ইউনিকোড 1.0, 1991 সালের!)
Evi1M4chine

@ ক্রিশ্চ আমি ইউনিকোডের উপর নির্ভর করতে পছন্দ করি না। সুতরাং আমি সম্ভবত একটি বহু-চরিত্রের ডিলিমিটার পছন্দ করব ---। আপনার সীমানা পছন্দ একটি পৃথক অক্ষর ব্যবহার করতে পারে এবং পুনরাবৃত্তি সংখ্যা পৃথক করতে পারে।
ট্রেভর বয়ড স্মিথ

: অনেক অক্ষর, যা বিভিন্ন ফাইল সিস্টেম অধীনে নিষিদ্ধ করা হয় সম্ভব প্রতিস্থাপন একটি তালিকা জন্য, আমার উত্তর কটাক্ষপাত আছে stackoverflow.com/a/61448658/4575793
Cadoiz

9

এটি আপনি কোন ফাইল সিস্টেম ব্যবহার করছেন তার উপর নির্ভর করে। আরও জনপ্রিয় কিছুগুলির মধ্যে:


1
এটি কেবল ফাইল সিস্টেমের উপর নির্ভর করে না, সমস্ত * নিক্স সিস্টেমে সিস্টেম কলগুলি / ডিরেক্টরি গাছের উপাদান হিসাবে পার্স করবে।
ব্ল্যাকলে মরি

2
ফরোয়ার্ড স্ল্যাশ অক্ষরটি কার্নেলের মধ্যে হার্ড-কোডড, ফাইল সিস্টেমের চেয়ে আলাদা ( grep -r "'/'" *আপনার কার্নেলের উত্সে চেষ্টা করে দেখুন )
রবার্ট মার্টিন

20
টুইটার "ফরোয়ার্ড স্ল্যাশ" একটি সম্পূর্ণরূপে হয় গ্রহণযোগ্য স্ল্যাশ চরিত্র উল্লেখ পুঙ্খানুপুঙ্খভাবে পরিষ্কার যা করতে প্রণালী স্ল্যাশ এক বোঝায়। কখনও কখনও লোকেরা বিভ্রান্ত হয়: পি
রবার্ট মার্টিন

2
হাহ, তবে @ ট্রিস্টেরও একটা বিষয় আছে, আমার মনে হয়। কেন 'ইম্প্লি' / 'এবং' ব্যাক 'ইম্প্লি' \ 'ফরোয়ার্ড করে? আমার এখনও অবধি সবচেয়ে ভাল ব্যাখ্যাটি হ'ল লিখনের উপর দিয়ে নীচে থেকে শুরু করে একটি পেন দিয়ে লেখা থাকলে, '/' ডানদিকে বা 'এগিয়ে' এবং 'moves' চালা 'বাম' বা 'পিছনে' পড়ে / লেখার সময় বাম থেকে ডানে. যদিও আমি এই ব্যাখ্যাটি সত্যিই পছন্দ করি না, কিছুটা কারণ আমি সবসময় নীচ থেকে আমার চরিত্রগুলি লিখি না এবং উপরে চলে যাই। আমার মনে হয় একটি চরিত্র লেখার সময় উপরে থেকে শুরু করে নীচে নেমে যাওয়া প্রায়শই ভাল প্রবাহিত হয়।
জেসি ডাব্লু। কলিন্স

4
@ jwso এটি সম্পূর্ণরূপে একটি দিক নির্দেশক, তবে এটি প্রমিত, প্রচলিত ভাষা। স্ল্যাশ এমনটি নয় যা ইউনিকোডকে প্রতীক বলে মনে হয় যা এগুলির মতো দেখায়, এটি তাদেরকে solidus বলে। তবে যদি কারও ন্যায্যতা প্রয়োজন হয়, লেখার দিকের (বাম থেকে ডানে) উপরের দিকের সাথে লাইনটি যেদিকে ঝুঁকছে বা পড়েছে তার পিছনে এবং সামনে দিক রয়েছে। এটি "\" বলে মনে হচ্ছে, এবং ==> বা "/" এর মতো দেখতে এগিয়ে লাগলে <== বা পিছনের দিকে ঝুঁকতে হবে।
স্টুয়ার্ট আর জেফেরিজ

4

কেবলমাত্র সম্মত এনকোডিং সহ। উদাহরণ হিসেবে বলা যায়, আপনি সম্মত হন পারে যে %যেমন এনকোড করা হবে %%এবং যে %2Fএকটি অর্থ /। এই ফাইলটিতে অ্যাক্সেস করা সমস্ত সফ্টওয়্যারগুলির এনকোডিংটি বুঝতে হবে।


19
"যাকে আমরা অন্য কোনও নামে স্ল্যাশ বলি তা দুর্গন্ধযুক্ত হবে" - শেক্সপিয়ার
রবার্ট মার্টিন

1

সংক্ষিপ্ত উত্তরটি: না, আপনি পারবেন না। ডিরেক্টরি কাঠামো কীভাবে সংজ্ঞায়িত করা হয় তার কারণে এটি একটি প্রয়োজনীয় নিষেধাজ্ঞা।

এবং উল্লিখিত হিসাবে, আপনি একটি ইউনিকোড চরিত্র প্রদর্শন করতে পারেন যা "স্ল্যাশের মতো" দেখতে লাগে তবে এটি আপনি যতটা পাবেন।


1

সাধারণভাবে কোনও ফাইলের নামেই "খারাপ" অক্ষর ব্যবহার করার চেষ্টা করা একটি খারাপ ধারণা; এমনকি যদি আপনি এটি কোনওভাবে পরিচালনা করেন তবে পরে ফাইলটি ব্যবহার করা শক্ত হয় to ফাইল সিস্টেম বিভাজক একদম ফ্ল্যাট-আউট কাজ করে না, তাই আপনাকে বিকল্প পদ্ধতি বেছে নেওয়া দরকার।

আপনি কি ইউআরএল-এনকোডিং এর পরে ফাইল নাম হিসাবে ব্যবহার করে বিবেচনা করেছেন? ফাইলের নাম হিসাবে ফলাফলটি সূক্ষ্ম হওয়া উচিত এবং এনকোড করা সংস্করণ থেকে নামটি পুনর্গঠন করা সহজ।

আরেকটি বিকল্প হ'ল একটি সূচক তৈরি করা - আপনার পছন্দ অনুযায়ী যেকোন পদ্ধতি ব্যবহার করে আউটপুট ফাইলের নাম তৈরি করুন - ক্রমানুসারে নাম্বারযুক্ত নাম, SHA1 হ্যাশ, যাই হোক না কেন - তারপরে উত্পন্ন ফাইলের নাম / ইউআরএল জোড়া দিয়ে একটি ফাইল লিখুন। আপনি এটিকে একটি হ্যাশে সংরক্ষণ করতে পারেন এবং ইউআরএল-থেকে-ফাইলনাম অনুসন্ধান করতে ব্যবহার করতে পারেন বা হ্যাশের বিপরীত সংস্করণটি তদ্বিপরীত করতে পারেন এবং প্রয়োজনে আপনি এটিকে লিখে লিখে পুনরায় লোড করতে পারেন।

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