Komutlar için sudo su mu kullanıyorsunuz?


15

Dün gece komut satırı becerilerimi geliştirmek için çalışıyordum ve sudo kullandığımda 'izin verilmedi' şeklinde bir hata mesajı aldım. Ancak 'sudo su' kullandığımda ve root olduğumda komut çalıştı.

Sudo neden ilk etapta çalışmadı?

Öyleydi:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

LAMP sunucusu kurma bölümündeki Linux Bible 2010 sürümünden.


Bir örnek vermezseniz, sorunu çözmek biraz zor olabilir.
LassePoulsen

1
Düşünün sudo -süzerinde sudo su.
Jeremy L

Yanıtlar:


18

<,> Ve >>, komutlar için giriş / çıkış yeniden yönlendirmesi için kullanılır - kabuk tarafından sağlanan bir özelliktir (örn. Bash). Dolayısıyla, böyle bir komut yazarsanız sudo cat > /var/www/info.php, bunu giriş olarak alan kabuk dosyayı açmaya çalışır /var/www/info.phpve bu dosyayı sudokomuta standart çıktı olarak sağlar . sudoÇağırır onu bu kabuk tarafından halledilir nedeniyle çıkış, bir konsola gidiş veya bir dosyaya yönlendirilmiş olup olmadığı komut farkında bile değildir.

Komutunuzu yazdığınız kabuk, oturum açma kabuğunuz veya kullanıcı kimliğinizle bir terminalde çalışan başka bir kabuksa, kullanıcı kimliğinizle aynı ayrıcalıklara sahiptir - kök ile değil.

Yani sizin durumunuzda, cat komutu root olarak yürütülürken, çıktısının kopyalanması /var/www/info.phpnormal bir kullanıcı olarak çalışan kabuk tarafından kopyalanır , bu da beklendiği gibi başarısız olur.

Bu gibi durumlar için bir geçici çözüm teekomutu kullanmaktır :

sudo tee /var/www/info.php

Bu, konsola girilen tüm metni ^ D'ye kadar parametre olarak belirtilen dosyaya koymak gibi bir etki yaratacaktır.

Belki de israf edilebilir bir yan etki, teeçıktıyı stdout'a da yansıtacaktır , bu nedenle her satırı yazıp enter tuşuna bastıktan teesonra geri bir kopyası çıkarır . Bundan kaçınmak için aşağıdaki varyantı kullanabilirsiniz.

sudo tee /var/www/info.php > /dev/null

İlgili ayrıntılar teearacılığıyla bulunabilmektedir info teebir terminal de.


2

sudo, dosya yazma izni olan komutlar için çalışmaz, örneğin:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

Sudo el kitabında açıklıyor.


4
Bir kök istemi almak için "sudo -i" veya "sudo -s" yapabileceğinizden bahsetmek bu cevabı daha da iyi hale getirecektir!
Jorge Castro

Örnek komutunda dikey çizgi yoktur; bir yönlendirme var. Ayrıca, "bazen işe yaramaz" lapa lapa davranışını iletiyor gibi görünmektedir sudo. Koushik'in cevabında belirtildiği gibi, davranış unix izin modeli için oldukça öngörülebilir, tutarlı ve "doğrudur".
msw

2

Sorun sudo komutu çalıştırılmadan çok önce "> foo.txt" bölümünün komut yorumlayıcı (kabuk) tarafından yorumlanması ve yürütülmesi . Sudo komutunun çıktısını bir dosyaya yeniden yönlendirmek istediğiniz hakkında hiçbir fikri yoktur.

Komut yorumlayıcınızın kök yetkisi yok (ancak sudo komutu eninde sonunda olacak), bu nedenle çıktıyı foo.txt'ye yönlendiremiyor.


1

Bunu çözmenin başka bir yolu, sudo ile bir alt kabuk başlatmak ve bu alt kabukta bu komutu yürütmektir:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

burada, "sudo olan" komut bash'tır ve içinde çalıştırılan her şeyin kök izinleri vardır.

$ 2c, * turna

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.