2012-12-02 18 views
6

Bir sudo komutu için bash process substitution kullanmak istiyorum. ÖrneğinBir sudo komutu için bash process substitution kullanma

, burada olmayan bir sudo benim için çalışıyor komut var:

$ cat <(echo "installed.txt") 
installed.txt 

Ve burada çalışmıyor emir komuta sudo sürümü:

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

sudo adam sayfasını Okuma Sudo, komutu root olarak çalıştırmadan önce stdin/stdout/stderr dosya tanımlayıcılarını kapatır. Bu, bash'un sudo komutunu çalıştırmadan önce betiğin tanımlayıcısını (ve işlem değiştirmeyi gerçekleştirmesini) sağladığını düşünmeme yol açar.

Kökün kabuğunu bash olarak değiştirdim (sh varsayılanı yerine). Kök olarak oturum açıldığında komutun düzgün çalıştığını test ettim. Sadece sudo komutuyla çalışmaz.

Burada yapmaya çalıştığım şeyi elde etmek için uygun teknik nedir? Değerlendirin, teklif, sudo bayrağı, sudoers dosya modu, diğer?

cevap

6

Dene:

$ sudo bash -c 'cat <(echo "installed.txt for UID=$UID")' 
installed.txt for UID=0 
0

En iyi yaklaşım muhtemelen her şeyi bir komut dosyasına koymak ve bu betiği sudo ile çalıştırmaktır. senin kabuğunda bunu

+0

Her şey bir teklidir; Bunu yapmaktan kaçınmak isterim. –

+1

@ClaytonStanley Sonra diğer (çok iyi) cevaplarda verilen çözümleri kullanın ... –

3
sudo bash -c 'cat <(echo "installed.txt")' 
+1

Bu kabul edilen cevap da, ama en erken gönderme değildi. –

+0

İkimiz de aynı anda çirkin yazıyorduk! Hepsini kazanamazsın. Dahası, _I_ hepsini kazanamaz! Bir satır yazmak için – emrys57

+0

3 dakika? Huh! =) –

4

soruda açıklandığı davranış sudo tasarımı kaynaklanmaktadır. sudo standart girdi, çıktı ve hata hariç dosya tanımlayıcıları kapatan varsayılan bir davranışa sahip olduğu

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

hata oluşur. Adam sayfada açıklandığı gibi: Varsayılan olarak

bir komutu yürütürken, sudo standart girdi, standart çıktı ve standart hata dışındaki tüm açık dosya tanımlayıcıları kapanacak.

Bu davranış

dosyalar kapalı olmamalı, altında dosya tanıtıcı numarasını belirtmek için -C (veya --close-from) seçeneğiyle geçersiz kılınabilir. Ancak, bu seçeneğin kullanılması, bir yönetici tarafından izin verilmelidir: Aşağıdaki ihtiyaçlar /etc/sudoers yerde önüne aldığımızda

Defaults closefrom_override 

eklenecek komut -C kullanılması durumunda çalışacaktır:

$ sudo -C64 cat <(echo "installed.txt") 
installed.txt 

(Burada 64 numarası verildi, çünkü hata mesajında ​​63'dan daha büyüktü).

İlgili konular