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ü?
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ü?
Bunu yapamayacağınız şey basit ve iki kat
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.
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.
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.
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:
(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.
Yukarıdaki tüm cevaplar doğrudur; işte bir çözüm olsa da
sudo sh -c "cd restricted-dir; some_command"
Ayrıca izni geçici olarak da değiştirebilirsiniz. chmod 0775 yolu. Gerekirse geri koyduğundan emin ol.