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"'
-pSeçeneği sukomutu ortam değişkenleri korumak.
-pseçeneğidirsusudo
-mDeğişkeni koruduğunu söyleyen başka konular var , diğeri -cise 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 -iveya komutunu çalıştırın sudo -l. Kök hesabı etkinleştirdiyseniz, sutek başına da çalışabilirsiniz , ancak sudo subu kullanışsızdır. Ve evet, her yerde gördüğünü biliyorum.
Yani, söz konusu sudovardır -Ekullanı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 -cdeğ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_keepde 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_PRELOADve 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 sukullanabildiğimiz gibi , kısmı görmezden geleceğim .--usersudo
Çevre değişkenlerini bir commandkoş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 sudobir 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?