আউটপুট পুনর্নির্দেশের সময় নির্দিষ্ট ফাইল অনুমতিগুলি কীভাবে সেট করবেন?


12

এটি সম্ভবত একটি সদৃশ, তবে আমার সমস্ত অনুসন্ধানগুলি ত্রুটি অনুমতি অস্বীকারের বিষয়ে প্রশ্ন উত্থাপন করছে।

আমি বাশ শেলের কমান্ড চালাচ্ছি। আমি আউটপুটটি এমন কোনও ফাইলের সাথে যুক্ত করতে পুনঃনির্দেশিত করতে চাই যা সম্ভবত প্রথম দৌড়ে নেই। যদি আউটপুট পুনঃনির্দেশ এই ফাইলটি তৈরি করতে হয় তবে আমি নির্দিষ্ট ফাইল অনুমতি মোড সেট করতে চাই। একটি আদেশ দিয়ে এটি করার উপায় আছে?

উদাহরণস্বরূপ, আমি চেষ্টা করতে পারেন

foo >> /tmp/foo.log 0644

0644অনুমতিগুলি যেখানে আমি foo.logশেষ করতে চাই are আমি বেশিরভাগ কমান্ডগুলি ব্যাশের সাথে পরীক্ষা করে দেখেছি 0644যার অতিরিক্ত যুক্তি হিসাবে ব্যাখ্যা করা যায় foo

আমি অনুভূতি পেয়েছি যে chmodএটি লেখার আগে বা পরে অনুমতিগুলিতে দ্বিতীয় কমান্ড নিতে চলেছে ।

আমি জিএনইউ বাশ 4.2.25 এবং উবুন্টু 12.04 ব্যবহার করছি, যদি এতে কোনও পার্থক্য আসে - সাধারণ উত্তরগুলি পছন্দ করা হয়।

উত্তর:


5

আমি জানি যতদূর পাইপিং করার সময় এটি করার কোনও উপায় নেই, একটি সাধারণ স্ক্রিপ্টই হতে পারে সেরা সমাধান।

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi

থ্যাঙ্কস স্লোকি, সেটাই ছিল আমার কুঁচকী। আমাদের আলোকিত করার জন্য কোনও গুরুকে আকৃষ্ট করার আশায় আমি এটি কয়েক দিন খোলা রেখে যাচ্ছি।
প্যাট্রিক এম

3
এই পদ্ধতির সমস্যাটি হ'ল ফাইলটিতে অনুমতিগুলি ভুল হলে এটি একটি স্বল্প সময়ের উইন্ডো তৈরি করে। লক্ষ্যটি সংবেদনশীল ডেটা রক্ষা করা হলে আমি এটি ব্যবহার করব না।
পেশাদাররা

1
এই উত্তরটি যতদূর যায় কার্যকরভাবে কাজ করে তবে @ প্রসকি ঠিক বলেছেন: umaskউত্তরগুলি আরও ভাল, এবং তাদের একটি গ্রহণ করা উচিত।
স্কট

15

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি আমার দুটি সেন্ট যুক্ত করতে চেয়েছিলাম।

আমি একই ধারণা পেয়েছিলাম এবং বোলসসিআর এর অনুরূপ একটি সমাধান নিয়ে এসেছি । তার সমাধানের সাথে সমস্যাটি হ'ল আমার আদেশটি ( foo) কাজ না করে যদি আমি এটি চালানোর আগে উমাস্কটি পরিবর্তন করি তবে সমস্যাটিই আমার গ্রহণ করা:

foo | ( umask 0033; cat >> /tmp/foo.log; )

এখানে umaskকেবল foo.logসাব-শেলের পুনর্নির্দেশকে প্রভাবিত করে । বাকী সমস্ত কিছুই ক্ষতিগ্রস্থ থেকে যায়।

কিছুটা বিশৃঙ্খল, তবে এটি কার্যকর।


খুব সুন্দর এবং কার্যকর :) স্ট্যাডআউট পুনর্নির্দেশের শীর্ষে স্ট্যাডার পুনঃনির্দেশের সাথে কেবল ব্যবহার করা যাবে না।
ওরসিরিস ডি জং

5

সত্য স্ক্রিপ্টিং ছাড়া আপনি কিছুটা চেইন করতে পারেন:

touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log

স্লোকি-র জবাবের সাথে কার্যকরভাবে মিল , তবে একটি ওয়ান-লাইনারে সংশ্লেষিত।

কেবলমাত্র আমি যা ভাবতে পারি তা হ'ল উমাস্কের সাথে ঝোঁক। সাবস্কেলে এটি করা ভাল তাই এটি বর্তমান পরিবেশকে দূষিত করে না:

(umask 0033 && foo >> /tmp/foo.log)

যদিও দুটি বিষয়।

  1. উমাস্ক সিস্কলে উল্লিখিত স্তরের উপরের অনুমতিগুলি বাড়িয়ে তুলতে পারে না creat()(0666 প্রদর্শিত হবে যা ব্যাশ ব্যবহার করে)।
  2. এটি কোনও বিদ্যমান ফাইলে অনুমতিগুলি পরিবর্তন করবে না (কারণ এটি umaskকেবল ফাইল তৈরিতে প্রযোজ্য )।

আমি এখনও নিক্সের পক্ষে যথেষ্ট নতুন যে উমাস্ক আমার কাছে এখনও কিছুটা যাদু। টিপটির জন্য ধন্যবাদ, আমি এটি পড়তে ভুলবেন না।
প্যাট্রিক এম

হুম… তবুও ফাইলটি খুলতে এবং পরে এর বিষয়বস্তু পড়া থেকে একটি অনিবদ্ধ প্রক্রিয়া মঞ্জুরি দেয়।
ফিউমুরমেল

(1) একটি আকর্ষণীয়, দরকারী ব্যবহার সন্ধানের জন্য অভিনন্দন cat। (যদিও এটি অকেজো ব্যবহারের মানক প্যাটার্নটি অনুসরণ করে না  cat)) (২) আমি ধারণা করছি যে আপনি যখন ফাইলগুলি তৈরির সময় বাশ ডিফল্ট মোডে 0666 মোডে বলতে চেয়েছিলেন  এবং তাই আমি আপনার উত্তরটি এটির জন্য সম্পাদনা করেছি। (দেখুন এই ,  এই   ... (Cont'd)
স্কট

(অবিরত) ... এবং  এটি ।) এবং প্রশ্নটি বিশেষত মোড 0644 উল্লেখ করেছে So সুতরাং umask22, 23 বা 32 এর মানটিও কাজ করবে এই প্রসঙ্গে (আপনাকে শীর্ষস্থানীয় শূন্য (গুলি) ব্যবহার করার দরকার নেই; কখন? মোড এবং  umaskমানগুলি সংখ্যায় নির্দিষ্ট করা হয়, এগুলি সর্বদা অষ্টাল হিসাবে ব্যাখ্যা করা হয়)।  22 সাধারণভাবে ব্যবহৃত হয়, প্রচলিতভাবে ব্যবহৃত হয়।
স্কট

@ ফিউমারুর্মেল: তাহলে কী? প্রশ্ন স্পষ্টভাবে মোড 644. আমরা অনুমান করা ওপি আছে আহ্বান জানে যে 644 উপায়ে বিশ্ব পাঠযোগ্য এবং অভিপ্রেত তার তথ্য সর্বজনীন করা।
স্কট

1

যখন পুনঃনির্দেশটি ভুল অনুমতি সেট করে, যেমন:

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ ls -l capture.*
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDERR
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDOUT
$ cat capture.*
215 STDERR
216 STDERR
215 STDOUT
216 STDOUT

আমি বিশ্বাস করি যে আপনি জয়নোমার্ফের মতো কিছু ব্যবহার করতে পারেন, এবং বাশ প্রক্রিয়া প্রতিস্থাপন ব্যবহার করার জন্য ওড়সিরিস ডি জংয়ের স্ট্যান্ডার উদ্বেগকে কিছুটা সংশোধন করে সমাধান করতে পারেন ।

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ ls -l capture.*
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDERR
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDOUT
$ cat capture.*
233 STDERR text
238 STDERR text
233 STDOUT text
238 STDOUT text

স্বাভাবিকভাবেই, umask 0077মোডটি পেতে ব্যবহার করুন 600 এবং অন্য কোনও ব্যবহারকারীর সামগ্রীগুলি দেখতে নিষেধ করুন।


0

umaskপ্রক্রিয়া প্রতিস্থাপনের মতো আপনি যদি কোনও স্ক্রিপ্টে পুনর্নির্দেশ করতে চান এবং installআপনি এক্সিকিউট বিট সেট করতে পারেন:

install -m 755 <(echo commands go here) newscript

<()আউটপুটটিকে একটি অস্থায়ী ফাইলের মধ্যে রাখে, প্রক্রিয়া-প্রতিস্থাপন দেখুন

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