Yanıtlar:
sudo su -
karmaşık bir yazma yöntemi olan sudo -i
el 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 sudo
harici bir komuttur; kabuk betiğinin kendisinde ayrıcalıkları yükseltmenin bir yolu yoktur, yalnızca sudo
ek 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 bash
yerine sudo su -
ya sudo -i
) ve (ile aracılığıyla bu değişkenleri bildirmek için sudo yapılandırılması Defaults !env_reset
veya Defaults env_keep=…
içinde sudoers
dosyası). 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: <<EOF
burada 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ı whoami
bir dize değil, bir kabuk kodu haline gelir. Örneğin, whoami
komut 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 env
kabuk 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/profile
ve hedef kullanıcının ~/.profile
okunması gerekiyorsa, bunları açıkça okumalı veya bash --login
yerine çağırmalısınız sh
.
Bu, işlev başlattığınız kabukta log_f
bildirilmediğ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 sudo
de su
gerek 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 EOF
ve varisler kendilerini.
Benim durumumda bir dizi geçmek gerekiyordu ve bazı sorun vardı, ama bir süre sonra dizinin değerlerini bir env
anahtara 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[@]};
...