Ketika saya menggunakan perintah apa pun dengan sudo, variabel lingkungan tidak ada. Misalnya setelah mengatur HTTP_PROXY, perintah tersebut wget
berfungsi dengan baik tanpa sudo
. Namun jika saya mengetiknya sudo wget
dikatakan tidak bisa melewati pengaturan proxy.
linux
environment-variables
sudo
Ahmed Aswani
sumber
sumber
Jawaban:
Pertama, Anda perlu
export HTTP_PROXY
. Kedua, Anda perlu membacaman sudo
dengan cermat, dan memperhatikan-E
benderanya. Ini bekerja:Ini kutipan dari halaman manual:
sumber
LC_*
variabel apa pun . Jadi lakukan sajaexport LOL_FOO=$LC_FOO
dan gunakanLOL_FOO
saja.PATH
dalam.bashrc
file - katakanlahexport PATH=myPath:$PATH
,. Jika saya mengetiksudo -E bash -c 'echo $PATH'
, makaPATH
tidak mengandung myPath mungkin karenasudo
telah menonaktifkan nilai lokalPATH
sebelum memanggilbash
. Sebaliknya, saya menemukan jawaban di bawah ini stackoverflow.com/a/33183620/5459638 efektif, yaitusudo PATH=$PATH command
Caranya adalah dengan menambahkan variabel lingkungan ke
sudoers
file melaluisudo visudo
perintah dan tambahkan baris ini:diambil dari ArchLinux wiki .
Untuk Ubuntu 14, Anda perlu menentukan dalam baris terpisah karena mengembalikan kesalahan untuk baris multi-variabel:
sumber
sudo -E
adalah cara yang pasti-api untuk adhoc mendapatkan efek yang sama untuk satu-off, meskipunetc/sudoers
secara langsung. Sebagai gantinya, gunakanvisudo
perintah, yang memeriksa sintaks Anda sebelum menimpasudoers
file. Dengan begitu, Anda tidak mengunci diri jika Anda melakukan kesalahan saat mengedit.Untuk variabel individual yang ingin Anda sediakan satu per satu, Anda dapat menjadikannya bagian dari perintah.
sumber
package
beberapa myPath di bawah ditambahkan kePATH
dalam.bashrc
file (denganexport
klausul). Kemudiansudo PATH=$PATH which package
temukan jawaban yang benar, tidak sepertisudo which package
. Namun,sudo PATH=$PATH package
tidak melangkah lebih jauh darisudo package
(file tidak ditemukan). Di sisi lain, meluncurkan dataranpackage
dari shell yang digunakan untuksudo bash
mempertahankan jalur yang panjang dan memberikanpackage
hak sudo (dua merpati dengan satu batu). Jadi responsnya sangat tergantung pada perintah mana yang Anda luncurkanAnda juga dapat menggabungkan dua
env_keep
pernyataan dalam jawaban Ahmed Aswani menjadi satu pernyataan seperti ini:Defaults env_keep += "http_proxy https_proxy"
Anda juga harus mempertimbangkan
env_keep
untuk menentukan hanya satu perintah seperti ini:Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
sumber
Fungsi pembungkus sederhana (atau in-line untuk loop)
Saya datang dengan solusi unik karena:
sudo -E "$@"
bocor variabel yang menyebabkan masalah untuk perintah sayasudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
panjang dan jelek dalam kasus sayadem. sh
Hasil
Bagaimana?
Ini dimungkinkan oleh fitur bash builtin
printf
. The%q
menghasilkan shell string dikutip. Berbeda dengan ekspansi parameter di bash 4.4 , ini bekerja di versi bash <4.0sumber
Jika Anda memiliki kebutuhan untuk menjaga variabel lingkungan dalam skrip Anda dapat menempatkan perintah Anda dalam dokumen di sini seperti ini. Terutama jika Anda memiliki banyak variabel untuk mengatur hal-hal terlihat rapi dengan cara ini.
sumber