Temelde bunu yapmam gerekiyor:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Bu işe yaramıyor. $ DUMMY env değişkenini suya nasıl aktarabilirim? -p ile -l çalışmıyor.
Temelde bunu yapmam gerekiyor:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Bu işe yaramıyor. $ DUMMY env değişkenini suya nasıl aktarabilirim? -p ile -l çalışmıyor.
Yanıtlar:
Giriş kabuğu çağırmadan bunu yapabilirsiniz:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
veya:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
-p
Seçeneği su
komutu ortam değişkenleri korumak.
-p
seçeneğidirsu
sudo
-m
Değişkeni koruduğunu söyleyen başka konular var , diğeri -c
ise farkın ne olduğunu söylüyor ? Ve bu cevaptaki yorumlardan biri -E
stackoverflow.com/questions/10488758/…
Profesyonel ipucu: Kaçmak için gerçekten iyi bir neden yoktursudo su
. Bir komutu farklı bir kullanıcı olarak çalıştırmak için kullanın sudo -u username command
. Kök kabuğu istiyorsanız, sudo -i
veya komutunu çalıştırın sudo -l
. Kök hesabı etkinleştirdiyseniz, su
tek başına da çalışabilirsiniz , ancak sudo su
bu kullanışsızdır. Ve evet, her yerde gördüğünü biliyorum.
Yani, söz konusu sudo
vardır -E
kullanıcı oturumunun çevreyi koruyacak anahtarı:
-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.
Bu nedenle, önce değişkeninizi dışa aktarmanız ve sonra çalıştırmanız gerekir sudo -E
:
$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
Gerekli bash -c
değildir. Ancak, çalıştırırsam sudo -Eu bob echo "$DUMMY"
, değişken kök kabuğunun çalıştırılmasından önce genişletilir, böylece komutun gerçekten çalıştığını göstermez:
$ sudo -u bob echo $DUMMY ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY' ## works as expected
D:dummy
env_keep
de sudoers
. Belki de bu gibi: Defaults env_keep += "DUMMY"
.
sudo
. Ayrıca tek bir değişken için daha hantaldır. Bu sadece her zaman ihraç edilmesi gereken bir şey için kullanışlıdır.
LD_PRELOAD
ve taşıma arasında önemli bir fark var LESSCHARDEF
.
-E, işi benim için yapıyor. Adamdan sudo
-
-E
, Kullanıcının mevcut ortam değişkenlerini önceden hizmet etmek istediği güvenlik politikasını belirtir. Kullanıcı çevreyi koruma iznine sahip değilse, güvenlik politikası hata verebilir.--preserve-env
Aşağıdaki, güvenlik politikasını değiştirmek için bir tane gerektirmeyen bir çözümdür.
Seçeneğini su
kullanabildiğimiz gibi , kısmı görmezden geleceğim .--user
sudo
Çevre değişkenlerini bir command
koşuya geçmek istiyoruz sudo
. Ancak sudo
, ortam değişkenlerinin bir komuta geçirilmesine izin vermeyecektir (bunun için geçerli bir güvenlik nedeni vardır, bazı değişkenler tehlikeli olabilir). Ortam değişkenlerini ayarlamak için sudo
bir kabuk kullanılabilir ve kendisine iletilen bir komut dosyasıyla bir kabuk çalıştırabilir. Bu nedenle sudo
, ortam değişkenlerini ayarlayan bir komut dosyası çalıştırmasını söyleyin .
var_a=someThing
var_b=someOtherThing
sudo bash -c "
export var_a=\"${var_a}\"
export var_b=\"${var_b}\"
the_command some_args
"
sudo -iu ec2-user echo $DUMMY
?