Fonksiyonu ve değişkenleri sudo su'ya iletme - <user> << EOF


9

Ben bash / ksh fonksiyonları ve değişkenleri ilan ettim ve bunları içine iletmek gerekir sudo su - {user} << EOF:

#!/bin/bash

log_f() {
echo "LOG line: $@"
}

extVAR="yourName"

sudo su - <user> << EOF
  intVAR=$(date)
  log_f ${intVAR} ${extVAR}
EOF

Yanıtlar:


4

sudo su -karmaşık bir yazma yöntemi olan sudo -iel değmemiş bir ortam oluşturur. Bir giriş kabuğunun noktası budur. Bir düz bile sudoçoğu değişkeni ortamdan kaldırır. Ayrıca sudoharici bir komuttur; kabuk betiğinin kendisinde ayrıcalıkları yükseltmenin bir yolu yoktur, yalnızca sudoek ayrıcalıklarla harici bir program ( ) çalıştırmaktır ve bu da kabuk kabuğunda (yani dışa aktarılmamış değişkenler) ve üst kabukta tanımlanan işlevlerin çocuk kabuğu.

Sen değil (bir giriş kabuğu çağırarak içinden ortam değişkenleri geçebilir sudo bashyerine sudo su -ya sudo -i) ve (ile aracılığıyla bu değişkenleri bildirmek için sudo yapılandırılması Defaults !env_resetveya Defaults env_keep=…içinde sudoersdosyası). Bu işlevler için size yardımcı olmaz (bash bir işlev verme özelliğine sahip olmasına rağmen, sudo bunu engeller).

Çocuk kabuğundaki işlevlerinizi almanın normal yolu onları orada tanımlamak olacaktır. Alıntıya dikkat edin: <<EOFburada belge için kullanıyorsanız, burada belgenin içeriği ilk olarak ana kabuk tarafından genişletilir ve bu genişletmenin sonucu alt kabuğun gördüğü komut dosyası olur. Yani, yazarsan

sudo -u "$target_user" -i <<EOF
echo "$(whoami)"
EOF

bu, hedef kullanıcının değil, orijinal kullanıcının adını görüntüler. Genişlemenin bu ilk aşamasından kaçınmak için, <<operatörden sonra bu belgeyi belirtin :

sudo -u "$target_user" -i <<'EOF'
echo "$(whoami)"
EOF

Dolayısıyla, verileri ana kabuktan alt kabuğa geçirmeniz gerekmiyorsa, burada alıntılanmış bir belge kullanabilirsiniz:

#!/bin/bash
sudo -u "$target_user" -i  <<'EOF'
log_f() {
echo "LOG line: $@"
}
intVAR=$(date)
log_f "${intVAR}"
EOF

Üst kabuktan alt kabuğa veri aktarmak için burada alıntılanmamış bir belge işaretleyiciden yararlanabilmenize rağmen, bu yalnızca verilerin herhangi bir özel karakter içermemesi durumunda çalışır. Çünkü böyle bir senaryoda

sudo -u "$target_user" -i <<EOF
echo "$(whoami)"
EOF

çıktısı whoamibir dize değil, bir kabuk kodu haline gelir. Örneğin, whoamikomut döndürülürse "; rm -rf /; "true, alt kabuk komutu yürütür echo ""; rm -rf /; "true".

Üst kabuktan veri geçirmeniz gerekiyorsa, basit bir yol veriyi bağımsız değişken olarak iletmektir. Alt kabuğu açıkça çağırın ve konum parametrelerini iletin:

#!/bin/bash
extVAR="yourName"
sudo -u "$target_user" -i sh  _ "$extVAR" <<'EOF'
  log_f() {
  echo "LOG line: $@"
  }
  intVAR=$(date)
  log_f "${intVAR}" "${1}"
EOF

Geçecek birden çok değişkeniniz varsa, bunları ada göre geçirmek daha okunabilir olacaktır. Alt envkabuk için ortam değişkenlerini ayarlamak üzere açıkça çağırın .

#!/bin/bash
extVAR="yourName"
sudo -u "$target_user" -i env extVAR="$extVAR" sh <<'EOF'
  log_f() {
  echo "LOG line: $@"
  }
  intVAR=$(date)
  log_f "${intVAR}" "${1}"
EOF

Beklediğiniz /etc/profileve hedef kullanıcının ~/.profileokunması gerekiyorsa, bunları açıkça okumalı veya bash --loginyerine çağırmalısınız sh.


1

Bu, işlev başlattığınız kabukta log_fbildirilmediğinden çalışmaz sudo su -. Yerine:

extVAR="yourName"

sudo su - <user> << EOF

log_f() {
echo "LOG line: $@"
}

  intVAR=$(date)
  log_f ${intVAR} ${extVAR}
EOF

Kök alt kabuğunda tanımlanan işlevi almanız gerekir. Bunu yapabilir, ama .... Bu şeylerin çoğunun ne yaptığını bilmiyorum. En azından - ne bir şifre okumak için ne sudode sugerek kaldığı sürece - bu log_f()bildirilmelidir.

Bu değerleri bu arada kök kabuğun girdisine genişletmek istediğinizi düşünüyorum. Bunu yapmak istemiyorsanız, o zaman teklif vermelisiniz EOFve varisler kendilerini.


1

Benim durumumda bir dizi geçmek gerekiyordu ve bazı sorun vardı, ama bir süre sonra dizinin değerlerini bir envanahtara yansıtarak ve istenen kodu sararak bash -c '<intended code>'ve temelde diziyi yeniden oluşturmasını sağlayarak başarılı oldu INNER_KEY=($<env_key>).

Sınav için:

#!/usr/bin/env bash
PLUGINS=(foo bar baz)
sudo -u <some-user> -i env PLUGINS="`echo ${PLUGINS[@]}`" sh <<'EOF'
  bash -c '
    FOO=($PLUGINS);
    echo values: \[${FOO[@]}\];

    for pl in ${FOO[@]};
      do echo value: $pl;
    done;
  '
EOF

Sorun, doğrudan aşağıdaki gibi bir şey yapamamdı (kullanmıyordu bash -c '...'):

FOO=($PLUGINS);
for pl in ${FOO[@]};
...
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.