Sudo ব্যবহার করার সময় পরিবেশের পরিবর্তনশীল কীভাবে রাখবেন


425

আমি যখন সুডোর সাথে কোনও কমান্ড ব্যবহার করি তখন পরিবেশের ভেরিয়েবলগুলি থাকে না। উদাহরণস্বরূপ HTTP_PROXY সেট করার পরে কমান্ডটি wgetছাড়াই ঠিক কাজ করে sudo। তবে আমি যদি sudo wgetএটি টাইপ করি তবে এটি প্রক্সি সেটিংসটিকে বাইপাস করতে পারে না।



উত্তর:


475

প্রথম আপনার প্রয়োজন export HTTP_PROXY। দ্বিতীয়ত, আপনাকে man sudoমনোযোগ সহকারে পড়তে হবে এবং -Eপতাকাটিতে মনোযোগ দিন । এইটা কাজ করে:

$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'

ম্যান পৃষ্ঠা থেকে উদ্ধৃতিটি এখানে:

-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.

1
দারুণ একমাত্র সমস্যা যা কিছু কনফিগার ফাইলকে পরিবর্তন করে যেমন-ই পাস করার জন্য খিলানটির জন্য প্যাকম্যান
আহমেদ আসওয়ানি

7
উইজেটের জন্য -E (পরিবেশ সংরক্ষণ) করতে, আপনাকে sudo নিয়মে SETENV ট্যাগটি নির্দিষ্ট করতে হবে যা উইজেট চালানোর অনুমতি দেয় - উদাহরণ: <ব্যবহারকারীর নাম> সমস্ত = (মূল) NOPASSWD: SETENV: <উইজেটের পথে>
জন বোয়ার্স

65
চলকটি PATH বা পাইথনপথ হলে এই "-E" কাজ করে না।
এপোর্ক

কোনও LC_*ভেরিয়েবলের সাথেও কাজ করে না । সুতরাং কেবল export LOL_FOO=$LC_FOOএবং LOL_FOOপরিবর্তে ব্যবহার করুন।
ভাগ্যডায়োনাল্ড

9
এটি ফাইলের PATHমধ্যে একটি উপাদান যুক্ত করার সহজ ক্ষেত্রে কাজ করে নি .bashrc- বলুন export PATH=myPath:$PATH,। যদি আমি টাইপ করি sudo -E bash -c 'echo $PATH'তবে PATHমাইপ্যাথটি সম্ভবত নেই কারণ কল করার আগেই এর sudoস্থানীয় মানটি ইতিমধ্যে অক্ষম করে । বরং, আমি নিচে উত্তর পাওয়া stackoverflow.com/a/33183620/5459638 কার্যকর হলো,PATHbashsudo PATH=$PATH command
XavierStuvw

310

কৌশলটি হ'ল কমান্ডের sudoersমাধ্যমে ফাইলের সাথে পরিবেশের পরিবর্তনগুলি যুক্ত করা sudo visudoএবং এই লাইনগুলি যুক্ত করা:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

থেকে নেওয়া ArchLinux উইকি

উবুন্টু 14 এর জন্য, আপনাকে পৃথক রেখায় নির্দিষ্ট করতে হবে কারণ এটি বহু-ভেরিয়েবল লাইনের জন্য ত্রুটিগুলি ফিরিয়ে দেয়:

Defaults  env_keep += "http_proxy"
Defaults  env_keep += "https_proxy"
Defaults  env_keep += "HTTP_PROXY"
Defaults  env_keep += "HTTPS_PROXY"

11
তথ্য ফাঁস এবং সুরক্ষা গর্তগুলি এড়ানোর জন্য এটি যুক্তিযুক্তভাবে সেরা বিকল্প। sudo -Eএক-অফের জন্য একই প্রভাব পাওয়ার জন্য
অ্যাডহকের

আমি এমন একটি প্রক্রিয়াটির সমস্যার মুখোমুখি হয়েছি যাকে সুডো (ঝুবিল্ড) বলা হয় এবং আমি এটি ই-ফ্ল্যাগটি সুডোতে পাস করতে বলতে পারি না, সুতরাং এটি আমার সমাধান।
jgomo3

60
লক্ষ্য করুন যে আপনার কখনইetc/sudoers সরাসরি সম্পাদনা করা উচিত নয় । পরিবর্তে, visudoকমান্ডটি ব্যবহার করুন , যা sudoersফাইলটি ওভাররাইট করার আগে সিনেট্যাক্স আপনার সম্পাদনাগুলি পরীক্ষা করে । এইভাবে, সম্পাদনার সময় আপনি যদি কোনও ভুল করেন তবে আপনি নিজেকে লক করেন না।
হেনিং

1
বড় হাতের এনভ ভার্স ব্যবহার বিবেচনা করুন। আমার ক্ষেত্রে HTTP_PROXY এবং HTTPS_PROXY এর ব্যবহারটি কৌশলটি করেছে।
পাবো

2
ছোট অভিজ্ঞতা আমার অভিজ্ঞতা থেকে ভাল কারণ এটি উইজেট এবং কার্ল উভয় ক্ষেত্রেই কাজ করে।
মিরোস্লাভ মোসেক

57

স্বতন্ত্র ভেরিয়েবলের জন্য আপনি একটি অফ ভিত্তিতে উপলব্ধ করতে চান আপনি এটি কমান্ডের অংশ করতে পারেন।

sudo http_proxy=$http_proxy wget "http://stackoverflow.com"

আমি এই উত্তর পরীক্ষা আছে packageকিছু myPath যোগ করা অধীনে PATHমধ্যে .bashrcফাইল (সঙ্গে exportclausule)। তারপরে sudo PATH=$PATH which packageসঠিক উত্তরটি খুঁজে পাবে, বিপরীত sudo which package। তবে এর sudo PATH=$PATH packageচেয়ে বেশি আর sudo packageযায় না (ফাইল পাওয়া যায় নি) go অন্যদিকে, packageশেল থেকে একটি সমতলটি চালু sudo bashকরে প্রসারিত পথ সংরক্ষণ করে এবং packageসুডো অধিকার দেয় (একটি পাথরযুক্ত দুটি কবুতর)। সুতরাং প্রতিক্রিয়াটি নির্ভর করে আপনি কোন আদেশগুলি প্রবর্তন করছেন তার উপর নির্ভর করে
জ্যাভিয়ারস্টুভ

2
সুডোর জন্য প্যাথ রেজোলিউশন হ'ল আরেকটি বিষয় - এই বিষয়টির সন্ধানে কেউ কি এই পোস্টটি সন্ধান করতে পারে আমি ইউনিক্স.স্ট্যাকেক্সেঞ্জার
কুইকশনস /

24

আপনি env_keepআহমেদ আসওয়ানীর উত্তরের দুটি বিবৃতি এই জাতীয় একক বিবৃতিতেও সংযুক্ত করতে পারেন:

Defaults env_keep += "http_proxy https_proxy"

আপনার env_keepকেবলমাত্র একটি একক আদেশের জন্য নির্দিষ্টকরণ বিবেচনা করা উচিত :

Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"


1

একটি সাধারণ মোড়ক ফাংশন (বা লুপের জন্য লাইন)

আমি একটি অনন্য সমাধান নিয়ে এসেছি কারণ:

  • sudo -E "$@" ভেরিয়েবল ফাঁস ছিল যা আমার কমান্ডের জন্য সমস্যা সৃষ্টি করেছিল
  • sudo VAR1="$VAR1" ... VAR42="$VAR42" "$@" আমার ক্ষেত্রে ছিল দীর্ঘ এবং কুরুচিপূর্ণ

demo.sh

#!/bin/bash

function sudo_exports(){
    eval sudo $(for x in $_EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) "$@"
}

# create a test script to call as sudo
echo 'echo Forty-Two is $VAR42' > sudo_test.sh
chmod +x sudo_test.sh

export VAR42="The Answer to the Ultimate Question of Life, The Universe, and Everything."

export _EXPORTS="_EXPORTS VAR1 VAR2 VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 VAR9 VAR10 VAR11 VAR12 VAR13 VAR14 VAR15 VAR16 VAR17 VAR18 VAR19 VAR20 VAR21 VAR22 VAR23 VAR24 VAR25 VAR26 VAR27 VAR28 VAR29 VAR30 VAR31 VAR32 VAR33 VAR34 VAR35 VAR36 VAR37 VAR38 VAR39 VAR40 VAR41 VAR42"

# clean function style
sudo_exports ./sudo_test.sh

# or just use the content of the function
eval sudo $(for x in $_EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) ./sudo_test.sh

ফলাফল

$ ./demo.sh
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.

কিভাবে?

বাশ বিল্টিনের একটি বৈশিষ্ট্য দ্বারা এটি সম্ভব হয়েছে printf%qএকটি শেল উদ্ধৃত পংক্তি উৎপন্ন হয়। ব্যাশ ৪.৪-এ প্যারামিটার সম্প্রসারণের বিপরীতে, এটি ব্যাশ সংস্করণ <4.0 এ কাজ করে


0

যদি আপনার কোনও স্ক্রিপ্টে পরিবেশের ভেরিয়েবলগুলি রাখার প্রয়োজন হয় আপনি আপনার কমান্ডটি এখানে একটি নথিতে রাখতে পারেন। বিশেষত যদি জিনিসগুলিকে এইভাবে পরিচ্ছন্ন দেখায় সেট করতে প্রচুর ভেরিয়েবল থাকে।

# prepare a script e.g. for running maven
runmaven=/tmp/runmaven$$
# create the script with a here document 
cat << EOF > $runmaven
#!/bin/bash
# run the maven clean with environment variables set
export ANT_HOME=/usr/share/ant
export MAKEFLAGS=-j4
mvn clean install
EOF
# make the script executable
chmod +x $runmaven
# run it
sudo $runmaven
# remove it or comment out to keep
rm $runmaven
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.