'Sudo' দিয়ে চালানোর সময় পরিবেশ পরিবর্তনশীল


48

আমার প্রশ্নের উদাহরণ হিসাবে, আমার ~/.bashrcফাইলে এই লাইনগুলি রয়েছে:

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so

যাতে এমপিএল এবং ইন্টেল সংকলকগুলি তৈরি করে নম্পি (পাইথন) যে লাইব্রেরিগুলি চালনার দরকার তা খুঁজে পেতে পারে। এই কর্মপ্রবাহটি সেরা নয়, তবে এটি অন্য গল্প।

আমার প্রশ্ন হ'ল আমি ~/.bashrcযখন 'সুডো' (তবে মূলটি নয়) দিয়ে প্রোগ্রাম চালাচ্ছি তখন আমি কীভাবে নির্বিচারে ভেরিয়েবলগুলি পাস করতে পারি (যেমন তাদের মধ্যে রয়েছে )?

বর্তমানে, আমি চালানো হলে:

sudo python -c "import numpy"

আমি একটি ত্রুটি পেয়েছি:

ImportError: libimf.so: cannot open shared object file: No such file or directory*

যেমন কিছু প্রস্তাবনা sudo -iবা sudo -Eএখানে কিছু পরিবর্তন করবেন না।


সম্পাদনা:

আমি আমার প্রশ্নের উত্তর দিতে পারি না (পর্যাপ্ত পয়েন্ট নয়: ডি) তবে আমি এখানে একটি মন্তব্য করব, এমন একটি আশায় যে sudoফাঁদগুলি নিয়ে ভাবছেন এমন আরও অন্যান্য লিনাক্স নবী আছে ।

[কেবলমাত্র অস্থায়ীভাবে!] এটি আমার পক্ষে কাজ করে ( ~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

উত্তর:


57

এনভায়রনমেন্ট ভেরিয়েবলগুলি sudoENV = VALUE ফর্মের পরে সহজেই পাস করা যায় এবং অনুসরণ কমান্ড দ্বারা তা গ্রহণযোগ্য হবে। এই ব্যবহারে কোনও বিধিনিষেধ আছে কিনা তা আমার জানা নেই, সুতরাং আমার উদাহরণটির সমস্যাগুলি এর সাথে সমাধান করা যেতে পারে:

sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"


তবুও আজ এটি আমার জন্য কাজ করেছে, আমার আরপিআই 3 এর জন্য আমার রাস্পবিয়ান জেসিতে ... প্রায় এক সপ্তাহ পরে আমার মাথা ভাঙার পরে কেন আমার স্ক্রিপ্টটি স্টার্টআপে চলেনি । অনেক ধন্যবাদ!
ডার্কসিগনাস

21

আপনি যে -Eবিকল্পটি উল্লেখ করেছেন তা মনে হয় ঠিক কাজ করে:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy

দুঃখিত, কিন্তু আমি আপনার উত্তর বুঝতে পারি না। আমি উপরে পোস্ট করা দৃশ্যের উদাহরণ প্রদান করতে পারি? অর্থাত চালানো পাবে sudo python -c "import numpy"সঙ্গে LD_LIBRARY_PATHএবং LD_PRELOADউপরের হিসাবে লিখিত সংজ্ঞায়িত?
zetah

2
@zetah: ঠিক আছে, আমি, ভুল কারণ এটি জেনেরিক পরিবর্তনশীল জন্য কাজ করে, কিন্তু dymanic লিঙ্ক নিয়ন্ত্রণ ভেরিয়েবল জন্য নয়, যেমন ধারায় বর্ণিত SECURITY NOTESএর sudoম্যানুয়াল পাতা।
এনজোটিব

এটি তখন সহজ (প্রদত্ত উত্তরে যেমনটি দেওয়া হয়েছে) যদিও man sudoএটি স্পষ্ট করে না, এবং যখন ব্যবহারকারী সেখানে নির্দেশিত রেফারেন্সগুলি অনুসরণ করার চেষ্টা করে, তখন অনুমিত হওয়া ডিক্রিপ্ট করতে সক্ষম হওয়ার জন্য, সমস্ত শাখা অনুসরণ করা নিরুত্সাহিত করা খুব সহজ! অর্থ।
zetah

14

আপনি -Eবর্তমান পরিবেশ সংরক্ষণের জন্য sudo বিকল্পটি ব্যবহার করতে পারেন (যদি আপনার এটি করার অধিকার থাকে)

$ man sudo
 -E, --preserve-env
             Indicates to the security policy that the user wishes to preserve
             their existing environment variables.  The security policy may
             return an error if the user does not have permission to preserve
             the environment.

8

আপনার sudoersদ্বারা sudo visudoসম্ভবত এটি সম্পাদনা করা দরকার আপনি সম্ভবত সুরক্ষা নীতি প্লাগইন সক্ষম করেছেন যা আপনার বিকল্প অনুসারে ওভাররাইড PATHকরে secure_path। সুতরাং তালিকায় পাথ যুক্ত করুন এবং এর env_keepপরিবর্তে আপনি ব্যবহার করতে পারেন , উদাহরণস্বরূপ:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

আপনার PATHওভাররাইড হয়েছে কিনা তা পরীক্ষা করতে নিম্নলিখিত কমান্ডটি চালান:

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

আরও দেখুন: sudo এবং su দিয়ে চলার সময় PATH ভেরিয়েবলগুলি কেন আলাদা হয়? ইউনিক্স এসই তে


+1, তবে env_keepPATH এ কাজ করে না (যে অর্থে sudoএখনও secure_pathকমান্ডটি সন্ধান করার সময় ব্যবহার করে)
জান্না

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