Saat menggunakan && dan sudo pada perintah pertama, apakah perintah kedua juga dijalankan sebagai sudo?

64

Jika saya menjalankan perintah.

sudo some-command && some-other-command

Apakah perintah kedua dijalankan dengan sudoprevilege juga?

pengguna974407
sumber

Jawaban:

110

TL; DR: TIDAK


Perintah pertama adalah

sudo some-command

Perintah kedua adalah

some-other-command

Perintah sudomengambil perintah berikut dan mengeksekusinya dengan hak istimewa yang ditinggikan. The &&, bagaimanapun, bukan milik perintah dan ditafsirkan oleh shell, sebelum mengeksekusi perintah pertama. Ini memberitahu bash untuk terlebih dahulu menjalankan perintah pertama, dan pada keberhasilan yang kedua.

Jadi sudotidak tahu tentang && some-other command. Ketika proses yang ditinggikan berakhir, bash mengambil nilai baliknya, dan kemudian menjalankan perintah lainnya, yang lagi-lagi tidak mengetahui yang pertama.

Ini dapat ditunjukkan dengan mudah:

$ sudo whoami && whoami
root
username

Untuk mencapai yang Anda inginkan, Anda bisa memulai bash yang ditinggikan, dan biarkan menjalankan kedua perintah:

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

Jadi sekarang, kedua perintah dieksekusi sebagai root, karena seluruh proses yang dijelaskan di atas dieksekusi dalam proses yang ditinggikan, yaitu sesi bash dimulai dengan perintah ini, yang segera keluar setelah selesai. Namun, keduanya whoamitidak tahu keberadaan satu sama lain.

Ini tidak sesuai dengan tujuan apa pun tetapi untuk demonstrasi ini, cara yang lebih mudah adalah dengan melakukannya

sudo some-command && sudo some-other-command
s3lph
sumber
29
+1 sebagai whoamicontoh.
Carl H
Demonstrasi ini sangat keren! Harus dipikir-pikir ketika mencoba mengajar sudo kepada orang lain waktu berikutnya!
Diperlukan Fragmentasi
20

Tidak. Beberapa contoh yang melakukan ini adalah:

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

atau jika Anda menginginkan perintah sarang, Anda bahkan dapat melakukannya:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • Yang ke-2 menggunakan shell lain.
  • Pikiran bahwa ketika Anda menggunakan 'atau "dalam versi ke-2 Anda harus melarikan diri dari perintah atau parameter dari perintah itu (mis. \' Atau \") sehingga bisa menjadi kompleks dengan sangat cepat.
Rinzwind
sumber
Metode ketiga tidak berhasil: $ sudo -s -- whoami && whoamimemberiroot username
BartekChom
@ BartekChom maaf saya melewatkan tanda kutip untuk yang satu itu
Rinzwind
sudo -s -- "whoami && whoami"sepertinya memberi perintah tidak ditemukan, kurang lebih sama dengan perintah "whoami && whoami". Bagaimana cara menggunakan konstruksi ini dengan &&? Saya melihat bahwa sudo -s cd ..tidak ada kesalahan yang bertentangan sudo cd ...
BartekChom
Saya telah belajar sesuatu yang baru hari ini sudo bash <<"EOF":! Terima kasih! :-)
Fabby
4

Tidak, Anda harus menulis sudo dua kali, atau melakukan sesuatu seperti

sudo bash -c 'foo && bar'
davidbaumann
sumber
2

&&berarti bahwa sisi (kedua) perintah yang tepat hanya akan berjalan hanya jika jangan sampai memihak (pertama) perintah berhasil yaitu kode keluar $?adalah 0.

Kedua perintah berbeda satu sama lain dan akan berjalan di lingkungan mereka sendiri sehingga perintah kedua tidak akan berjalan memiliki sudohak istimewa.

Ini akan membuat Anda jelas:

$ sudo whoami && whoami 
root
foobar
heemayl
sumber
1

TIDAK, dan yang berikut ini sangat umum secara makro.

sudo reboot && exit

Hampir setiap orang seharusnya melakukan ini setidaknya sekali

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

Jadi itu adalah pertanyaan wawancara "mickey mouse" yang bagus.

Ini sangat mudah diuji sehingga pertanyaannya dapat diduga latihan stat padding.

mckenzm
sumber
0

Di baris perintah, ketika Anda melihat

$ command one && command two

maksud tipikalnya adalah menjalankan perintah yang mengikuti && hanya jika perintah pertama berhasil.

Apakah perintah lain berjalan sebagai sudo juga?

sama sekali tidak, ini sama seperti menulis dua perintah berturut-turut, ini && tidak memberikan hak istimewa tambahan untuk perintah. Itu hanya pemisah .

Untuk membuktikannya, mari kita ambil contoh.

touch fileA fileB 

Saya membuat dua file fileA dan fileB. Sekarang saya akan menjalankan perintah

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

Saya mengubah pemilik pengguna dan grup dari file-file ini menjadi tes nama pengguna dan grup. Sekarang perintah pertama harus dijalankan sementara bagaimana dengan yang lain?

Outputnya adalah:

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

Jadi perintah tidak berjalan karena dibutuhkan sudodan meskipun kita dapat menyimpulkan bahwa && bukan pengganti yang keduasudo

Maythux
sumber