سؤال لماذا لا يعمل sudo cd / var / named`؟ [مكرر]


هذا السؤال لديه بالفعل إجابة هنا:

أريد أن cd إلى /var/named ولكنه يعطيني إذنًا ينفي وجود خطأ ، وعندما أريد استخدامه sudo للقيام بذلك أنا غير مسموح به. ما هو السبب التقني لهذا ، وهل من الممكن القيام بذلك بطريقة أخرى؟


148
2018-05-06 19:02


الأصل




الأجوبة:


السبب الذي يجعلك لا تستطيع فعل هذا بسيط وسهل

1

cd ليس برنامجًا بل أمرًا مدمجًا و sudo ينطبق فقط على البرامج.

sudo foo يعني تشغيل البرنامج foo كجذر

sudo cd /path عائدات

sudo: cd: command not found

لان cd ليس برنامج.

2

إذا كان من الممكن استخدامها سودو إلى cd إلى دليل محمي ثم تشغيل الأمر sudo cd /var/named قد تكون في هذا الدليل كمستخدم عادي ولكن لا يُسمح للمستخدمين العاديين بالدخول إلى هذا الدليل.

هذا غير ممكن.

الحل:

يمكنك استخدام sudo -i لترفع نفسك إلى المستخدم الفائق. فمثلا:

sudo -i
cd /var/named 

لقد قمت الآن بتسجيل الدخول كجذر ويمكن استخدام أي الأوامر التي تريدها. عند الانتهاء من النوع exit وستعود إلى تسجيل الدخول كمستخدم عادي.


207
2018-05-06 19:30



فنيا cd هو على حد سواء مدمج وأمر خارجي. unix.stackexchange.com/questions/50058/... - kojiro
kojiro Ubuntu لا يقوم بذلك؛ على الأقل في تثبيت نظيف. يملك /usr/bin/cd فقط بنيت في - Warren Hill
فيما يتعلق بالنقطة 2: إذا كنت sudo -i (أو sudo su) ثم cd /var/named وثم su normaluser... هل تستطيع فعل ذلك؟ - Alvin Wong
AlvinWong لماذا لا نحاول ذلك ومعرفة؟ فقط اختبار إذا كنت sudo -i ثم cd الى دليل يجب ان لا تكون في su normal_user ثم pwd يظهر أنك في الدليل المحمي ولكن ls لا يعمل ls: cannot open directory.: permission denied - Warren Hill
عملت الحل. - Nino Škopac


ذلك بسبب cd ليست قابلة للتنفيذ ، إنها وظيفة shell لتغيير الدليل.

اذا ركضت:

type cd

سوف تحصل على:

قرص هو وظيفة شل

يمكنك استخدام sudo -s لفتح قذيفة تفاعلية وبعد ذلك cd إلى الدليل المطلوب:

sudo -s
cd /var/named

للعودة إلى صدفة الخاص بك العادي ضرب ببساطة السيطرة+د.


25
2018-05-06 19:29





من الجدير أيضًا تذكر ذلك ، cdحالة كصندوق مدمج أو ثنائي خارجي بالرغم من ذلك ، sudo يعمل عن طريق وضع عملية جديدة لتشغيل الأمر المحدد.

لماذا هذا مهم؟ لأن تدفق التنفيذ الأساسي من sudo يصبح شيئًا مشابهًا جدًا لهذا:

  1. تفرخ القشرة من عملية فرعية لتشغيل sudo مع المعلمات المحددة
  2. sudo يصادق المستخدم ويؤكد حقهم في تنفيذ الأمر المحدد
  3. sudo spawns off a subprocess لتنفيذ الأمر المحدد
  4. sudo ينتظر للفرع الفرعي spawned الخروج في الخطوة 3 للخروج
  5. مخارج sudo ، تعود إلى الصدفة
  6. إنهاء subprocess spawed في الخطوة 1 بإرجاع المستخدم إلى موجه shell

(هذه قد يكون فنيا غير صحيح بعض الشيء هناك استدعاء نظام في الواقع يستبدل عملية التشغيل مع واحدة جديدة (هذه هي مكتبة C execve()). ومع ذلك ، لأغراض هذا التفسير ، فإن الاثنين متساويين.)

يصبح هذا مهمًا عندما تعتبر أن دليل العمل الحالي هو خاصية لكل عملية وهو الموروثة ولكن لم يتم الترويج لها. لذا ، إذا كانت العملية A تنتج من عملية جديدة B ، فحينئذٍ تبدأ العملية B مع نفس دليل العمل الذي كانت معالجة A به. (وهذا هو السبب في أن شيئًا عاديًا مثل ls ./يفعل ما تتوقعه.) ولكن إذا تغيرت العملية ب انها دليل العمل ، ثم ما لم تخرج العملية A عن طريقها ، تبحث A عن هذا التغيير تمامًا. (وهذا ، بدوره ، هو لماذا إذا قمت بتشغيل شيء من هذا القبيل find / وإجهاضها في منتصف الطريق ، لا ينتهي بك الأمر في بعض المواقع التي تبدو عشوائية في نظام الملفات لمجرد العثور على ما تبحث عنه هناك في اللحظة التي تم إحباط فيها.)

لذلك حتى لو sudo cd /somewhere فعلت بالضبط ما تقول على القصدير ، في ذلك الوقت sudo يتم إرجاعك إلى المكان الذي بدأت فيه. ومن ثم بشكل فعّال من وجهة نظر المستخدم ، يصبح الأمر a-op. حقيقة ان cd، في حين كان ينفذ ، ودعا chdir() وظيفة مكتبة النظام لضبط دليل عمل جديد ، لا يساعدك ، المستخدم.

مثل وارن هيل أشار، الحل المناسب (أنا في الواقع لن يطلق عليه الحل) هو استخدام sudo -i الذي يسقطك إلى وعاء الجذر حيث يمكنك التنقل حول نظام الملفات بحرية وتنفيذ الأوامر التي تريدها. هل لاحظ أن ذلك عند الخروج من هذه القذيفة ، أنت ما يزال جلبت إلى المكان الذي بدأت فيه في التسلسل الهرمي للدليل لنفس السبب بالضبط كما وصفت أعلاه.


16
2018-05-07 07:27



كان هذا التفسير لطيفًا وقليلاً عن "So even if" sudo cd /somewhere فعلت بالضبط ما تقول على القصدير ، في ذلك الوقت sudo يتم إرجاعك إلى المكان الذي بدأت فيه. "كان مفيدًا - harperville


جميع الإجابات المذكورة أعلاه صحيحة ؛ هنا على الرغم من أن الحل

sudo sh -c "cd restricted-dir; some_command"

12
2017-11-07 06:00



يعجبني هذا الحل بشكل أفضل لأنك تقوم بأشياءك الجذرية ، ثم تعود على الفور إلى وضع غير الجذر حتى لا تنسى وتحدث أخطاء كبيرة. - GlenPeterson


يمكنك أيضًا تغيير الإذن مؤقتًا. chmod 0775 path. تأكد من إعادتها إذا لزم الأمر.


3
2017-11-07 17:14



مرحبًا بك في اسأل أوبونتو! أوصي تصحيحهذه الإجابة لتوسيعها مع تفاصيل محددة حول كيفية القيام بذلك. (أنظر أيضا كيف أكتب إجابة جيدة؟ للحصول على نصائح عامة حول أنواع الإجابات التي تعتبر الأكثر قيمة على AskUbuntu.) - David Foerster
ليس لدي الحق في تشغيل قذيفة تفاعلية مع sudo ، لذلك هذا هو الطريق الصحيح للذهاب .. - Guillaume