ortam değişkeni sudo su'ya nasıl geçirilir


Yanıtlar:


39

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.


3
Bence "-E" çevre değişkenlerini koruyor sudo.ws/man/sudo.man.html
Andy

1
@Andy Ama sudo konfigürasyonu tarafından genellikle yasaktır.
Gilles 'SO- kötülük'

@cuonglm - teşekkürler. Bu çalışıyor. Giriş kabuğu çağırmamalıydı.
Umang

1
@ kenorb: Hayır, bu durumda değil -pseçeneğidirsusudo
cuonglm

-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/…
Vishrant

49

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

2
Bir ortam değişkeni korumak için daha iyi bir yolu eklemek için env_keepde sudoers. Belki de bu gibi: Defaults env_keep += "DUMMY".
lcd047

@ lcd047, ancak tüm çağrıları için çevreyi koruyacaktır 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.
terdon

Evet, bu bir takas, ancak tüm çevre değişkenleri eşit derecede zararlı değildir. Taşıma LD_PRELOADve taşıma arasında önemli bir fark var LESSCHARDEF.
Kolaylığın

1
@ lcd047 öneriniz kesinlikle bir cevap olarak göndermeye değer. Demek istediğim, isteğe bağlı değişkenleri dışa aktarmanın pratik olmadığı. Evet, her zaman dışa aktarılmasını istediğiniz belirli bir değişken varsa, bu şekilde yapılır, ancak bunu bir kez yapmak ve aynı oturumda tanımlanmış bir değişken için yapmak istemezsiniz.
terdon

7

-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


Maalesef, yalnızca yöneticiniz sizi -E kullanmasını kısıtlamadıysa işi yapar.
Torsten,

0

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
"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.