Sudo এবং su দিয়ে চলার সময় PATH ভেরিয়েবলগুলি কেন আলাদা হয়?


39

আমার ফেডোরা ভিএম-এ, যখন আমি আমার অ্যাকাউন্টে চলেছি তখন /usr/local/binআমার পথে রয়েছে:

[justin@justin-fedora12 ~]$ env | grep PATH
 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

এবং একইভাবে চলমান যখন su:

[justin@justin-fedora12 ~]$ su -
Password: 
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

যাইহোক, মাধ্যমে চলাকালীন sudo, এই ডিরেক্টরিটি পথে নেই:

[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin

রাস্তা দিয়ে চলার সময় কেন পথটি আলাদা হবে sudo?



উত্তর:


37

একবার দেখুন /etc/sudoers। ফেডোরার ডিফল্ট ফাইলটিতে (পাশাপাশি আরএইচএল, এবং উবুন্টু এবং অনুরূপ) এই লাইনটি অন্তর্ভুক্ত করে:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

যা সুডোর অধীনে বাইনারিগুলি চালানোর সময় আপনার পথটি পরিষ্কার কিনা তা নিশ্চিত করে। এটি এই প্রশ্নে উল্লিখিত কিছু উদ্বেগ থেকে রক্ষা করতে সহায়তা করে । এছাড়া সুবিধাজনক যদি তুমি না /sbinএবং /usr/sbinআপনার নিজের পথে।


আহ, আমি আমার ফাইলে এটি দেখতে পাচ্ছি। সুতরাং, না যে আমি চাই, কিন্তু যদি আমি যোগ /usr/local/binএই ডিরেক্টিভের করতে তাহলে আমি চাই আমার পথ এটি দেখতে যখন মাধ্যমে চলমান sudo, ডান?
জাস্টিন ইথিয়ার

আমি কেবল এটি চেষ্টা করেছিলাম এবং এখন দেখছি /usr/local/bin। এটি ব্যাখ্যা করার জন্য আপনাকে অনেক ধন্যবাদ!
জাস্টিন এথিয়র 16

স্ক্রিপ্ট এবং বাইনারিগুলির জন্য আপনার ব্যবহারকারীর পাথ যুক্ত করার বিষয়ে কীভাবে আপনার যখন অবশ্যই sudoকোনও লিপি লিখতে হবে না যখন উদাহরণস্বরূপ আপনার একটি স্ক্রিপ্ট ~/bin(অথবা আপনি যে কোনও পথই ব্যবহার করেন)? আমি কেবল পরিবর্তন করেছি - এটি কাজ করে, কেবল ভেবেছিল এটির কোনও ফ্লিপ দিক থাকতে পারে?
ইমানুয়েল বার্গ

@ মেট্টেম হ্যাঁ, উবুন্টুও যেমন ভিএম-এর সাথে খেলতে গিয়ে উবুন্টু ভিভিডে আমি এই বিষয়টি নিয়ে এসেছি। ডেবিয়ানদের জন্যও একই ।
কেনারব

9

কমান্ডটি su -মূল ব্যবহারকারীদের প্রোফাইল কার্যকর করবে এবং ব্যবহারকারীর পরিবেশ সহ পাথ ইত্যাদি গ্রহণ করবে sudoনা।

আপনি যদি এইরকম sudoআচরণ করতে চান su -তবে সেই বিকল্পটি ব্যবহার করুন sudo -i [commandযা ব্যবহারকারীর প্রোফাইল কার্যকর করবে

আপনি যদি এমন su -আচরণ করতে চান sudoতবে হাইফেন ব্যবহার করবেন না - কেবল ব্যবহার করুনsu [command]


2

আপনি না পরীক্ষা করতে কেন চলমান দ্বারা (এটি আলাদা) sudo sudo -V

উদাহরণস্বরূপ লিনাক্স রান:

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

নোট: উপর MacOS / বাসদ, শুধু সঞ্চালন করুন: sudo sudo -V

কিছু লিনাক্স বিতরণে ডিফল্ট সুরক্ষা নীতি প্লাগইনের কারণে উপরের তালিকাটি সীমাবদ্ধ।


এটি আরও ব্যাখ্যা করা হয়েছে man sudoers:

তাহলে secure_pathবিকল্প সেট করা থাকে, এর মান ব্যবহার করা হবে PATHএনভায়রনমেন্ট ভেরিয়েবল।

secure_path- প্রতিটি কমান্ডের জন্য ব্যবহৃত পাথ sudo থেকে চালিত হয়। যদি আপনি সুডো চলমান লোকদের বিশ্বাসযোগ্য PATHপরিবেশের পরিবর্তনশীল রাখতে বিশ্বাস না করেন তবে আপনি এটি ব্যবহার করতে চাইতে পারেন।

আরেকটি ব্যবহার হ'ল যদি আপনি "রুট পাথ" "ব্যবহারকারী পথ" থেকে পৃথক থাকতে চান। exempt_groupবিকল্প দ্বারা নির্দিষ্ট করা গ্রুপের ব্যবহারকারীরা দ্বারা প্রভাবিত হয় না secure_path। এই বিকল্পটি ডিফল্টরূপে সেট করা নেই।

যদি এটি হয় তবে আপনি sudo visudoকনফিগারেশন ফাইলটি চালনা এবং সম্পাদনা করে এবং আপনার secure_path(পৃথকভাবে অতিরিক্ত পাথ যোগ করার মাধ্যমে :) পরিবর্তন করতে বা আপনার ব্যবহারকারীকে এতে যুক্ত করতে exempt_groupপারেন (যাতে আপনি secure_pathবিকল্পগুলির দ্বারা প্রভাবিত হবেন না )।

বা ব্যবহারকারীর PATHঅস্থায়ী পাস করার জন্য , আপনি চালাতে পারেন:

sudo env PATH="$PATH" my_command

এবং আপনি এটি দ্বারা পরীক্ষা করতে পারেন:

sudo env PATH="$PATH" env | grep ^PATH

আরও দেখুন: সংরক্ষণ কীভাবে করবেন ?sudo$PATH


অন্যান্য কারণে পরিবেশটি আলাদা হতে পারে sudo, কারণ env_resetআপনার sudoersফাইলে আপনি বিকল্প সক্ষম করতে পারেন । এটি একটি নতুন, সর্বনিম্ন পরিবেশের সাথে আদেশগুলি সম্পাদন করে।

সুতরাং আপনি আপনার ব্যবহারকারীর পরিবেশ পরিবর্তনশীলগুলি সংরক্ষণ করতে env_keepবিকল্পটি ( সুরক্ষা কারণে প্রস্তাবিত নয় ) ব্যবহার করতে পারেন :

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"

1

বেশিরভাগ লিনাক্সে, আপনি প্যাকেজ পরিচালনার মাধ্যমে প্রোগ্রামগুলি ইনস্টল করেন এবং নিয়মিতভাবে আপডেট পান। আপনি যদি প্যাকেজ ব্যবস্থাপনার বিপক্ষে কিছু ইনস্টল করেন তবে এটি / usr / স্থানীয় / বিনে ইনস্টল করা হবে (উদাহরণস্বরূপ, বা ... / sbin, বা / opt) এবং নিয়মিত আপডেট পাবেন না।

আমার ধারণা তাই প্রোগ্রামগুলি নিরাপদ হিসাবে বিবেচিত হয় না, এবং ডিফল্টরূপে PATH শিকড়ের মধ্যে রাখে না।


+1 - শীতল, আমি ভাবছিলাম যে কেন এটি পথে নেই, এবং এটি উপলব্ধি করে। এটির মূল্যের জন্য, আমি এটির সাথে চারপাশে খেলতে স্ক্র্যাচ থেকে নোড.জেএস তৈরি করছিলাম, সুতরাং এটি কেন সেখানে রাখা sudoহত এবং কেন এই ডিরেক্টরিটি ডিফল্টরূপে বাদ দেবে তা বোঝায় ।
জাস্টিন ইথিয়র 16

@ জাস্টিন এথিয়র: বিষয় বন্ধ, তবে দেখুন bugzilla.redhat.com/show_bug.cgi?id=634911
ম্যাটডেম

1

আমি এটি কেবল নিজের জন্য চেষ্টা করেছি এবং আপনি যে আচরণটি দেখছেন তা আমি দেখতে পাই নি - আমার পথটি একই ছিল, তাই আপনার সুডোর কনফিগারেশনটি আলাদা maybe যদি আপনি যাচাই করেন তবে man sudoersদেখতে পাবেন এমন একটি বিকল্প রয়েছে secure_pathযা পুনরায় সেট করে PATH- এটি মনে হয় যে এই বিকল্পটি সক্ষম হয়ে থাকতে পারে।


মজাদার. এটি ফেডোরার 12 তে, এটির মূল্য কী ...
জাস্টিন ইথিয়র

1

কারণ যখন আপনি ব্যবহার sudo bash, bashলগ-ইন শেল হিসাবে কাজ না করে না। আবার চেষ্টা করুন sudo bash -lএবং আপনার একই ফলাফল দেখতে হবে su -

যদি সেটা সঠিক হয়, তাহলে পার্থক্য PATHকনফিগারেশন ফাইলের মধ্যে মিথ্যা: /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile(যাতে) একটি লগ-ইন শেল জন্য, মৃত্যুদন্ড কার্যকর করা হয় যখন ~/.bashrcএকটি অ-লগইন ইন্টারেক্টিভ শেল জন্য মৃত্যুদন্ড কার্যকর করা হয়।


0

পুরানো প্রশ্ন, আমি জানি, তবে আমি এখনই এখানে হোঁচট খেয়েছি কারণ আমি এই সঠিক সমস্যাটি তদন্ত করছি।

কোনও কারণে /usr/local/binকেবল পথের মধ্যে দিয়ে যখন মূল হয়ে ওঠে sudo su -sudo -iএটি ব্যবহার করার সময় সেখানে ছিল না। অবশ্যই আমি এখন জানি আমি এটি / etc / sudoers এ যুক্ত করতে পারি, তবে এটি কেন আগে থেকেই রয়েছে তা এখনও ব্যাখ্যা করতে পারেনি su -। পাঠের এই অংশটি কোথা থেকে এসেছে?

অনেক গ্রিপিং এবং অনুসন্ধানের পরে আমি উত্তরটি পেয়েছি:

'/ Usr / স্থানীয় / বিন' ধারণকারী ডিফল্ট পাথটি আসলে su (1) এ হার্ডকোডযুক্ত।

সুতরাং কোনও পাম কনফিগারেশন, প্রোফাইল, বাশার্ক বা কোনও কিছুই এই উপাদানটি নির্বাচন করে যুক্ত করার জন্য দায়ী ছিল না। suদায়িত্ব নেওয়ার সময় এটি সর্বদা সেখানে ছিল । এবং যেহেতু sudoএকেবারেই অনুরোধ করে না suতবে এটি নিজস্ব কনফিগারেশন ব্যবহার করে, এটি পরে অনুপস্থিত ছিলsudo -i

আমি এটি RHEL6 এবং RHEL7 এ সত্য বলে মনে করেছি। আমি অন্য কোনও সংস্করণ বা বিতরণ পরীক্ষা করিনি।


আমি এটি কীভাবে যাচাই করেছিলাম তা আমাকে জিজ্ঞাসা করবেন না ... ঠিক আছে, আপনি যদি জেদ করেন: আমি বাইনারিটির একটি অনুলিপি সম্পাদনা করেছি su, /usr/local/binঅন্য কোনও কিছুতে পরিবর্তিত হয়ে কপিটি অনুরোধ করেছি। আমার পাঠে এখন পরিবর্তিত স্ট্রিং রয়েছে ... ভাল বাচ্চা এবং অলস অ্যাক্সেসডমিন অবশ্যই অবশ্যই উত্সটি ডাউনলোড করে সেখানে পরীক্ষা করে দেখুন। ;-)
অস্কার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.