বেস এবং ক্যারিজ রিটার্ন আচরণ


11

আমার একটি দ্রুত প্রশ্ন আছে।
এটি কি স্বাভাবিক যে বাশ (আমি ৪.৪.১১ ব্যবহার করছি) লাইন / পাঠ্য প্রদর্শন করছে না যা পৃথক করা হয়েছে / সমতল দিয়ে শেষ হবে\r ?

আমি এই আচরণটি দেখে কিছুটা অবাক হয়েছিলাম:

$ a=$(printf "hello\ragain\rgeorge\r\n")
$ echo "$a"
george

তবে "হ্যালো আবার" পাঠ্যটি এখনও রয়েছে, কোনওভাবে "লুকানো":

$ echo "$a" |od -w32 -t x1c
0000000  68  65  6c  6c  6f  0d  61  67  61  69  6e  0d  67  65  6f  72  67  65  0d  0a
          h   e   l   l   o  \r   a   g   a   i   n  \r   g   e   o   r   g   e  \r  \n

এবং যতক্ষণ না আমরা কেবল বাশ নিয়ে খেলি ঠিক আছে .... তবে এটি কি সম্ভাব্য সুরক্ষার ঝুঁকি? "অ" ভেরিয়েবলের বিষয়বস্তু যদি বাহ্যিক জগত থেকে আসে এবং কেবলমাত্র হ্যালো পরিবর্তে "খারাপ আদেশগুলি" অন্তর্ভুক্ত করে তবে কী হবে?

আরেকটি পরীক্ষা, এবার কিছুটা অনিরাপদ:

$ a=$(printf "ls;\rGeorge\n")
$ echo "$a"
George
$ eval "$a"
0                   awkprof.out       event-tester.log  helloworld.c      oneshot.sh         rightclick-tester.py  tmp                    uinput-simple.py
<directory listing appears with an error message at the end for command George>

কোনও আড়ালের rmপরিবর্তে একটি লুকানো কল্পনা করুন ls

প্রতিধ্বনি -e ব্যবহার করার সময় একই আচরণ:

$ a=$(echo -e "ls;\rGeorge\r\n"); echo "$a"
George

আমি কি কিছু ভুল করি ...?

উত্তর:


20

আপনার echo "$a"প্রিন্টগুলি "হ্যালো", তারপরে লাইনের প্রারম্ভে ফিরে যায় (যা এটি \rহয়), "আবার" মুদ্রণ করে, আবার ফিরে যায়, "জর্জে" মুদ্রণ করে, আবার ফিরে যায় এবং পরবর্তী লাইনে যায় ( \n)। এটি পুরোপুরি স্বাভাবিক, তবে চ্যানার যেমন উল্লেখ করেছেন, বাশের সাথে এর কোনও যোগসূত্র নেই: \rএবং\n টার্মিনাল দ্বারা ব্যাশ করা হয়েছে, বাশ দ্বারা নয় (যার ফলে আপনি কমান্ডটি পাইপ করার সময় পুরো আউটপুট পাবেন od)।

আপনি এটি দিয়ে আরও ভাল দেখতে পারেন

$ a=$(printf "hellooooo\r  again,\rgeorge\r\n")
$ echo "$a"

যেহেতু ওভাররাইট করা পাঠ্যের শেষটি ছেড়ে যাবে:

georgen,o

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


যথেষ্ট সাফ, ধন্যবাদ। আমি আমার পরীক্ষায় একটি শেষ শব্দটি ব্যবহার করতে পেরে ভাগ্যবান / দুর্ভাগ্য, আমি আগের দুটি শব্দ সম্পূর্ণরূপে লিখতে সক্ষম হয়েছি।
জর্জ ভ্যাসিলিও

2
মনে রাখবেন যে এটি আসলে কিছুই করার মতো নয় bash; এটি সম্পূর্ণরূপে টার্মিনালের উপর নির্ভর করে কীভাবে গাড়ীর ফেরত "প্রদর্শন" করা যায়, বা ওভাররাইট করা অক্ষরগুলি কীভাবে প্রদর্শন করা যায়। উদাহরণস্বরূপ, টার্মিনালের পক্ষে -\r|কেবল একটি পাইপের পরিবর্তে প্লাস চিহ্নের অনুরূপ কিছু হিসাবে প্রদর্শিত হওয়া পুরোপুরি বৈধ হবে ।
চিপনার

@ চেপনার জেনে রাখা ভাল! ভাগ করে নেওয়ার জন্য ধন্যবাদ. আমি ভেবেছিলাম এটি কেবল বাশ আচরণ ছিল।
জর্জ ভ্যাসিলিউ 14

@ জর্জেভ্যাসিলিউ নোপ, bashকেবল একটি ফাইলকে বাইট লিখেছেন; যে কেউ সেই ব্যাটগুলি ব্যাখ্যা করার জন্য এটি পড়েন
চ্যানার

নিতপিক: printfএটি একটি ব্যাশ অন্তর্নির্মিত কমান্ড (যদিও এটি স্ট্যান্ডেলোন এক্সিকিউটেবল হিসাবে উপস্থিত রয়েছে), এর ব্যাখ্যা দেয় \r(দুটি বাইটের অনুক্রম: 0x5cএবং 0x72ক্যারেজ রিটার্ন তৈরি করে (একক বাইট 0x0d:)) তারপরে, হ্যাঁ, টার্মিনাল বাইট ব্যাখ্যা করে 0x0dএকটি বিশেষ পদ্ধতিতে, কিন্তু এটা মূল স্ট্রিং ব্যাখ্যা নেই \r
সুজান্ন Dupéron

6

ইউনিক্স বিশ্বে ক্যারিজ রিটার্ন (সাধারণত \rপ্রোগ্রামিং ভাষার মতো এনকোডড) একটি অবিস্মরণীয় নিয়ন্ত্রণ চরিত্র। লাইন ফিড ( নিউলাইনও বলা হয় ) ব্যতীত অন্য কোনও চরিত্রের মতো আপনি পাঠ্য লাইনের অভ্যন্তরে ক্যারেজ রিটার্ন পেতে পারেন যা একটি লাইনের শেষ চিহ্নিত করে।

বিশেষত, বাশ স্ক্রিপ্টে, ক্যারেজ রিটার্ন হ'ল অক্ষর এবং অঙ্কগুলির মতো একটি সাধারণ শব্দ উপাদান চরিত্র। গাড়ীর ফেরতের কোনও বিশেষ প্রভাব শেল থেকে নয়, টার্মিনাল থেকে আসে।

একটি ক্যারেজ রিটার্ন একটি নিয়ন্ত্রণ চরিত্র । আপনি যখন এটি টার্মিনালে মুদ্রণ করবেন তখন গ্লাইফ প্রদর্শন করার পরিবর্তে টার্মিনালটি কিছু বিশেষ প্রভাব ফেলে। ক্যারিজ রিটার্নের জন্য, বিশেষ প্রভাবটি হ'ল কার্সারটিকে বর্তমান লাইনের শুরুতে নিয়ে যাওয়া। এইভাবে, আপনি যদি মাঝখানে কোনও ক্যারেজ রিটার্নযুক্ত একটি লাইন মুদ্রণ করেন, তবে এর প্রভাবটি দ্বিতীয়ার্ধটি প্রথমার্ধে লেখা হয়।

অন্যান্য বেশ কয়েকটি নিয়ন্ত্রণের অক্ষরগুলির বিশেষ প্রভাব রয়েছে: ব্যাকস্পেস অক্ষরটি কার্সারকে এক অবস্থান থেকে সরিয়ে নিয়ে যায়। বেল চরিত্রটি টার্মিনালটিকে একটি শব্দ নির্গত করে বা অন্যথায় ব্যবহারকারীর দৃষ্টি আকর্ষণ করে। পালানোর চরিত্রটি একটি পালানোর ক্রম শুরু করে যা সমস্ত ধরণের বিশেষ প্রভাব ফেলতে পারে।

আপনি যদি অবিশ্বস্ত আউটপুট প্রদর্শন করেন তবে আপনার নিয়ন্ত্রণ অক্ষরগুলি স্ক্রাব করা বা পালাতে হবে। কেবল গাড়িবহরই নয়, আরও বেশ কয়েকটি, বিশেষত পালানোর চরিত্র, যা সমস্ত প্রকারের খারাপ প্রভাবের কারণ হতে পারে। দেখুন করতে পারেন "বিড়াল-ing" একটি ফাইল একটি সম্ভাব্য নিরাপত্তা ঝুঁকি হতে পারে? এবং টার্মিনালগুলিতে কীভাবে পালানোর ক্রম আক্রমণ এড়ানো যায়? বিষয়ে আরও জন্য।


0

আপনি printfএকটি %qবিন্যাস সহ ফাংশনটি ব্যবহার করে ব্যাশ ভেরিয়েবলের গাড়ীর রিটার্ন দেখতে পারেন ।

$ TESTVAR="$(printf ' Version: 1 \r Build: 20180712 \r Test: 1324')"

$ printf %q $TESTVAR
Version:1$'\r'Build:20180712$'\r'Test:1324

সূত্র এবং আরও পড়া:

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