একটি do sudo Find` কমান্ডে, আমি কীভাবে নিশ্চিত করব যে user -exec` কমান্ডটি সাধারণ ব্যবহারকারীর মতো চলছে?


10

আমি নিম্নলিখিত কমান্ডটি এমনভাবে কাজ করার চেষ্টা করছি যাতে process_pathsস্ক্রিপ্টটি উন্নত সুবিধাগুলির অধীনে না চলে। এই কাজ করতে একটি উপায় আছে কি?

sudo find /path/ -exec process_paths '{}' \+

এখানে /path/এমন কিছু ফাইল রয়েছে যা সাধারণ ব্যবহারকারীর জন্য কোনও পঠনের অনুমতি নেই। স্ক্রিপ্টটির process_pathsকেবল পথ দরকার।


... -exec sudo -u user process_paths {} \+
সাটস কাতসুরা

@ স্যাটোক্যাটসুর কখনও কখনও এটির সাথে ব্যর্থ হয় sudo: unable to execute /usr/bin/perl: Argument list too long: /
পিআই_কে

1
হ্যাঁ, অনুসন্ধানেরSUDO_COMMAND পরিবর্তনশীল সম্পর্কে নোটটি দেখুন । । [^।] * -প্রকার এফ-প্রিন্ট 0 | xargs -0 sudo chmod 664; কাজ করে না
Stéphane Chazelas

2
যদি আপনি চান যে -execকমান্ডগুলি আপনার ব্যবহারকারীরূপে চাওয়া হয়, তবে আপনি কেন প্রথমে findব্যবহার করছেন sudo?
মার্চেল

2
@ মার্কসেল আমি মনে করি প্রশ্নের উত্তরটি আপনার জবাব দিয়েছে।
আরে

উত্তর:


16

যেসব সিস্টেমে এটি সমর্থন করে (জিএনইউ এবং বেশ কয়েকটি অন্যান্য), আপনি এটি করতে পারেন:

sudo find /path/ -print0 | xargs -r0 process_paths

xargsএর অধীনে চালিত হয় না sudo, সুতরাং এটির মূল ইউড / গিডগুলি এবং মূল পরিবেশটিও রয়েছে (বৃহত্তর অর্থে), পরিবর্তিত নয় sudo

process_pathsস্টাডিনটি পরিবর্তিত হওয়া সত্ত্বেও ( xargsপ্রয়োগের উপর নির্ভর করে , এটি চালু রয়েছে / থেকে /dev/nullভাগ করে pipeনেওয়া হয় sudo) find

এটি এড়াতে (জিএনইউ xargsএবং শেলগুলির মতো ksh, zshবা bashসেই সমর্থন প্রক্রিয়া প্রতিস্থাপনের সাহায্যে), আপনি এটি করতে পারেন:

xargs -r0a <(sudo find /path/ -print0) process_paths

সহ zsh:

sudo zsh -c '
   files=(/path/**/*(D))
   USERNAME=$SUDO_USER
   autoload zargs
   zargs $files -- process_paths'

ইন zsh, এর একটি ব্যবহারকারীর নাম বরাদ্দ $USERNAMEবিশেষ পরিবর্তনশীল মত ব্যবহারকারী ডাটাবেসের মধ্যে সংশ্লিষ্ট ব্যবহারকারী যে uids, gids সেট করে sudo -u "$SUDO_USER"করতে হবে।

আপনি করতে পারেন:

 sudo sh -c '
   exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'

কিন্তু কারণ sudoএকটি পাস $SUDO_COMMANDথেকে এনভায়রনমেন্ট ভেরিয়েবল (যা ব্যবধান সহ আর্গুমেন্ট সংযুক্তকরণের রয়েছে) process_paths, আপ দুইবার প্রেরণ করা হচ্ছে ফাইল প্রান্ত তালিকায় process_pathsযা args সর্বাধিক মাপ সীমা মানে + + env সম্ভবত যদি সেখানে একটি বৃহৎ পৌঁছে যেতে হয় ফাইল সংখ্যা।

বেশিরভাগ suবাস্তবায়নের সাথে সাথে আপনার করা উচিত:

 sudo sh -c '
   exec find /path/ -exec su "$SUDO_USER" -c '\''
     exec "$0" "$@"'\'' process_paths {} +'

যদিও suএকই সমস্যা নেই।


1

আপনি ব্যবহার করতে পারেন sudo:

sudo find <directory> -exec sudo -u <normal_user> <command> {} \;

তবে একটি মন্তব্যে যেমন বলা হয়েছে, apparent for সুডোর জন্য খুব দীর্ঘ হয় তবে এটি স্পষ্টতই ব্যর্থ হতে পারে।

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