İlk komutta && ve sudo kullanılırken, ikinci komut da sudo olarak mı çalışıyor?


64

Bir komut çalıştırırsam.

sudo some-command && some-other-command

İkinci komut da sudoprevilege ile çalıştırılıyor mu?

Yanıtlar:


110

TL; DR: NO


İlk komut

sudo some-command

İkinci komut

some-other-command

Komut sudoaşağıdaki komutu alır ve yükseltilmiş ayrıcalıklarla çalıştırır. &&Ancak, bir komuta ait olmayan ve ilk komut çalıştırmadan önce, kabuk tarafından yorumlanır. Bash'a önce ilk komutu yerine getirmeyi ve başarıda ikinciyi söyler.

Yani bu sudokonuda bilmiyor && some-other command. Yükseltilmiş işlem sona erdiğinde, bash dönüş değerini alır ve ardından birinciyi bilmeyen diğer komutu yerine getirir.

Bu kolayca gösterilebilir:

$ sudo whoami && whoami
root
username

İstediklerinize ulaşmak için, yükseltilmiş bir bash başlatabilir ve her iki komutu yerine getirmesine izin verebilirsiniz:

$ sudo bash -c 'whoami && whoami'
root
root

Şimdi, her iki komut da yukarıda tanımlanmış olan tüm işlem yükseltilmiş bir işlemde yürütüldüğü için root olarak yürütülür, yani bash oturumu bitince hemen ardından çıkan bu komutla başlar. Yine de, ikisi de whoamibirbirlerinin varlığını bilmiyor.

Bu herhangi bir amaç için uygun değil, ancak bu gösteri için, kolay yolu basitçe yapmaktır

sudo some-command && sudo some-other-command

29
whoamiÖrnek için +1 .
Carl H


Bu gösteri gerçekten harika! Bir dahaki sefere başkalarına sudo öğretmeye çalışırken bunu düşünmeliyim!
Parçalanma,

20

Hayır. Bunu yapan bazı örnekler:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

ya da yuva komutları istiyorsanız, şunları bile yapabilirsiniz:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • İkinci bir başka kabuk kullanır.
  • 'Veya "2. sürümde kullandığınızda, bu komutların komutlarında veya parametrelerinde (yani. \' Veya \") bunlardan kaçmanız gerektiğine dikkat edin, böylece çok hızlı bir şekilde karmaşık olabilir.

Üçüncü yöntem işe yaramıyor: $ sudo -s -- whoami && whoamiverirroot username
BartekChom

@BartekChom üzgünüm o konuda teklifleri kaçırdım
Rinzwind

sudo -s -- "whoami && whoami"komutun bulunamadığı, az ya da çok komutla aynı komutu verdiği görülüyor "whoami && whoami". Bu inşaat && ile nasıl kullanılır? Bunun sudo -s cd ..aksine hata yapmadığını görüyorum sudo cd ...
BartekChom

Yeni bugün bir şey öğrendim: sudo bash <<"EOF"! Teşekkürler! :-)
Fabby

4

Hayır, ya iki kez sudo yazmalısınız ya da böyle bir şey yapmalısınız.

sudo bash -c 'foo && bar'

2

&&diye baskı olan sağ taraflı (ikinci) komutu yalnızca çalışacağı anlamına gelir (ilk) komutu başarılı yani çıkış kodudur $?olduğunu 0.

İki komut birbirinden farklıdır ve kendi ortamlarında çalışacaktır, böylece ikinci komut sudoayrıcalıklara sahip olmayacaktır .

Bu sizi açıklığa kavuşturur:

$ sudo whoami && whoami 
root
foobar

1

HAYIR ve aşağıdakiler bir zamanlar çok yaygın olarak makrodur.

sudo reboot && exit

Hemen hemen herkes bunu en az bir kere yapmalıydı.

sudo apt-get update && sudo apt-get upgrade

Bu yüzden harika bir "mickey mouse" röportaj sorusu.

Bu o kadar kolay bir şekilde test edilir ki, sorunun bir stat padding egzersizinden şüphelenilebileceği düşünülür.


0

Komut satırında, gördüğünüzde

$ command one && command two

tipik amaç, yalnızca ilk komut başarılı olduğunda && izleyen komutu yerine getirmektir.

Diğer komut da sudo olarak mı çalışıyor?

kesinlikle hayır, bu sadece iki ardışık komut yazmak gibi, bu da bir komuta hiçbir ayrıcalık vermez. Bu sadece bir ayırıcı .

Bunu kanıtlamak için bir örnek verelim.

touch fileA fileB 

İki dosya fileA ve fileB oluşturdum. Şimdi komutu çalıştıracağım

sudo chown test:test fileA && chown test:test fileB

Bu dosyaların kullanıcı ve grup sahibini kullanıcı ve grup adı testine çeviriyorum. Şimdi ilk komut ne olur peki ya diğeri?

Çıktı:

chown: changing ownership of `fileB': Operation not permitted

Bu yüzden komut ihtiyaç duyduğu sudoiçin çalışmadı ve ikinci bir ikame olmadığına karar verelim.sudo

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.