Budo'da yeniden yönlendirme ile sudo kullanırken “izin reddedildi” nasıl çözülür?

115

Düzenlemelere izin vermek için sudo kullanıldığında, düzenli olarak 'izin reddedildi'.

Örneğin, farem sarsıntılı ve yavaş, bu yüzden yoklamayı devre dışı bırakmak istiyorum:

sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf

Bir şifre sordum ve sonra şunu al:

bash: /etc/modprobe.d/local.conf: Permission denied

Bu nedenle, aşağıdakileri kullanarak yoklamayı devre dışı bırakmak için geçici bir değişiklik yapmaya çalıştım:

sudo echo N> /sys/module/drm_kms_helper/parameters/poll

Yine sistem yine de:

bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied

Herhangi bir fikrin var mı?

    
sordu Jack 19.12.2012 05:12

6 cevap

124

Çıktı yönlendirmesi ( > işleci aracılığıyla) echo tarafından değil, kabuk tarafından yapılır. Root olarak giriş yapmalısınız

sudo -i

Sonra yeniden yönlendirmeyi kullanabilirsiniz

echo N> /sys/module/drm_kms_helper/parameters/poll

Aksi halde, bash dizesini sudo ile çalıştırabilirsiniz

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"
    
verilen cevap shantanu 19.12.2012 05:22
71

Çıkış yönlendirmesi, komutunun çalıştırıldığı kabuğuna göre yapılır. Yani, her şeyi parçalara ayırmak, burada neler oluyor *:

  • shell, sudo echo "options drm_kms_helper poll=N" komutunu sudo komut satırı ile yürüten echo "options drm_kms_helper poll=N" dosyasını çağırıyor

  • sudo bir şifre ister, superuser kabuğunu açar ve echo "options drm_kms_helper poll=N" komutunu echo komutunu çalıştıran "options drm_kms_helper poll=N" dosyasını çağırır

  • echo, root ayrıcalıklarıyla çalışarak dizeyi standart çıktısına yazdırır.

  • echo komutu sonlanıyor, süper kullanıcı kabuğu çıkışı, sudo sonlanıyor

  • , komutun çağrıldığı kabuk çıktıyı toplar ve yalnızca% root tarafından yazılabilir% co_de dosyasına yönlendirmeye çalışır. "İzin reddedildi" hatası alıyor.

Bunu düzeltmenin yolları için bkz. @shantanu answer.

(*) - yukarıdaki dizinin, komutun neden başarısız olduğunu anlamasına yardımcı olurken, gerçekte işler biraz düzensizleşir: orijinal kabuk yönlendirmeyi fark eder ve /etc/modprobe.d/local.conf dosyasını çağırmadan önce dosyayı açmak için yazmaya çalışır. komut. Dosya açıldığında, kabuk dosyaya yazması gereken komutu bile çağırmaz (bunu belirtmek için @PanosRontogiannis'e teşekkürler).

İşte hızlı bir test:

$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied

Yukarıdaki testte sudo ... , "root" kelimesini içeren whoami | tee who.txt adlı bir dosya oluşturacaktı. Ancak, çağıran kabukta çıkış yönlendirmesi başarısız olduğunda, komut çalıştırılmadığı için "who.txt" dosyası da eksik.

    
verilen cevap Sergey 19.12.2012 06:19
55

Shantanu'nun yanıtına ekleme:

... Ya da şöyle bir tee komutunu kullanabilirsiniz:

sudo tee /sys/module/drm_kms_helper/parameters/poll <<<10

veya bir komutunun çıkışı:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll
    
verilen cevap Untitled 19.12.2012 07:50
13

Burada değindiğim bir yaklaşım, tüm komut satırını kendi kabuğunda yürütmek. % Co_de% manpage'in kendisi bu yaklaşımın bir örneğini vermektedir:

  

/ home bölümünde dizinlerin kullanım listesini yapmak. Bunun, cd ve dosya yeniden yönlendirmesi yapmak için alt kabuktaki komutları çalıştırdığını unutmayın.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
    
verilen cevap kojiro 19.12.2012 14:53
3

sudo dd of=

İstediğiniz şekilde eklemek için:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

veya dosyayı sıfırdan yeniden oluşturun:

echo inbytes | sudo dd of=outfile

Avantajları:

  • tee yönlendirme olmadığından /dev/null 'den daha iyi
  • açık bir alt kabuktan (ancak yeniden yönlendirme için örtülü olanı) beri sh 'den daha iyi
  • dd , birçok güçlü seçeneğe sahiptir, ör. Aktarım ilerlemesini görmek için status=progress

İşler, çünkü sudo, komutada stdin var.

    
2

Başka bir seçenek geçici bir dosya kullanmaktır. Bu bir bash komut dosyasında kullanışlıdır.

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever
    
verilen cevap user545424 29.07.2014 17:51

Etiketlerdeki diğer soruları oku