Name xargs sudo rm -rf` চালানোর জন্য ফাইলের নামগুলি কি যথেষ্ট সুরক্ষা বোধ করা হচ্ছে?


10

আমি একটি স্ক্রিপ্ট লিখেছি যা একটি ফোল্ডারে শেষ দুটি ফাইল বাদে সমস্ত মুছে ফেলে:

#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
    | head -n -2 \
    | xargs printf -- "'/path/to/some/folder/%s'\n" \
    | xargs sudo rm -rf

এই স্ক্রিপ্টটি প্রতিদিন ক্রোন জব হিসাবে কার্যকর করা হবে।

যুক্তিটি নিম্নরূপ:

  1. ব্যবহার করে সমস্ত ফাইলের একটি তালিকা পান ls -1(যাতে আমি প্রতি লাইনে একটি ফাইল পাই);

  2. ব্যবহার করে তালিকা থেকে শেষ দুটি সরান head -n -2;

  3. যেহেতু lsআপেক্ষিক পাথগুলি মুদ্রণ করে, xargs printfফোল্ডারটির পথটি প্রিপেন্ড করতে এটিকে জিনিসটি ব্যবহার করুন এবং এটিকে একটি পরম পথ তৈরি করুন;

  4. তাদের sudo rm -rfব্যবহার করতে প্রেরণ করুন xargs

এই ফোল্ডারে প্রত্যেকের অ্যাক্সেস রয়েছে, সুতরাং যে কেউ এই ফোল্ডারে যে কোনও ফাইল তৈরি করতে এবং মুছতে পারে।

সমস্যাটি হ'ল: sudo rm -rf ভয়ঙ্কর। xargs sudo rm -rfঅবিশ্বাস্যরকম ভীতিকর।

আমি নিশ্চিত হতে চাই যে মুছে ফেলার জন্য চালিত ফাইল তৈরি করে (অন্য কোনও দুর্ঘটনাক্রমে বা উদ্দেশ্যমূলকভাবে) কেউ অন্য ফোল্ডার / সিস্টেমগুলিকে ক্ষতি করতে পারে না। আমি জানি না, কিছু চালাকের মতো:

file with / spaces.txt

যার ফলশ্রুতিতে একটি অতি ভয়ঙ্কর হতে পারে sudo rm -rf /

সম্পাদনা: আমার ভুল, ফাইলের নামগুলি ধারণ করতে পারে না /, সুতরাং এই নির্দিষ্ট সমস্যাটি ঘটবে না, তবে অন্যান্য ঝুঁকি রয়েছে কিনা তা নিয়ে প্রশ্ন এখনও দাঁড়িয়ে আছে।

এই কারণেই আমি ব্যবহার করছি --quoting-style=shell-always, এটি ফাঁকা ফাইল সহ কোনও কৌশল রোধ করা উচিত। তবে এখন আমি ভাবছি কেউ হয়তো ফাইলনেমে ফাঁকা স্থান এবং উদ্ধৃতিগুলির সাথে অতিরিক্ত চালাক হতে পারে ।

আমার লিপিটি কি নিরাপদ?


দ্রষ্টব্য: আমার প্রয়োজন sudoকারণ আমি ফোল্ডারটি দূর থেকে অ্যাক্সেস করছি (ম্যাপযুক্ত নেটওয়ার্ক ড্রাইভ ব্যবহার করে mount) এবং আমি এটি sudo ছাড়া কাজ করতে পারি না।


3
আপনি কি কিছু করার কথা ভেবে দেখেছেন printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm?
স্টিল্ড্রাইভার

/নামের চরিত্রটির সাথে একটি ফাইল তৈরি করা যেতে পারে আমি এটি এখানে ফিরে পাওয়ার চেষ্টা করছি
জর্জ উদোসেন

3
@ জর্জি নো, একটি ফাইলের নামটিতে স্ল্যাশ থাকতে পারে না।
wjandrea

সুতরাং যখন ওপি চতুর ব্যক্তিটি বলছে আমি ভাবছিলাম ...
জর্জ উদোসেন

6
কেবলমাত্র আপনি lsআউটপুট পার্সিং করার কারণে এটি ইতিমধ্যে একটি খারাপ লিখিত কমান্ড, এমনকি উদ্ধৃতি সহ। lsঅর্ডার বাছাইয়ের জন্য লোকেলও ব্যবহার করে, আমি মনে করি, সুতরাং headশেষ 2 অপসারণের উদ্দেশ্য কী তা আমি দেখতে পাচ্ছি না (যদি আপনি পরিত্রাণের চেষ্টা করছেন না .এবং ..কোন আইর্কে rmকোনওভাবেই যুক্তি হিসাবে মঞ্জুরি দেওয়া হচ্ছে না Just কেবল ব্যবহার করুন find /path/to/folder -type f deleteAnd না sudoআপনি যদি ক্রোন থেকে দৌড়ে যান - ক্রোন ইতিমধ্যে মূল স্তরে রয়েছে
সের্গেই কলডিয়াজহনি

উত্তর:


10

লিনাক্সে, কোনও অক্ষর হ'ল বৈধ ফাইলনাম গঠনের অক্ষর ব্যতীত:

  • \0 (ASCII NUL): C তে স্ট্রিং সমাপনের জন্য ব্যবহৃত
  • / (ফরোয়ার্ড স্ল্যাশ): পথ পৃথকীকরণের জন্য ব্যবহৃত

সুতরাং, আপনার ধারণাটি অবশ্যই অনেক ক্ষেত্রে কার্যকরভাবে কাজ করবে না আপনি যেমন কল্পনা করতে পারেন উদাহরণস্বরূপ এটি \nফাইলনামে একটি নতুন লাইন ( ) পরিচালনা করে ? ( ইঙ্গিত: না )

কয়েকটি নোট:

  • বিশ্লেষণ করবেন না ls; উত্সর্গীকৃত সরঞ্জামগুলি ব্যবহার করুন (সর্বাধিক ব্যবহারের ক্ষেত্রে কমপক্ষে একটি রয়েছে)
  • ফাইলের নামগুলির সাথে কাজ করার সময়, এই জাতীয় ডেটা দিয়ে কাজ করে এমন সমস্ত জিএনইউ সরঞ্জাম সরবরাহ করে নুল বিচ্ছিন্ন আউটপুটটি লাভ করার চেষ্টা করুন
  • পাইপিং করার সময় যত্ন নিন, নিশ্চিত করুন যে দুটি প্রোগ্রামই NUL বিচ্ছেদ বুঝতে পারে
  • আপনি যখনই আহ্বান করছেন xargs, দেখুন আপনি কি এখান থেকে পালাতে পারবেন কিনা find ... -exec; বেশিরভাগ ক্ষেত্রে, আপনি findএকা হয়ে ভাল থাকবেন

আমি মনে করি এগুলি আপাতত আপনাকে যেতে বাধ্য করবে। স্টিল্ড্রাইভার ইতিমধ্যে মন্তব্যে NUL পৃথক ধারণা সরবরাহ করেছে ( printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm), এটি একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করুন।


আপনার উত্তরের জন্য ধন্যবাদ :) আমি মনে করি আপনার কেবল স্ট্যান্ড্রাইভারের মন্তব্যটি উল্লেখ করার পরিবর্তে উদ্ধৃত করা উচিত (যেহেতু মন্তব্যগুলি স্থায়ী নয়)। আমি findপাশাপাশি একটি কটাক্ষপাত করব , পরামর্শের জন্য ধন্যবাদ।
পেড্রো এ

যদিও আমার একটি প্রশ্ন রয়েছে: আমি বুঝতে পারি না "আপনি কীভাবে" নিরাপদ নন "বা" অনিরাপদ "হিসাবে" কল্পনা করেন "আপনার দৃষ্টিভঙ্গি অবশ্যই অনেক ক্ষেত্রে কার্যকরভাবে কাজ করবে না? কারণ "আপনার দৃষ্টিভঙ্গি" আমাকে দূষিত ব্যবহারকারীর কাছে নয়, বোঝায় এবং আপনার পূর্ববর্তী বক্তব্যগুলি আমার পক্ষে, তাই আমি বিভ্রান্ত হয়ে পড়েছি।
পেড্রো এ

@PedroA আপনি আপনি যেমন সমস্ত অক্ষর ছাড়া দুই উল্লিখিত বৈধ :) ভালো লেগেছে আমি বললাম,, আপনি অনেক ক্ষেত্রেই আপনার কল্পনা করতে সক্ষম হওয়া উচিত lsপার্সিং পদ্ধতির যেমন ব্যর্থ হবে তুমি একাউন্টে ফাইলের নাম মধ্যে একটি newline নেবেন?
হিমাইল

ওহ, ফাইলনামে একটি নতুন লাইন ... আমি এটি ভাবিনি। যদি আপনার উত্তরটিতেও এটি যুক্ত করতে আপত্তি না থাকে :) এছাড়াও, জিজ্ঞাসা করে দুঃখিত, তবে কী করে head -z? এটি হাস্যকর মনে হলেও আমার কাছে manনেই বা infoআমার কোরিওএস ধারক লিনাক্সও নেই ... ইন্টারনেটেও খুঁজে পাওয়া যায়নি। আমি পেয়েছিhead: invalid option 'z'
পেড্রো এ

@ পেড্রোএ নিউলাইন কেবল একটি ক্ষেত্রে, আপনি অনুমান করতে পারেন এমন অনেকগুলি রয়েছে । আপনার জিএনইউ দরকার head(জিএনইউ সহ আসে coreutils)। এখানে অনলাইন সংস্করণটি রয়েছে: manpages.ubuntu.com/manpages/xenial/man1/head.1.html
হিমাইল

3

xargs কিছু উদ্ধৃতি সমর্থন করে: একক উদ্ধৃতি, ডাবল কোটস বা ব্যাকস্ল্যাশ যা এটি স্বেচ্ছাসেবী যুক্তিগুলি গ্রহণ করতে দেয় - তবে এমন একটি বাক্য গঠন যা বোর্নের মতো শেলগুলির উদ্ধৃতি বাক্য গঠন থেকে আলাদা।

lsউবুন্টুতে পাওয়া যায় এমন GNU বাস্তবায়নের কোনও উদ্ধৃতি মোড নেই যা xargsইনপুট বিন্যাসের সাথে সামঞ্জস্যপূর্ণ ।

এটি ls --quoting-style=shell-alwaysksh93, ব্যাশ এবং জেডশ শেলের সাথে সিনট্যাক্সের উদ্ধৃতি দিয়ে সামঞ্জস্যপূর্ণ, তবে কেবল যখন আউটপুটটি lsএকই লোকেলের শেল দ্বারা ব্যাখ্যা করা হয় lsযখন এটি আউটপুট দেয়। এছাড়াও, কিছু লোকেল যেমন বিআইজি 5, বিআইজি 5-এইচকেএসসিএস, জিবিকে বা জিবি 18030 ব্যবহার করা এড়ানো উচিত।

সুতরাং এই শেলগুলির সাহায্যে আপনি আসলে এটি করতে পারেন:

typeset -a files
eval "files=($(ls --quoting-style=shell-always))"
xargs -r0a <(printf '%s\0' "${files[@]:0:3}") ...

তবে এর কিছুটা সুবিধা নেই:

files=(*(N))                 # zsh
files=(~(N)*)                # ksh93
shopt -s nullglob; files=(*) # bash

শুধুমাত্র যদি যেখানে এটি দরকারী হয়ে যখন আপনি ব্যবহার করতে চান -tবিকল্প lsর দ্বারা mtime / atime / ctime বা করে ফাইল বাছাই করতে -S/ -V। তবে তারপরেও আপনি এটি ব্যবহার করতে পারেন zsh:

files=(*(Nom))

উদাহরণস্বরূপ ফাইলগুলিকে এমটাইমে বাছাই করার oLজন্য ( -Sএবং এর nজন্য ব্যবহার করুন -V)।

দুটি সর্বাধিক সংশোধিত নিয়মিত ফাইল ব্যতীত সমস্তগুলি সরাতে:

rm -f -- *(D.om[3,-1])

Still এখনও কিছু দৈর্ঘ্যের সীমাবদ্ধতা রয়েছে ( execve()কিছু কিছু নন-জিএনইউ xargsবাস্তবায়ন অনেক কম স্বেচ্ছাসেবী দ্বারা) এবং কিছু নন-জিএনইউ xargsবাস্তবায়নগুলি ইনপুটটিকে শ্বাসরোধ করবে যাতে বৈধ অক্ষর গঠন না করে বাইটের ক্রম থাকে।

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