Neden "sudo cd / var / named 'çalışmıyor? [çift]

147

cd dizinine /var/named yapmak istiyorum ancak bana izin verilmeyen bir hata veriyor ve bunu yapmak için sudo kullanmak istediğimde izin verilmiyor. Bunun teknik sebebi nedir ve bunu başka bir şekilde yapmak mümkün mü?

    
sordu Hojat Taheri 06.05.2013 21:02

5 cevap

205

Bunu yapamayacağınız şey basit ve iki kat

1

cd bir program değil, yerleşik bir komut ve sudo yalnızca programlar için geçerlidir.

sudo foo , programın root olarak çalıştırılması anlamına gelir

sudo cd /path döndürüyor

sudo: cd: command not found

cd bir program olmadığı için.

2

Korunan bir dizine sudo parametresini cd olarak kullanmak mümkün olsaydı, sudo cd /var/named komutunu çalıştırmanız normal bir kullanıcı olarak bu dizinde olurdu ancak normal kullanıcılar izin vermiyordu. o dizinde ol.

Bu mümkün değil.

Çözüm:

Kendinizi süper kullanıcıya yükseltmek için sudo -i kullanabilirsiniz. Örneğin:

sudo -i
cd /var/named 

Artık kök olarak oturum açtınız ve istediğiniz komutları kullanabilirsiniz. % Co_de% yazın ve normal kullanıcı olarak oturum açmaya geri döndünüz.

    
verilen cevap Warren Hill 06.05.2013 21:30
25

Bunun nedeni cd dosyasının bir yürütülebilir olmamasıdır, dizini değiştirmek için bir kabuk işlevidir.

Çalışıyorsanız:

type cd

senin olsun:

  

cd bir kabuk işlevidir

Etkileşimli bir kabuk açmak için sudo -s 'yi ve ardından cd ' i istediğiniz dizine ekleyebilirsiniz:

sudo -s
cd /var/named

Normal kabuğunuza geri dönmek için Ctrl + D tuşlarına basın.

    
verilen cevap Basharat Sialvi 06.05.2013 21:29
16

Ayrıca, cd 'sinin kabuk yerleşik veya harici bir ikili olarak statüsüne rağmen sudo, belirtilen komutu çalıştırmak için yeni bir işlem oluşturarak çalışır. .

Bu neden önemlidir? Çünkü sudo'nun temel yürütme akışı buna çok benziyor:

  1. Kabuk, verilen parametrelerle sudo çalıştırmak için bir alt işlemden çıktı
  2. sudo, kullanıcının kimliğini doğrular ve belirtilen komutu yürütme haklarını onaylar
  3. sudo, belirtilen komutu yürütmek için bir alt işlemi kapatır
  4. sudo, çıkmak için 3. adımda ortaya çıkan alt işlemin beklemesini bekler
  5. sudo çıkar, kabuğa geri dönme
  6. Alt işlem, 1. adımda çıktı ve kullanıcıyı kabuk istemine geri gönderir

(Bu teknik olarak biraz hatalı olabilir, aslında yeni bir işlemle çalışan bir sistem çağrısı var. C kütüphanesinin execve() 'si. Ancak, bu açıklamanın amaçları açısından, ikisi eşdeğerdir.)

Geçerli çalışma dizininin her bir işlemin bir özelliği olduğunu ve devralınan, ancak tanıtılmayan olduğunu düşündüğünüzde bu önem kazanır. Eğer A prosesi yeni bir süreç B ortaya çıkarsa, B prosesi A'nın işlediği aynı çalışma dizini ile başlar. (Bu yüzden, ls ./ gibi sıradan bir şey beklediğiniz gibi yapar.) Fakat eğer B süreci değişirse onun çalışma dizini, daha sonra A süreci bu şekilde seyir halinde kalmazsa, A bu değişikliğin tamamen farkında değildir. (Bu, sonuç olarak, find / gibi bir şeyi çalıştırırsanız ve yarı yarıya düşürürseniz, dosya sisteminde şu an rastlantısal bir konumda bitmezsiniz. iptal edildi.)

Yani sudo cd /somewhere , teneke üzerinde tam olarak yazdığı şeyi yapsa bile, sudo çıkışından itibaren, başladığınız yere geri getirilirsiniz. Bu nedenle, kullanıcı açısından etkin olarak, bir op-op haline gelir. Çalışırken cd , yeni bir çalışma dizini belirlemek için chdir() sistem kitaplığı işlevi denir, kullanıcı size yardımcı olmaz.

Warren Hill işaret ettiği gibi uygun çözüm (aslında Bu bir geçici çözüm), dosya sisteminde serbestçe gezinebileceğiniz ve istediğiniz gibi komutları çalıştırabileceğiniz bir kök kabuğuna düşen sudo -i kullanmaktır. Ancak, bu kabuktan çıktığınızda, yukarıda anlattığım gibi tam olarak aynı hiyerarşide başladığınız yer olan hala olduğunuzu unutmayın.

    
verilen cevap Michael Kjörling 07.05.2013 09:27
12

Yukarıdaki tüm cevaplar doğrudur; işte bir çözüm olsa da

sudo sh -c "cd restricted-dir; some_command"
    
verilen cevap Tagar 07.11.2015 07:00
3

Ayrıca izni geçici olarak da değiştirebilirsiniz. chmod 0775 yolu. Gerekirse geri koyduğundan emin ol.

    
verilen cevap Andres Abello 07.11.2016 18:14

Etiketlerdeki diğer soruları oku